ifram下文档的处理方法

2024-10-03 11:16:58 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我现在测试的门户,我遇到了一个问题:我不能创建任何xpath定位器,过了一段时间后,我发现这是因为一个“#文档”,这会切断路径并使简单的“copy 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:

^{pr2}$

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

所以我想问一下,有没有更好的解决办法?更聪明/更快的东西?在

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

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

谢谢你!在


Tags: 代码文档路径id元素门户html时间
2条回答

嵌入式框架

根据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...>和{}标记。因此,内容很重要,尽管被一些浏览器忽略了。

  • 因此,总而言之,内联框架并不意味着包含特性,尽管有时它可能有类似的用途。

  • 请注意,当使用内联框架时,浏览器(如果它支持它们)会向iframe元素中的URL所引用的服务器发送一个请求,在获得请求的文档后,它将在内联框架中显示。从这个意义上说,内联框架是一个联合浏览器-服务器问题,但只有浏览器需要明确地知道iframe;从服务器的角度来看,对文档只有一个普通的HTTP请求,它发送文档时不需要(或不需要)知道浏览器将如何处理文档。


更聪明的东西

根据最佳实践在切换到iframe时,您需要归纳WebDriverWait,如下所示:

  • 切换到帧名称(Java示例代码):

    new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.name("frame_name")));
    
  • 切换到iframeXPath(Python示例代码):

    WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='ptifrmtgtframe' and @name='TargetContent']")))
    
  • 切换到iframeiframeCssSelector(C#示例代码):

    ^{4美元

参考文献

您可以在以下位置找到一些相关讨论:


tl;dr

Inline frames vs. normal frames

要使用iframe内的元素,必须切换到这个特定的iframe。在

您的解决方案.switchTo().frame("FRAMENAME");是正确的。Selenium没有任何其他方法来处理iframe包装。在

相关问题 更多 >