iframe下#document的处理方式

IT技术 javascript selenium selenium-webdriver iframe protractor
2020-12-31 16:44:45

对于我现在正在测试的门户,我遇到了无法创建任何 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。

谢谢!

2个回答

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

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

内嵌框架

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


iframe 结构和细节

  • 通常,iframe 元素的形式为:

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

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

  • 请注意,当使用内联框架时,浏览器(如果支持它们)会向URLiframe 元素中的引用的服务器发送请求,并在获取请求的文档后将其显示在内联框架内。从这个意义上说,内联框架是浏览器-服务器的联合问题,但只有浏览器需要专门识别 iframe;从服务器的角度来看,只有一个对文档的普通 HTTP 请求,它发送文档而没有(或不需要)任何关于浏览器将要做什么的想法。


更聪明的东西

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

  • 通过帧名称切换(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; 博士

内联框架与普通框架