是否有一种解决方法可以避免在硒测试中使用iframe?

时间:2018-03-26 13:21:21

标签: python selenium iframe

我正在使用python-selenium测试具有互连iframe的复杂和非公开网页。

要正确点击按钮或选择其他iframe中的某个给定元素,我必须切换到该iframe。现在,由于页面的内容可能会重新加载到正确的iframe,我不断检查是否加载了正确的iframe,否则我必须回到默认内容,再次检查等。

我发现硒的这种完全令人烦恼和用户不友好的行为。

是否有基本的解决方法可以找到,例如任何iframe中的元素?因为我不关心iframe。我关心元素......

2 个答案:

答案 0 :(得分:1)

不幸的是,不,没有办法解决这个问题。

对于上下文,这可能不仅仅是Selenium的限制,而是WebDriver规范以及最终的现代浏览器。 Selenium仅实现了WebDriver规范,而后者又受到现代浏览器所暴露的功能的限制。浏览器可能有充分的理由阻止你这样做。

您认为单个页面实际上包含多个文档

  1. root 文档,您在浏览器chrome中看到的网址和标题,以及
  2. 一个或多个嵌入式(或)文档,<iframe>元素实际上只是一种“挂载点”。
  3. 虽然能够透明地遍历文档边界(就像人们可能遍历文件系统挂载点一样容易)的实用程序很明显,但浏览器可能有理由阻止它。

    我怀疑,其中最重要的是阻止跨站点脚本(XSS)攻击。也就是说,仅仅因为浏览器用户具有查看嵌入文档的能力,并不意味着父文档中的脚本应该能够“看到”它。允许从父母到孩子的遍历(通过例如find_element_by_xpath)可能需要这样做。

    (我想,另一个原因是大多数现代浏览器在一个单独的进程中隔离每个文档,在各自的DOM中进行遍历实现的功能要复杂得多。)

    使用capybara-py

    减轻负担

    鉴于必须切换上下文以搜索其他文档中的元素并与之交互,您可以通过采用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不会帮助你,但是你可以根据自己的需要编写辅助方法来减轻痛苦