Selenium 简明教程
Selenium WebDriver - Excel Data File
Selenium Webdriver 可用于与 Excel 数据文件交互。在自动化测试中,经常有一些要求,即通过 Excel 文件向测试用例馈送大量数据。这样做是为了验证特定场景或创建 * data driven framework* 。
Java 提供了大量的类和方法,使用 Apache POI 库对 Excel 文件执行读取和写入数据操作。Apache POI API 是免费的、开源的 * Java* 库组。
What is Apache POI?
-
Apache POI* 用于处理 Microsoft 文件。它可以用来在不同格式的文件(包括 Excel)上执行读取、写入、更新和其他操作。Java 无法直接用来处理 Excel 文件,因此 Apache POI(一个第三方 API)被用来和 Java 一同使用,以创建需要从 Excel 中获取数据的 Selenium 测试。
使用 Workbook 接口,可以通过 Apache POI 来处理 Excel 工作簿。该接口利用 WorkBookFactory 类来生成特定工作簿。HSSFWorkbook 类(实现了 Workbook 接口)具有可帮助对具有 .xls 格式的 * Microsoft Excel* 文件执行读取写入操作的方法。XSSFWorkbook 类(实现了 Workbook 接口)具有可帮助对具有 .xlsx 或 .xls 格式的 Microsoft Excel 和 OpenOffice XML 文件执行读取写入操作的方法。
同样,使用 Sheet 接口可以通过 Apache POI 来处理 Excel 工作表。HSSFSheet 类(实现了 Sheet 接口)具有可在 HSSFWorkbook 工作簿(具有 .xls 格式的 Microsoft Excel 文件)中创建工作表的方法。XSSFSheet 类(实现了 Sheet 接口)具有可在 XSSFWorkbook 工作簿(具有 .xlsx 或 .xls 格式的 Microsoft Excel 和 OpenOffice XML 文件)中创建工作表的方法。
使用 Row 接口可以通过 Apache POI 来处理 Excel 行。HSSFRow 类(实现了 Row 接口)具有表示 HSSFSheet 中行的的方法。XSSFRow 类(实现了 Row 接口)具有表示 XSSFSheet 中行的的方法。
使用 Cell 接口可以通过 Apache POI 来处理 Excel 单元格。HSSFCell 类(实现了 Row 接口)具有可以处理 HSSFRow 中单元格的方法。XSSFCell 类(实现了 Row 接口)具有可以处理 XSSFRow 中单元格的方法。
How to Install the Apache POI?
Step 1 − 从链接 Apache POI Common 向 pom.xml 文件中添加 Apache POI 通用依赖关系。
Step 2 − 从链接 Apache POI API Based 向 pom.xml 文件中添加基于 OPC 和 OOXML 模式的 Apache POI API 依赖关系。
Step 3 − 保存带有所有依赖关系的 pom.xml 并更新 * maven* 项目。
Read all Values From an Excel
我们来看一下名为 Details.xlsx 文件的 Excel 示例,我们将读取整个 Excel 文件并检索其所有值。
请注意: Details.xlsx 文件已放在 Resources 文件夹下方的项目中,如下图所示。
Example
package org.example;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ExcelRead {
public static void main(String args[]) throws IOException {
// identify location of .xlsx file
File f = new File("./Resources/Details.xlsx");
FileInputStream i = new FileInputStream(f);
// instance of XSSFWorkbook
XSSFWorkbook w = new XSSFWorkbook(i);
// create sheet in XSSFWorkbook with name Details1
XSSFSheet s = w .getSheet("Details1");
// handle total rows in XSSFSheet
int r = s.getLastRowNum() - s.getFirstRowNum();
// loop through rows
for(int k = 0; k <= r ; k++){
// get cells in each row
int c = s.getRow(k).getLastCellNum();
for(int j = 0; j < c; j++){
// get cell values
System.out.println(s.getRow(k).getCell(j).getStringCellValue());
}
}
}
}
添加到 pom.xml 的依赖关系。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SeleniumJava</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
</dependencies>
</project>
Name
Street
Ram
Street 12
Rohan
Street 110
Process finished with exit code 0
在上面的示例中,我们读取了整个 Excel 文件并在控制台中获取了所有值。
最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。
Read and Write Values in an Excel
我们来看一下名为 DetailsStudent.xlsx 文件的 Excel 示例,我们将从该 Excel 文件中读取值,并将这些数据输入到下面的注册页面中,成功之后,我们将在单元格中(在同一行和 E 列)写入文本 - Test Case: Pass 。如果没有成功执行,我们将在那同一个单元格中写入文本 - Test Case: Fail 。
下图显示了注册页面,我们将在字段 Full Name:, Last Name:, Username: 和 Password 中输入来自 DetailsStudent.xlsx 文件的数据。
Please Note − DetailsStudent.xlsx Excel 文件已放在 Resources 文件夹下方的项目中,如下图所示。
Example
package org.example;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class ExcelReadWrite {
public static void main(String args[]) throws IOException {
// identify location of .xlsx file
File f = new File("./Resources/DetailsStudent.xlsx");
FileInputStream i = new FileInputStream(f);
// instance of XSSFWorkbook
XSSFWorkbook w = new XSSFWorkbook(i);
// create sheet in XSSFWorkbook with name Details1
XSSFSheet s = w .getSheet("Details1");
// handle total rows in XSSFSheet
int r = s.getLastRowNum() - s.getFirstRowNum();
// Initiate the Webdriver
WebDriver driver = new ChromeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
// Opening the webpage where we will identify elements
driver.get("https://www.tutorialspoint.com/selenium/practice/register.php#");
//Identify elements for registration
WebElement fname = driver.findElement(By.xpath("//*[@id='firstname']"));
WebElement lname = driver.findElement(By.xpath("//*[@id='lastname']"));
WebElement uname = driver.findElement(By.xpath("//*[@id='username']"));
WebElement pass = driver.findElement(By.xpath("//*[@id='password']"));
WebElement btn = driver.findElement(By.xpath("//*[@id='signupForm']/div[5]/input"));
// loop through rows, read and enter values in form
for(int j = 1; j <= r; j++) {
fname.sendKeys(s.getRow(j).getCell(0).getStringCellValue());
lname.sendKeys(s.getRow(j).getCell(1).getStringCellValue());
uname.sendKeys(s.getRow(j).getCell(2).getStringCellValue());
pass.sendKeys(s.getRow(j).getCell(3).getStringCellValue());
// submit registration form
btn.click();
// verify form submitted
WebElement fname1 = driver.findElement(By.xpath("//*[@id='firstname']"));
String value = fname1.getAttribute("value");
// create cell at Column 4 to write values in excel
XSSFCell c = s.getRow(j).createCell(4);
// write results in excel
if (value.isEmpty()) {
c.setCellValue("Test Case: PASS");
} else {
c.setCellValue("Test Case: FAIL");
}
// complete writing value in excel
FileOutputStream o = new FileOutputStream("./Resources/DetailsStudent.xlsx");
w.write(o);
}
// closing workbook object
w.close();
// Quitting browser
driver.quit();
}
}
添加到 pom.xml 的依赖关系。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SeleniumJava</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>16</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.11.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.5</version>
</dependency>
</dependencies>
</project>
Process finished with exit code 0
在上面的示例中,我们已经读取了整个 Excel 文件,并在第五列的单元格中写入了值 Test Case: Pass 。
最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。
如上图所示,在测试基于同一 Excel 中注册数据后, Test Case: Pass 被写入 DetailsStudent.xlsx Excel 文件的第 5 列中。