NightwatchJS:Safari 找不到嵌套的 iFrame

NightwatchJS: Safari can't find nested iFrame

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

我在 nightwatch 回购上有一个 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, more details about config, setup and code are in the GitHub issue

问题要点:

问题在于,要访问嵌套的 iFrame,需要先找到 #top-frame 网页元素,使用返回的网页元素并将其传递给 frame,从而使 WebDriver 调用更改上下文该帧的测试会话。这对 Chrome、FF 和 Safari 都很好,因为它们都可以找到此框架 Web 元素并切换到框架上下文。我对 Safari 正在更改 iFrame 上下文的测试(虽然不确定它有多好)是尝试找到另一个 DOM 元素而不是嵌套框架,它可以找到。使用 Safari 时出现问题,在切换到 #top-frame 后,它无法从 HTTP 调用中找到 #nested-frame 网络元素,而 Nightwatch returns 是 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 存在并且内容按预期加载。没有控制台错误指示任何内容加载失败。

这让我很困惑,我不知道如何进一步调试。也许有新观点的其他人可以提出建议,或者如果有人 运行 遇到与此类似的情况。由于有关该主题的信息也很有限,因此将其扔到宇宙中,因此也许这可以帮助其他人。 TIA!

iframe

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


iframe 结构和详细信息

通常,iframe 元素的形式为:

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

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


这个用例

因为 top-level <iframe>src="about:blank" 所以极不可能有任何 child <iframe>.因此,在没有任何 child <iframe> 的情况下,您尝试访问任何嵌套的 <iframe> 将失败。


参考

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

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

我已向 Apple 提交工单 here