iframe下#document的处理方式

Ale*_*dre 8 javascript iframe selenium selenium-webdriver protractor

对于我现在正在测试的门户,我遇到了无法创建任何 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>
Run Code Online (Sandbox Code Playgroud)

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

driver.switchTo().frame("FRAMENAME");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢!

Deb*_*anB 6

内联框架

\n\n

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

\n\n
\n\n

iframe结构和细节

\n\n
    \n
  • 一般来说,iframe元素的形式如下:

    \n\n
    <iframe src="URL" more attributes>\nalternative content for browsers which do not\nsupport iframe\n</iframe>\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 支持 iframe 的浏览器在子窗口中显示 URL 引用的文档,通常带有垂直和/或水平滚动条。此类浏览器会忽略 iframe 元素的内容(即开始标记<iframe...>和结束标记之间的所有内容</iframe>)。不支持 iframe(或禁用了此类支持)的浏览器则执行相反的操作,即像处理 iframe 一样处理<iframe...>内容</iframe>不存在一样。因此,尽管某些浏览器会忽略内容,但内容很重要。

  • \n
  • 总而言之,内联框架并不意味着包含功能,尽管它有时可能具有类似的目的。

  • \n
  • 请注意,当使用内联框架时,浏览器(如果支持它们)会向由URLiframe 元素中引用的服务器发送请求,并在获取请求的文档后将其显示在内联框架内。从这个意义上说,内联框架是浏览器-服务器的共同问题,但只有浏览器需要专门感知 iframe;从服务器的角度来看,这只是一个针对文档的普通 HTTP 请求,并且它会发送文档,而无需(或不需要)知道浏览器将如何处理该文档。

  • \n
\n\n
\n\n

更聪明的东西

\n\n

根据切换到iframe时的最佳实践,您需要引发WebDriverWait按如下方式

\n\n
    \n
  • 通过框架名称切换(Java 示例代码):

    \n\n
    new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
  • 通过iframe XPath切换(Python 示例代码):

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

    \n\n
    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n
\n\n

参考

\n\n

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

\n\n\n\n
\n\n

TL; 博士

\n\n

内联框架与普通框架

\n


Ole*_*sii 5

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

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