python - Selenium ( python ): can't switch to iframe (name is dynamically generated)

标签 python selenium 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

确实需要一些帮助...

最佳答案

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

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

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

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

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

现在您可以访问 iframe 中的元素了。如果您在 iframe 中操作元素然后退出 iframe,我不建议您使用此方法。您的更改将会丢失。仅当您从该 iframe 中抓取信息时,这才有效,而在操作其中的元素时则无效。找到 iframe 元素并切换到它通常更好、更安全。

关于python - Selenium ( python ): can't switch to iframe (name is dynamically generated),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28689285/

相关文章:

python - 自定义 buildbot 步骤类 - 如何使用 remoteCommand/remoteShellCommand 制作自己的步骤类

java - 将 webelement 转换为字符串 Selenium

java - Selenium web自动化,获取特定的HTML元素

javascript - 如何记录 Apache Cordova 应用程序中加载的 iframe 的 http 响应?

python - 将数据分组到 30 分钟的 bin 中

python - 在一个 Flask 响应中返回一个下载和呈现的页面

java - 如何从没有 id 的 html 中读取元素?

javascript - 如何在组件中嵌入 JSX 脚本?

javascript - 域保护的 iframe

python - python中itertools.izip的反函数是什么?