在iframe下处理#document的方法

时间:2018-11-08 07:54:37

标签: javascript selenium selenium-webdriver iframe 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>

我发现此问题的解决方案是,只需添加一个switchTo即可:

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

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

所以我想问一下,对此是否有更好的解决方案?更聪明/更快的东西?

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

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

您的解决方案.switchTo().frame("FRAMENAME");是正确的。 Selenium没有其他使用iframe包装程序的方式。

答案 1 :(得分:1)

嵌入式框架

根据Using inline frames中的文档,内联框架是一种结构,它将文档嵌入到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>标签一样处理内容。因此,尽管某些浏览器忽略了内容,但内容仍然很重要。

  • 总而言之,内联框架并不意味着具有 include功能,尽管有时它可能具有相似的用途。

  • 请注意,使用嵌入式框架时,浏览器(如果支持)会向iframe元素中的URL所引用的服务器发送请求,并在显示请求的文档后显示放在嵌入式框架中。从这个意义上讲,内联框架是浏览器-服务器的共同问题,但是只有浏览器才需要特别了解iframe;从服务器的角度来看,只有一个正常的HTTP请求用于文档,并且它发送文档时不需要(也不需要任何关于浏览器将如何处理它的想法)。


更聪明的东西

根据最佳做法,同时切换到 iframe 时,您需要按以下步骤诱导 WebDriverWait

  • 切换框架名称(Java示例代码):

    new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));
    

参考

您可以在Is it possible to switch to an element in a frame without using driver.switchTo().frame(“frameName”) in Selenium Webdriver Java?

中找到详细的讨论

tl;博士

Inline frames vs. normal frames