编程

Java: 使用 Selenium 自动进行浏览器测试

23 2024-12-26 00:16:00

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() 方法接受 browserVersionplatform 作为参数,设置其自己的功能,并返回 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 进行的自动浏览器测试。

  1. 导航到 LambdaTest eCommerce Playground 网站。
  2. 定位并点击主页上的 Shop by Category 目录。
  3. 定位并点击 MP3 Players 目录。
  4. 断言该页面显示页面标题 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

 

下一篇