一尘不染

在iframe下处理#document的方法

selenium

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

谢谢!


阅读 2183

收藏
2020-06-26

共1个答案

一尘不染

内联框架

根据使用内联框架中的文档,联框架是一种将文档嵌入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...>and </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; 博士

内联框架与普通框架

2020-06-26