对于我现在正在测试的门户网站,我遇到了一个问题,即我无法创建任何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。
谢谢!
答案 0 :(得分:1)
要使用iframe
中的元素,必须切换到特定的iframe
。
您的解决方案.switchTo().frame("FRAMENAME");
是正确的。 Selenium没有其他使用iframe
包装程序的方式。
答案 1 :(得分:1)
根据Using inline frames中的文档,内联框架是一种结构,它将文档嵌入到HTML文档中,以便嵌入的数据显示在浏览器窗口的子窗口中。这并不意味着完全包含并且两个文档是独立的,并且它们都被视为完整文档,而不是将一个文档视为另一个文档的一部分。
通常,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")));