Selenium(python):无法切换到iframe(名称是动态生成的)

我在选择iframe并访问其中的不同元素时遇到问题 . iframe名称是动态生成的(例如,frame11424758092173或frame0005809321或frame32138092173) . 问题是,无论我做什么,Selenium都找不到iframe ....

切换到最近的帧不起作用:

iframe = driver.find_elements_by_tag_name('iframe')[0]
driver.switch_to_frame(iframe)

等待帧会出现超时异常:

try:
        iframe = WebDriverWait(driver, 5).until(EC.frame_to_be_available_and_switch_to_it(By.TAG_NAME('iframe')))
    except:
        logger.error(traceback.format_exc())

以下代码行也超时:

try:
        iframe = WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.TAG_NAME, u"iframe")))
        driver.switch_to_frame(iframe)
    except:
        logger.error(traceback.format_exc())

我也试过迭代帧但它找不到它 . 返回的列表为空

iframes = driver.find_elements_by_tag_name('iframe')
#iframes is empty

真的需要一些帮助......

回答(1)

2 years ago

您是否尝试过使用XPath定位iframe并使用contains方法?:

iframe = driver.find_element_by_xpath('//iframe[contains(@name, "frame")]')
driver.switch_to_frame(iframe)

现在,您可以访问iframe中的元素 .

要退出iframe,请使用:

driver.switch_to_default_content()

contains方法允许您通过部分属性值获取元素 . 对动态生成的ID,名称等非常有用 . 您也可以使用XPath搜索其他属性 . 例如,假设您的iframe元素具有属性 value = "3" . 你可以使用:

iframe = driver.find_element_by_xpath('//iframe[contains(@name, "frame")][@value = "3"]')
driver.switch_to_frame(iframe)

此方法也可以与任意数量的属性一起使用 .

您也可以尝试通过其选择器获取元素 . 请记住,这限制了您可以使用它做的事情:

driver.execute_script('document.querySelector("INSERT SELECTOR HERE").doSomething();')

要获得Selector和/或XPath,您将需要使用浏览器来检查元素(在我的情况下为Chrome) . 右键单击元素 . 单击“检查” . 然后右键单击HTML元素并单击“复制”>“复制Xpath”或“复制”>“复制选择器” .

如果这对我不起作用,我最后的办法就是去iframe的网址 . 为此,你需要右键点击存在iframe的网页区域,然后点击 View Frame Source . 然后它将引导您进入新页面 . 在 view-source: 之后,该页面的网址将显示在浏览器的顶部 . 然后,您只需导航到该网址:

driver.get('insert url of iframe here')

现在您可以访问iframe中的元素 . 如果您在iframe中操作元素然后退出iframe,我不建议使用此方法 . 您的更改将会丢失 . 这只有在你从iframe中删除信息时才有效,而不是在你操纵其中的元素时 . 找到iframe元素并切换到它通常会更好,更安全 .