【问题标题】:Ways to deal with #document under iframeiframe下处理#document的方法
【发布时间】:2019-04-11 16:57:15
【问题描述】:

对于我现在正在测试的门户,我遇到了无法创建任何 xpath 定位器的问题,一段时间后我发现这是因为“#document”,这会切断路径并使简单“复制 xpath”将路径指向完全不同的元素。

<iframe id="FRAMENAME" src="/webclient/workspace/launch-task/REMbl?ds=BP" width="100%" height="100%" frameborder="0" data-navitemname="navitemname" style="" xpath="1">
#document
    <html>
        CODE....
    </html>

我找到了解决方案,只需像这样添加一个 switchTo:

driver.switchTo().frame("FRAMENAME");

这可以正常工作并使其余代码正常工作,但是需要一些额外的时间来处理此命令,直到代码移动到下一行。

所以我想问一下,有没有更好的解决方案?更智能/更快的东西?

我担心当我有很多脚本的时候,执行时间会太长。

例如,我不使用 id 定位器,因为它们都是动态的,所以有时需要 xpath。

谢谢!

【问题讨论】:

  • 这是访问&lt;iframe&gt; 内元素的唯一方法。您可以将代码发布到code review,也许有人会看到您可以改进的地方。
  • 您好,感谢您的回答,门户不是我们开发的,因此很难更改代码,我们正在开发一个工具来处理这个问题,这个测试的目的是检查信息已正确导入。其余的测试代码运行得很快,唯一的一点是速度变慢了,但无论如何我会在那里发布以防万一。谢谢!
  • 我建议您在此处发布代码,而不是在网站上发布 :)。转换需要多少时间,我从来没有监禁过它。
  • 啊,好吧,呵呵,这取决于屏幕,但我会说每次切换需要 4 到 6 秒,所以在我需要与不同帧交互的测试用例中,这会增加执行时间,目前这不是什么大问题,但将来可能需要太长时间。感谢您的帮助!

标签: javascript selenium selenium-webdriver iframe protractor


【解决方案1】:

要使用iframe 中的元素,您必须切换到这个特定的iframe

您的解决方案.switchTo().frame("FRAMENAME"); 是正确的。 Selenium 没有任何其他方法可以使用 iframe 包装器。

【讨论】:

    【解决方案2】:

    内嵌框架

    根据Using inline frames 中的文档,内联框架是将文档嵌入到 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; 标签不存在一样。因此,尽管被某些浏览器忽略,但内容很重要。

    • 总而言之,内联框架并不意味着包含功能,尽管它有时可能会起到类似的作用。

    • 1234563一个内联框架。从这个意义上说,内联框架是一个联合浏览器-服务器问题,但只有浏览器需要专门识别 iframe;从服务器的角度来看,这只是一个对文档的普通 HTTP 请求,它发送文档而不知道(或不需要)浏览器将要做什么。

    更智能的东西

    根据 最佳实践,在切换到 iframe 时,您需要如下诱导 WebDriverWait

    • 切换Frame Name(Java 示例代码):

      new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));
      
    • 切换 iframe XPath(Python 示例代码):

      WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='ptifrmtgtframe' and @name='TargetContent']")))
      
    • 通过iframe切换CssSelector(C#示例代码):

      new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));
      

    参考

    您可以在以下位置找到一些相关讨论:


    tl;博士

    Inline frames vs. normal frames

    【讨论】:

      猜你喜欢
      • 2011-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-04
      • 1970-01-01
      相关资源
      最近更新 更多