• Selenium Video Tutorials

Selenium WebDriver - 处理IFrames



Selenium Webdriver 可用于处理网页上的 iframe。iframe(称为内联框架)基本上是 HTML 5 中包含的 html 标签。一个iframe 标签用于在另一个HTML文档中包含 HTML 文档。

HTML 中的 frame 和 iframe 标签之间存在细微差别。frame 标签可以将网页垂直和水平方向分割,而 iframe 标签用于在另一个 HTML 文档中包含 HTML 文档。但是,从 HTML 5 版本开始,不再使用 frame 概念。

网页上 iframe 的识别

打开 Chrome 浏览器,右键单击网页,然后单击“检查”按钮。然后,整个页面的完整 HTML 代码现在就可以访问了。要调查页面上的 iframe,请单击左侧向上的箭头,该箭头位于可见 HTML 的顶部,如下所示。

Selenium Handling IFrames 1

一旦我们单击并将箭头指向Selenium - Automation Practice Form(在Iframe 1下方),其 HTML 代码就可见了,显示了文本Selenium- Automation Practice Form位于 iframe 标签名内的事实。

Selenium Handling IFrames 2

并且文本Selenium- Automation Practice Form出现在标题标签内(称为“h1”并用<>括起来)。

<h1>Selenium - Automation Practice Form</h1>

在上面的页面中,我们将获取文本Selenium - Automation Practice Form,该文本位于 iframe 内。我们观察到该文本出现在页面上的第一个 iframe 内,因此其索引将为 0。

为了访问 html 中 iframe 标签内的 web 元素,webdriver 应该能够首先找到页面内所有 iframe,然后找到它们内部的项目。为了实现上述目的,我们必须将驱动程序上下文从主浏览器切换到内部的 iframe。

在 Selenium 中处理 iframe 的基本方法

下面列出了处理 iframe 的基本重载方法:

switchTo.frame(args)

iframe 索引号作为参数传递给方法。iframe 的起始索引为 0。驱动程序切换到传递给方法的 iframe 编号。

语法

driver.switchTo.frame(0), switching to the first iframe.

switchTo.frame(args)

iframe id 或名称作为参数传递给方法。驱动程序切换到传递给方法的 iframe id 或名称。

语法

driver.switchTo.frame(“id”), switching to the 
   iframe having id or name value as id.

switchTo.frame("args")

iframe webelement 作为参数传递给方法。驱动程序切换到传递给方法的 iframe webelement。

语法

driver.switchTo.frame("id"), switching to the 
   iframe having webelement value as id.

driver.switchTo.defaultContent()

将驱动程序上下文从 iframe 切换到主网页。

示例 1

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;

public class Iframe {
   public static void main(String[] args) throws InterruptedException {
   
      //Initiate the Webdriver
      WebDriver driver = new ChromeDriver();
      
      //adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);
      
      //Opening the webpage where we will access iframes
      driver.get("https://tutorialspoint.com/selenium/practice/frames.php");
      
      //switch to an iframe with first iframe index
      driver.switchTo().frame(0) ;
      
      // identify the text inside the iframe and retrieve with getText() 
      String text = driver.findElement(By.tagName("h1")).getText() ;
      System.out.println(" Text is: " + text);
      
      //switch back the driver out of the iframe to the main page
      driver.switchTo().defaultContent();
      
      //quitting the browser
      driver.quit();
   }
}

输出

Text is: Selenium - Automation Practice Form

Process finished with exit code 0

在上面的示例中,我们已经识别了网页上可用的 iframe 标签,并将驱动程序上下文从主页面切换到该 iframe。一旦实现这一点,我们已经访问了该 iframe 内可用的文本,控制台中的消息为 - 文本为:Selenium - Automation Practice Form

最后,收到消息Process finished with exit code 0,表示代码已成功执行。

因此,我们能够在网页中识别 iframe。除此之外,我们还实现了如何使用 Selenium webdriver 中可用的 switchTo 方法将驱动程序的上下文从主页面切换到 iframe。

示例 2

让我们以以下页面为例,其中有两个 iframe。我们可以通过识别标签名为 iframe 的元素并将其与 findElements(By.tagname()) 方法一起使用,来计算网页上 iframe 的总数。这将返回页面上 iframe 的列表。最后,列表的大小将帮助我们计算 iframe 的总数。

Selenium Handling IFrames 3

代码实现

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class CountIframe {
   public static void main(String[] args) throws InterruptedException {

      //Initiate the Webdriver
      WebDriver driver = new ChromeDriver();

      //adding implicit wait of 12 secs
      driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);

      //Opening the webpage where we will access iframes
      driver.get("https://tutorialspoint.com/selenium/practice/frames.php");

      // count total iframes
      List<WebElement> f = driver.findElements(By.tagName("iframe"));
      int total = f.size();
      System.out.println("Total iframes: " + total);

      //quitting the browser
      driver.quit();
   }
}

输出

Total iframes: 2

在上面的示例中,我们已经计算了页面上 iframe 的总数,控制台中的消息为 - iframe 总数:2

结论

这总结了我们关于 Selenium Webdriver 处理 iframe 的教程的全面概述。我们从描述如何在网页上识别 iframe、Selenium 中处理 iframe 的基本方法开始,并逐步介绍了如何使用 Selenium Webdriver 处理 iframe 的示例。这使您能够深入了解 Selenium Webdriver 处理 iframe。明智的做法是不断练习您学到的知识,并探索与 Selenium 相关的其他知识,以加深您的理解并扩展您的视野。

广告