Selenium 简明教程

Selenium WebDriver - Handling IFrames

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

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

Identification of IFrames on a Web Page

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

selenium handling iframes 1

一旦我们点击并将箭头指到 Iframe 1 下面的 Selenium - Automation Practice Form 时,它的 HTML 代码就可见了,显示文本 Selenium- Automation Practice Form 在 iframe 标记名中。

selenium handling iframes 2

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

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

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

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

Basic Methods to Handle IFrames in Selenium

下面列出了处理 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 切换到主网页。

Example 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://www.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();
   }
}

Output

Text is: Selenium - Automation Practice Form

Process finished with exit code 0

在上面的示例中,我们已经识别出网页上可用的 iframe 标记,然后将驱动程序上下文从主页切换到该 iframe。实现之后,我们已经通过控制台中的消息 - Text is: Selenium - Automation Practice Form ,访问了该 iframe 中可用的文本。

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

因此,我们能够识别出网页内的 iframe。与此同时,我们已经实现了如何借助 Selenium webdriver 提供的 switchTo 方法将驱动程序上下从主页切换到 iframe。

Example 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://www.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();
   }
}

Output

Total iframes: 2

在上面的示例中,我们通过控制台中的消息 - Total iframes: 2 计算了页面上 iframe 的总数。

Conclusion

这就总结了我们对 Selenium Webdriver 处理 IFrames 教程的全面见解。我们从描述网页上 iframe 的识别开始,阐述了在 Selenium 中处理 iframe 的基本方法,并通过示例介绍了如何使用 Selenium Webdriver 处理 iframe。这将为你提供 Selenium Webdriver 处理 IFrames 的深入知识。明智的做法是不断实践你所学到的知识,并探索其他与 Selenium 相关的知识,以加深你的理解并拓展你的视野。