我正在使用python-selenium
测试具有互连iframe的复杂和非公开网页。
要正确点击按钮或选择其他iframe中的某个给定元素,我必须切换到该iframe。现在,由于页面的内容可能会重新加载到正确的iframe,我不断检查是否加载了正确的iframe,否则我必须回到默认内容,再次检查等。
我发现硒的这种完全令人烦恼和用户不友好的行为。
是否有基本的解决方法可以找到,例如任何iframe中的元素?因为我不关心iframe。我关心元素......
答案 0 :(得分:1)
不幸的是,不,没有办法解决这个问题。
对于上下文,这可能不仅仅是Selenium的限制,而是WebDriver规范以及最终的现代浏览器。 Selenium仅实现了WebDriver规范,而后者又受到现代浏览器所暴露的功能的限制。浏览器可能有充分的理由阻止你这样做。
您认为单个页面实际上包含多个文档:
<iframe>
元素实际上只是一种“挂载点”。虽然能够透明地遍历文档边界(就像人们可能遍历文件系统挂载点一样容易)的实用程序很明显,但浏览器可能有理由阻止它。
我怀疑,其中最重要的是阻止跨站点脚本(XSS)攻击。也就是说,仅仅因为浏览器用户具有查看嵌入文档的能力,并不意味着父文档中的脚本应该能够“看到”它。允许从父母到孩子的遍历(通过例如find_element_by_xpath
)可能需要这样做。
(我想,另一个原因是大多数现代浏览器在一个单独的进程中隔离每个文档,在各自的DOM中进行遍历实现的功能要复杂得多。)
鉴于必须切换上下文以搜索其他文档中的元素并与之交互,您可以通过采用capybara-py使自己更容易。它是Selenium之上的一个层,它提供(在许多其他方面)简单的上下文管理器,用于在帧和窗口之间切换:
from capybara.dsl import page
with page.frame("name-of-child-frame"):
page.click_link("The label of a link inside the child frame")
page.assert_text("Some text that is now expected to appear in the parent document")
答案 1 :(得分:0)
不幸的是,API是以这种方式构建的,您无法对此做任何事情。每个IFrame都是一个单独的文档,因此最终搜索每个IFrame中的对象意味着Selenium必须切换到每个IFrame并为您执行此操作。
现在,您可以通过存储IFrame路径并使用帮助程序方法在代码中自动切换到该IFrame层次结构来构建变通方法。 Selenium不会帮助你,但是你可以根据自己的需要编写辅助方法来减轻痛苦