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 顶部的向左向上箭头,如下所示。
一旦我们点击并将箭头指到 Iframe 1 下面的 Selenium - Automation Practice Form 时,它的 HTML 代码就可见了,显示文本 Selenium- Automation Practice Form 在 iframe 标记名中。
文本 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.
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 的总数。
代码实现
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();
}
}