对于我现在正在测试的门户网站,我遇到了一个问题,即我无法创建任何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。
谢谢!
根据使用内联框架中的文档,内联框架是一种将文档嵌入HTML文档中的结构,以便将 嵌入的数据显示在 浏览器窗口 的子 窗口中。这并不意味着完全包含并且两个文档是独立的,并且它们都被视为完整文档,而不是将一个文档视为另一个文档的一部分。
通常,iframe元素的形式为:
<iframe src="URL" more attributes>
alternative content for browsers which do not support iframe
支持iframe的浏览器通常在垂直和/或水平滚动条的子窗口中显示URL引用的文档。此类浏览器会忽略iframe元素的内容(即,开始标记<iframe...>和结束标记之间的所有内容</iframe>)。不支持iframe(或禁用了此类支持)的浏览器则执行相反的操作,即处理内容,就好像<iframe...>and </iframe>标记不在那里。因此,尽管某些浏览器忽略了内容,但内容仍然很重要。
<iframe...>
</iframe>
综上所述,内联框架并不意味着 包含功能 ,尽管有时可能起到类似的作用。
请注意,使用内联框架时,浏览器(如果支持)会向URLiframe元素中的引用服务器发送请求,并在获得请求的文档后将其显示在内联框架内。从这个意义上讲,内联框架是浏览器-服务器的共同问题,但是只有浏览器才需要特别了解iframe;从服务器的角度来看,只有一个正常的HTTP请求用于文档,并且它发送文档时对浏览器将如何处理该文档没有任何要求。
URL
根据切换到 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")));