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。
谢谢!
根据使用内联框架中的文档,内联框架是一种将文档嵌入到 HTML 文档中的构造,以便嵌入的数据显示在子窗口内浏览器窗口的子窗口内。这并不意味着完全包含,并且两个文档是独立的,并且它们都被视为完整的文档,而不是将一个文档视为另一个文档的一部分。
\n\n一般来说,iframe元素的形式如下:
\n\n<iframe src="URL" more attributes>\nalternative content for browsers which do not\nsupport iframe\n</iframe>\nRun Code Online (Sandbox Code Playgroud)支持 iframe 的浏览器在子窗口中显示 URL 引用的文档,通常带有垂直和/或水平滚动条。此类浏览器会忽略 iframe 元素的内容(即开始标记<iframe...>和结束标记之间的所有内容</iframe>)。不支持 iframe(或禁用了此类支持)的浏览器则执行相反的操作,即像处理 iframe 一样处理<iframe...>内容</iframe>不存在一样。因此,尽管某些浏览器会忽略内容,但内容很重要。
总而言之,内联框架并不意味着包含功能,尽管它有时可能具有类似的目的。
请注意,当使用内联框架时,浏览器(如果支持它们)会向由URLiframe 元素中引用的服务器发送请求,并在获取请求的文档后将其显示在内联框架内。从这个意义上说,内联框架是浏览器-服务器的共同问题,但只有浏览器需要专门感知 iframe;从服务器的角度来看,这只是一个针对文档的普通 HTTP 请求,并且它会发送文档,而无需(或不需要)知道浏览器将如何处理该文档。
根据切换到iframe时的最佳实践,您需要引发WebDriverWait按如下方式
\n\n通过框架名称切换(Java 示例代码):
\n\nnew WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));\nRun Code Online (Sandbox Code Playgroud)通过iframe XPath切换(Python 示例代码):
\n\nWebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id=\'ptifrmtgtframe\' and @name=\'TargetContent\']")))\nRun Code Online (Sandbox Code Playgroud)通过iframe CssSelector切换(C#示例代码):
\n\nnew WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.FrameToBeAvailableAndSwitchToIt(By.CssSelector("iframe#twitter-widget-0")));\nRun Code Online (Sandbox Code Playgroud)您可以在以下位置找到一些相关讨论:
\n\n要使用内部元素,iframe您必须切换到这个特定的iframe.
您的解决方案.switchTo().frame("FRAMENAME");是正确的。Selenium 没有任何其他方法可以使用iframe包装器。
| 归档时间: |
|
| 查看次数: |
8829 次 |
| 最近记录: |