Java: 使用 Selenium 自动进行浏览器测试
1. 概述
现在大部分企业都依赖于网站和 web 应用,许多组织都在线上运营。由于与最终用户和客户连接,网站及 web 应用必须在所有流行的浏览器、浏览器版本后操作系统中完美运行。
虽说手动测试也可以完成既定测试目的,不过自动化测试在测试速度和效率方面是更好的选择。Selenium 等自动化测试工具允许企业运行自动化浏览器测试,使他们能够更快地交付高质量的网站和 web 应用。
本文中,我们将学习如何使用 Selenium 进行自动化浏览器测试。
2. Selenium 是什么?
Selenium 是一款用于自动化浏览器测试的开源工具。它提供了多个功能,诸如跨浏览器测试、支持多种编程语言、平台独立性和庞大的社区等
最近推出的 Selenium Manager 提供了自动化浏览器和驱动管理,允许开发者和测试者无缝运行 Selenium 测试而无需操心下载及安装驱动和浏览器。
3. 为什么选择使用 Selenium 进行浏览器自动化测试?
以下是选择使用 Selenium 的几个主要原因:
- Selenium 是一款免费开源的工具,提供了经济高效的 web 自动化测试方案。
- 支持多种编程语言,诸如 Java、Python、JavaScript、C#、Ruby 和 PHP。
- Selenium 使得开发团队可以在不同浏览器(如 Chrome、Firefox、Edge 和 Safari)上测试他们的网站及 web 应用。
- 它有一个庞大的、活跃的社区,可提供扩展性支持及资源。
4. 如何使用 Selenium 实现浏览器自动化测试?
根据使用 Selenium 编写测试自动化脚本所选择的编程语言,我们需要遵循一些先决条件、设置和执行过程。
4.1. 前置要求
使用 Selenium 进行浏览器自动化测试有一些前置要求:
- 下载及安装 Java JDK
- 安装 IntelliJ 或 Eclipse IDE
- 下载必要的 Maven 编译工具
我们不会下载浏览器,因为测试会在云端测试平台(如 LambdaTest)上进行。这是一个 AI 驱动的测试执行平台,使得开发者和测试者可以使用 Selenium 在超过 3000+ 个真实浏览器、浏览器版本和操作系统上进行大规模自动化测试。
4.2. 设置及配置
首先在 pom.xml
文件中添加 Selenium WebDriver 依赖和 TestNG 依赖:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.25.0</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.10.2</version>
<scope>test</scope>
</dependency>
由于我们将在 LambdaTest 平台上运行测试,我们需要为平台、浏览器和浏览器版本添加某些功能。为此,让我们使用 LambdaTest 自动化能力生成器。
让我们创建一个 BaseTest.java
类来添加其中的所有配置细节:
public class BaseTest {
private static final ThreadLocal<RemoteWebDriver> DRIVER =
new ThreadLocal<>();
//...
}
BaseTest
类中的 ThreadLocal
实例是为了使线程安全,因为我们将并发运行测试。它同时可以保证每个线程都有自己的 RemoteWebDriver
实例,实现流畅的并发测试执行。
接下来,getDriver()
和 setDriver()
方法将使用 ThreadLocal
实例获取及设置 RemoteWebDriver
实例。我们使用 getLtOptions()
方法设置 LambdaTest 自动化能力:
public RemoteWebDriver getDriver() {
return DRIVER.get();
}
private void setDriver(RemoteWebDriver remoteWebDriver) {
DRIVER.set(remoteWebDriver);
}
private HashMap<String, Object> getLtOptions() {
HashMap<String, Object> ltOptions = new HashMap<>();
ltOptions.put("project", "ECommerce playground website");
ltOptions.put("build", "LambdaTest Ecommerce Website tests");
ltOptions.put("name", "Automated Browser Testing");
ltOptions.put("w3c", true);
ltOptions.put("visual", true);
ltOptions.put("plugin", "java-testNG");
return ltOptions;
}
使用 getLtOptions()
方法,我们将设置项目、编译和测试名称,并在 LambdaTest 云环境中启用 java testNG 插件。接下来,我们将添加
getChromeOptions()
方法,该方法将持有 Chrome 浏览器的功能,并返回 ChromeOptions
。
同样,getFirefoxOptions()
方法接受 browserVersion
和 platform
作为参数,设置其自己的功能,并返回 FirefoxOptions
。
在 BaseTest
类中,我们将使用 setup()
方法设置 Selenium WebDriver,以便在 Chrome 和 Firefox 上运行自动测试。@BeforeTest
注解确保该方法在任何测试之前运行,而 @Parameters
在运行时从 testng.xml
文件传入浏览器、浏览器版本和平台参数值。这有助于在 Chrome 和 Firefox 上并行运行跨浏览器测试:
if (browser.equalsIgnoreCase("chrome")) {
try {
setDriver(new RemoteWebDriver(new URL("http://" + userName + ":" + accessKey + gridUrl),
getChromeOptions(browserVersion, platform)));
} catch (final MalformedURLException e) {
throw new Error("Could not start the Chrome browser on the LambdaTest cloud grid");
}
} else if (browser.equalsIgnoreCase("firefox")) {
try {
setDriver(new RemoteWebDriver(new URL("http://" + userName + ":" + accessKey + gridUrl),
getFirefoxOptions(browserVersion, platform)));
} catch (final MalformedURLException e) {
throw new Error("Could not start the Firefox browser on the LambdaTest cloud grid");
}
}
要连接到 LambdaTest 云网格,我们需要有 LambdaTest 用户名、访问密钥和网格 URL。我们可以从我们的 Account Settings > Password & Security 中轻松找到 LambdaTest 的用户名和访问密钥。
之后,我们将编写处理浏览器并启动其各自会话的代码。
4.3. 测试场景
让我们使用以下测试场景来演示在 LambdaTest 平台上使用 Selenium 进行的自动浏览器测试。
- 导航到 LambdaTest eCommerce Playground 网站。
- 定位并点击主页上的 Shop by Category 目录。
- 定位并点击 MP3 Players 目录。
- 断言该页面显示页面标题 MP3 Players。
4.4. 测试实现
让我们创建一个 AutomatedBrowserTest.java
类,为测试场景编写测试自动化脚本。该类继承了 BaseTest
类,以实现代码重用和模块化。
然后,我们将在实现测试场景的 AutomatedBrowserTest
类中创建 whenUserNavigatesToMp3PlayersPage_thenPageHeaderShouldBeCorrectlyDisplayed()
方法:
@Test
public void whenUserNavigatesToMp3PlayersPage_thenPageHeaderShouldBeCorrectlyDisplayed() {
getDriver().get("https://ecommerce-playground.lambdatest.io/");
HomePage homePage = new HomePage(getDriver());
homePage.openShopByCategoryMenu();
Mp3PlayersPage mp3PlayersPage = homePage.navigateToMp3PlayersPage();
assertEquals(mp3PlayersPage.pageHeader(), "MP3 Players");
}
我们使用了 Selenium WebDriver 页面对象模式,这有助于提高代码的可读性和可维护性。HomePage
类包含 LambdaTest eCommerce Playground 网站主页的所有页面对象。
openShopByCategoryMenu()
方法使用 Selenium 的 linkText
定位器策略定位 “Shop By Category” 菜单,并点击它。此 MP3 Players 菜单使用 CSS 选择器 #widget-navbar-217841>ul>li:nth-child(5)>a
定位。然后,navigateToMP3PlayersPage()
方法定位 MP3 Players 页面,点击它,并返回 MP3PlayersPage
类的新实例。
MP3PlayersPage
类包含 MP3 Player 页面的所有对象:
public class Mp3PlayersPage {
private WebDriver driver;
public Mp3PlayersPage(WebDriver driver) {
this.driver = driver;
}
public String pageHeader() {
return driver.findElement(By.cssSelector(".content-title h1"))
.getText();
}
}
4.5. 测试执行
让我们创建一个新的 testng.xml
文件来并行运行测试。此文件配置 TestNG 在 Windows 10 上的 Chrome 和 Firefo x上运行自动化浏览器测试。
现在,让我们运行测试并访问 LambdaTest Web Automation 仪表板来检查测试执行结果。
以下是在 Chrome 浏览器上执行测试的快照:
以下是 Firefox 浏览器测试执行的快照:
我们可以找到测试的所有详细信息,包括浏览器名称、版本、平台和测试执行日志,以及视频记录和屏幕截图。
5. 小结
总之,自动化浏览器测试在快速测试网站和 web 应用方面起着至关重要的作用。使用 Selenium,测试人员可以同时高效地运行多个测试,从而获得更快的反馈。这种方法不仅有助于及早发现问题,还能确保软件保持稳定。
GitHub 源码:https://github.com/eugenp/tutorials/tree/master/testing-modules/selenium-3