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

2024-10-01 13:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我在选择iframe和访问其中的不同元素时遇到了问题。iframe名称是动态生成的(例如frame11424758092173或frame0005809321或frame32138092173)。问题是不管我做什么,硒都找不到iframe。。。。在

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

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

等待帧时发生超时异常:

^{pr2}$

以下代码行也会超时:

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

真的需要帮助。。。在


Tags: toname名称元素bytagdriver动态
1条回答
网友
1楼 · 发布于 2024-10-01 13:25:23

您是否尝试过通过其XPath定位iframe并使用contains方法?公司名称:

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

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

要退出iframe,请使用:

^{pr2}$

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();')

为了获得选择器和/或XPath,您需要使用浏览器(在我的例子中是Chrome)来检查元素。右键单击元素。单击“检查”。然后右键单击HTML元素并单击“复制”>;“复制Xpath”或“复制”>;“复制选择器”。在

如果这对我不起作用,我最后的办法就是访问iframe.到要知道,您需要右键单击iframe所在的网页区域,然后单击View Frame Source。然后它会引导你进入一个新的页面。该页面的url将显示在浏览器顶部view-source:之后。然后您可以简单地导航到该url:

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

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

相关问题 更多 >