如何使用selenium处理iFrame

根据我们的2020年开源测试状况报告,Selenium是迄今为止最受欢迎的用于Web应用程序功能测试的开源自动化框架,超过81%的受访者使用它。 尽管许多用户发现使用Selenium很容易,但是他们经常会遇到更复杂的测试场景,而这是不容易处理的。 在处理成千上万个不同Web应用程序的经验中,我们发现独自进行硒自动化的最常见挑战包括以下内容:iFrame,动态元素,悬停菜单,弹出窗口,等待和超时,浏览器变化,测试 跨选项卡/ Windows。 在本文中,我们将重点介绍iFrame,并讨论它们的含义,它们与Frame的区别以及如何使用Selenium处理iFrame。 让我们开始吧! 🎯 什么是iFrame?

iFrame是另一个网页中的网页:

使用Selenium处理iFrame并非易事。 您必须使用代码来构建声音逻辑,以选择合适的框架进行交互。 否则,Selenium将找不到您的定位器,因为它的开始位置不正确。

Frames和iFrames有什么区别?

iFrame旨在将整个网页包含在现有网页中。 框架使您可以将屏幕分成多个页面(水平和垂直),并在每个部分中显示不同的文档。 iFrame和Frames均受到同等保护。 如何识别页面上的iFrame?

使用TestProject的Smart Test Recorder,您可以轻松识别iFrame。 通过单击记录器内的“定位器”选项卡,您可以搜索元素,并且在评估元素的位置时,它还将说明该元素位于哪个iFrame中。

如下图所示,该定位器显示了网页上存在的所有iFrame,并显示了该元素所在的Frame。 Selenium方法处理iFrame

Selenium WebDriver使用switchTo()方法处理iFrame。 以下是使用Python和Java的代码示例。

在Python中

iframe = self.driver.find_element(By.XPATH, "//iframe")
self.driver.switch_to.frame(iframe)

in Java:

WebElement element = driver.findElement(By.xpath("//iframe"));
driver.switchTo().frame(element);

您还可以通过框架的索引切换到iFrame。 在Java中:

driver.switchTo().frame(0); // Index 0 for example
``
此外,您可以按ID或名称切换到iFrame,只需提供iFrame的ID或名称即可。 在Java中:

driver.switchTo().frame(“frameone”); // frameone is the ID of the iFrame

切换到iFrame之后,Selenium还提供了一种快速切换到父框架的方法:

driver.switchTo().parentFrame();

使用TestProject处理iFrame

TestProject提供了在记录的测试和编码的测试中处理iFrame的各种方法。
使用TestProject OpenSDK

使用TestProject OpenSDK(支持Java,Python和C#),切换iFrame的语法与纯Selenium相同,如上所示。 唯一的区别是从SDK本身导入的驱动程序,它扩展了Selenium功能:

import io.testproject.sdk.drivers.web.ChromeDriver;//Chrome driver for example

从SDK导入驱动程序后,语法为纯Selenium。

使用TestProject智能测试记录仪

使用TestProject智能测试记录器,您可以轻松地定位iFrame中的元素并与之交互。 在记录元素并与之交互时,记录器将自动捕获iFrame。 您可以在此窗口中看到一个iFrame:

![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture2.png)
通过与内部元素进行交互,将自动捕获它们,并在上下文菜单中列出包含它们的iFrame。
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture3.png)
该步骤将被创建,并且该步骤的菜单将打开:
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture4.png)
在“高级”选项的“上下文”下,我们将看到自动捕获的iFrame的定位器。
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture5.png)
如果iFrame的定位器发生变化,我们还可以通过按“添加上下文”按钮来编辑/添加iFrame。
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture6-1.png)
如我们所见,定位器的位置很重要,它在记录器中指示iFrame的层次结构。 在这种情况下,我们有两个iFrame:iFrameOne和iFrameTwo,其中iFrameOne在其中保存了iFrameTwo。 测试运行时,它将遍历iFrame的层次结构,并期望该元素位于称为iFrameTwo的嵌套iFrame中。 您可以通过单击箭头按钮来切换位置。
示例测试和HTML测试报告

让我们进行一个示例测试,在该测试中,我们将在iFrame中滚动,在字段中键入文本,然后将文本放在其中的元素上并进行验证。 我建议打开此示例测试以与本教程一起逐步进行介绍😉

1.滚动到iFrame:在要滚动到的元素上使用“滚动到带有JavaScript的元素”操作。
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture7.png)
2.使用“输入文字”操作在元素内输入文字:
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture8.png)
3.使用“获取文本”操作,在滚动后获取元素的文本:
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture9.png)
4.使用验证功能验证收到的文本:
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture10.png)
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture11.png)
现在我们可以执行测试,并查看实时HTML测试报告:

1.执行测试:
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture12.png)
2. 查看测试报告
![](https://blog.testproject.io/wp-content/uploads/2020/11/Picture9-1.png)
概要

使用TestProject Recorder,我们可以轻松,自动地捕获iFrame中的元素,并且当需要手动干预时,可以单击按钮添加上下文。

我们还看到,TestProject提供的OpenSDK是纯Selenium语法,因此,如果将现有框架与TestProject OpenSDK集成在一起,则除了更改驱动程序外,无需更改代码!

以下是直接链接,可授予您完全访问通过TestProject与您共享的示例测试的权限:
![](https://app.testproject.io/#/shared-tests/with-me?s_token=DVFbnoTXS0idnpS_w-Mwzg)
### author
石头 磊哥 seven 随便叫

### company

thoughtworks(离职了。。。。)

大家好,本人不才,目前依旧混迹于thoughtworks,做着一名看起来像全栈的QA,兴趣爱好前端,目前是thoughtworks 西安QA社区的leader,如果有兴趣分享话题,或者想加入tw,可以找我

### roles
QA(营生) dev(front-end dev 兴趣爱好)

### 联系方式
如果想转载或者高薪挖我 请直接联系我 哈哈
#### wechat:
 qileiwangnan
#### email:
qileilove@gmail.com