【问题标题】:NightwatchJS: Safari can't find nested iFrameNightwatchJS:Safari 找不到嵌套的 iFrame
【发布时间】:2021-11-14 00:20:25
【问题描述】:

我在使用带有 Selenium 和 SafariDriver 的 NightwatchJS 测试一段代码时遇到了困难。

我在 nightwatch repo 上有一个open issue,虽然我不确定这是否是 nightwatch 的问题还是更深层次的问题。

要测试的 HTML 内容类似于:

<body>
  <iframe id="top-iframe" src="about:blank">
    #document
      <html>
        <body>
          <container>
            <!-- access this iframe to test -->
            <iframe id="nested-iframe" src="news.google.com"></iframe>
          </container>
        </body>
      </html>
  </iframe>
</body>

需要从顶级文档访问#nested-frame 以检查内容。

测试代码使用NightwatchJS,有关配置、设置和代码的更多详细信息在GitHub issue

问题的要点:

问题是要访问嵌套的 iFrame,它需要首先找到 #top-frame web 元素,使用返回的 web 元素并将其传递给 frame,这使得 WebDriver 调用将测试会话的上下文更改为该框架.这对 Chrome、FF 和 Safari 来说都很好,因为它们都可以找到这个框架 Web 元素并切换到框架上下文。我对 Safari 正在更改 iFrame 上下文的测试(虽然不确定它有多好)是尝试找到它可以找到的嵌套框架以外的另一个 DOM 元素。使用 Safari 时出现问题,在切换到 #top-frame 后,它找不到 #nested-frame 网络元素,并且 Nightwatch 从 HTTP 调用返回 404 no such element。很奇怪吧?

这很令人费解,我最近的想法是这可能是一个跨源问题。但后来我在 WebDriver switch to frame 上阅读:

NOTE WebDriver is not bound by the same origin policy, so it is always possible to switch into child browsing contexts, even if they are different origin to the current browsing context.

我还尝试从 Safari 开发者菜单中检查 Disable Cross Origin Restrictions

如前所述,我可以在#top-frame 中找到另一个DOM 元素。我尝试了诸如 10-15 秒超时之类的事情,认为它可能需要加载。我可以用调试器检查浏览器,看到#nested-frame 在那里并且内容按预期加载。没有控制台错误表明任何内容加载失败。

这对我来说非常令人费解,我不确定如何进一步调试。也许其他有新观点的人可以提出建议,或者如果有人遇到过类似的情况。将其作为信息扔到宇宙中也仅限于该主题,因此也许这可以对其他人有所帮助。蒂亚!

【问题讨论】:

    标签: selenium selenium-webdriver iframe nightwatch.js safaridriver


    【解决方案1】:

    iframe

    根据文档iframe 是一种将文档嵌入到 HTML 文档中的构造,以便嵌入的数据显示在浏览器窗口的子窗口中。这并不意味着完全包含并且两个文档是独立的,并且它们都被视为完整的文档,而不是将一个视为另一个的一部分。


    iframe 结构及细节

    一般来说,一个 iframe 元素的形式是:

    <iframe src="URL" more attributes>
    alternative content for browsers which do not
    support iframe
    </iframe>
    

    支持 iframe 的浏览器在子窗口中显示 URL 引用的文档,通常带有垂直和/或水平滚动条。此类浏览器会忽略 iframe 元素的内容(即开始标记 &lt;iframe...&gt; 和结束标记 &lt;/iframe&gt; 之间的所有内容)。不支持 iframe(或禁用此类支持)的浏览器则相反,即处理内容,就好像 &lt;iframe...&gt;&lt;/iframe&gt; 标签不存在一样。因此,尽管被某些浏览器忽略,但内容很重要。


    这个用例

    由于顶级&lt;iframe&gt; 拥有src="about:blank",因此极不可能有任何子&lt;iframe&gt;。因此,在没有任何子 &lt;iframe&gt; 的情况下,您访问任何嵌套的 &lt;iframe&gt; 的尝试都会失败。


    参考

    您可以在以下位置找到相关的详细讨论:

    【讨论】:

    • 感谢您的回复。 src="about:blank" 可能是问题所在。问题是 Selenium 命令只是返回 not found,当它适用于 chromedriver 和 geckodriver 但不适用于 safaridriver 时,理解为什么会发生这种情况并没有帮助。我在这个线程中添加了一个答案,Selenium 团队评论说这可能是 Apple 的一个错误。我已经向他们提交了一张罚单。
    • 太棒了!!!所以我猜对了:) 很高兴能够帮助你。请accept answer 点击我的 answer 旁边的空心刻度线,它就在 votedown 箭头下方,这样刻度线就会转动绿色.
    【解决方案2】:

    discussion with Selenium team 之后,这似乎是 Apple 的一个错误。

    我已向 Apple here 提交了一张票。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-11
      • 2012-10-15
      • 2019-09-12
      • 2016-08-24
      • 1970-01-01
      • 2013-02-11
      • 2013-02-26
      • 2012-03-12
      相关资源
      最近更新 更多