1. 概述

如今几乎所有企业都依赖网站和Web应用开展业务,这些系统直接面向终端用户和客户。因此,网站和Web应用必须在所有主流浏览器、浏览器版本及操作系统上完美运行。

虽然手动测试也能完成工作,但自动化测试在速度和效率上更胜一筹。Selenium这类自动化测试工具能帮助企业执行自动化浏览器测试,从而更快地交付高质量的网站和Web应用。

本文将介绍如何使用Selenium进行自动化浏览器测试。

2. 什么是Selenium?

Selenium是一个开源工具,专门用于自动化Web浏览器测试。它具备以下优势:

  • ✅ 跨浏览器测试能力
  • ✅ 支持多种编程语言
  • ✅ 平台独立性
  • ✅ 庞大的开发者社区

最新推出的Selenium Manager实现了浏览器和驱动的自动化管理,让开发者无需手动下载安装驱动和浏览器,就能无缝运行Selenium测试。

3. 为什么选择Selenium进行自动化浏览器测试?

选择Selenium进行自动化浏览器测试的主要原因包括:

  • 免费开源:提供经济高效的Web自动化测试解决方案
  • 多语言支持:支持Java、Python、JavaScript、C#、Ruby和PHP等主流编程语言
  • 跨浏览器兼容:可在Chrome、Firefox、Edge和Safari等浏览器上测试网站和Web应用
  • 活跃社区:拥有庞大的活跃社区,提供丰富的支持资源和解决方案

4. 如何使用Selenium进行浏览器自动化?

根据所选编程语言的不同,我们需要遵循特定的前置条件、配置和执行流程。

4.1 前置条件

开始使用Selenium进行自动化浏览器测试前,需要准备:

  • ✅ 下载并安装Java JDK
  • ✅ 安装IntelliJ或Eclipse IDE
  • ✅ 配置Maven构建工具

⚠️ 我们不会在本地下载浏览器,因为测试将在LambdaTest这类云测试平台上运行。这是一个AI驱动的测试执行平台,支持在3000+真实浏览器、版本和操作系统上大规模运行Selenium自动化测试。

4.2 环境配置

pom.xml文件中添加以下依赖:

<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<>();

    //...
}

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浏览器能力,类似地getFirefoxOptions()方法接受浏览器版本和平台参数,设置对应能力并返回FirefoxOptions

BaseTest类中,使用setup()方法配置Selenium WebDriver在Chrome和Firefox上运行自动化测试。@BeforeTest注解确保方法在测试前执行,@Parameters注解从testng.xml文件动态获取浏览器、版本和平台值,实现跨浏览器并行测试:

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云网格需要用户名、访问密钥和网格URL。 这些信息可在LambdaTest控制台的Account Settings > Password & Security中找到。随后编写浏览器处理和会话启动代码。

4.3 测试场景

以下测试场景演示在LambdaTest平台使用Selenium进行自动化浏览器测试:

  1. 访问LambdaTest电子商务沙盒网站
  2. 定位并点击主页的"Shop by Category"菜单
  3. 定位并点击"MP3 Players"菜单
  4. 验证页面标题显示为"MP3 Players"

4.4 测试实现

创建AutomatedBrowserTest.java类实现测试场景。该类继承BaseTest类以实现代码复用和模块化。

AutomatedBrowserTest类中创建测试方法:

@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类封装电子商务沙盒主页的所有页面对象。

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和Firefox上执行自动化浏览器测试。

运行测试后,访问LambdaTest Web自动化仪表盘查看执行结果。

以下是Chrome浏览器测试执行快照: Chrome浏览器测试执行

Firefox浏览器测试执行快照: Firefox浏览器测试执行

可查看测试的详细数据,包括浏览器名称、版本、平台、执行日志,以及视频录制和截图。

5. 总结

自动化浏览器测试在快速验证网站和Web应用方面至关重要。借助Selenium,测试人员能高效并行执行多个测试,加速反馈循环。这种方法不仅能及早发现问题,还能确保软件稳定性,是现代Web开发不可或缺的一环。


原始标题:Automated Browser Testing With Selenium | Baeldung