当前位置:首页 > 技术 > 正文内容

基于Java与Selenium的Web UI自动化测试环境搭建与元素定位指南

访客 技术 2026年6月19日 1

自动化测试环境配置

在开始编写Web UI自动化脚本之前,需要确保本地开发环境已正确配置。以下是基础环境要求:

  • 已安装并配置好环境变量的JDK(建议JDK 8或以上版本)。
  • 本地已安装目标测试浏览器(本文以Google Chrome为例)。
  • 安装IntelliJ IDEA或其他支持Java开发的IDE。

获取与配置浏览器驱动

Selenium通过WebDriver协议与浏览器进行交互,因此必须下载与本地浏览器版本相匹配的驱动程序。版本不一致会导致会话创建失败。

可以通过Selenium官方文档获取各浏览器驱动的下载地址:

https://www.selenium.dev/documentation/webdriver/getting_started/install_drivers/
WebDriver下载页面

根据操作系统下载对应的压缩包并解压。对于macOS用户,系统安全机制可能会拦截未签名的可执行文件,导致报错"无法验证开发者"。可通过在终端中执行以下命令移除隔离属性:

xattr -d com.apple.quarantine /path/to/chromedriver

构建Maven工程并引入依赖

为了高效管理项目依赖,推荐使用Maven构建Java项目。在IDE中创建一个新的Maven工程后,在pom.xml中配置Selenium和TestNG的依赖坐标。TestNG将作为我们的测试执行框架。

<?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>com.automation.demo</groupId>
    <artifactId>ui-testing-framework</artifactId>
    <version>2.0.0</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- Selenium Java 核心依赖 -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.12.1</version>
        </dependency>
        <!-- TestNG 测试框架 -->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.8.0</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

保存文件后,刷新Maven项目以下载所需的JAR包。

Selenium 基础脚本演练

下面通过一个模拟用户登录的场景,演示Selenium的基本工作流程。自动化测试的核心逻辑通常为:初始化驱动、访问目标URL、定位页面元素、执行交互操作、验证结果并清理资源。

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.time.Duration;

public class LoginScenarioTest {
    
    private WebDriver browser;
    private final String baseUrl = "http://127.0.0.1:8080/app/login";

    @BeforeMethod
    public void setUp() {
        // 指定ChromeDriver的本地路径
        System.setProperty("webdriver.chrome.driver", "C:/drivers/chromedriver.exe");
        browser = new ChromeDriver();
        // 设置隐式等待
        browser.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
    }

    @Test
    public void testUserAuthentication() {
        browser.get(baseUrl);
        
        // 输入凭证并提交
        browser.findElement(By.id("user_email")).sendKeys("admin@test.com");
        browser.findElement(By.id("user_pwd")).sendKeys("SecurePass123");
        browser.findElement(By.cssSelector("button.submit-btn")).click();
        
        // 验证逻辑(此处省略断言)
    }

    @AfterMethod
    public void tearDown() {
        if (browser != null) {
            browser.quit();
        }
    }
}

在上述代码中,@Test@BeforeMethod@AfterMethod是TestNG的生命周期注解,用于控制测试方法的执行顺序。Selenium的交互主要依赖于WebDriver接口,它充当了代码与浏览器之间的桥梁。

Web 元素定位策略详解

UI自动化的难点往往在于如何稳定、准确地捕获页面元素。Selenium提供了多种By定位机制,以下是常用策略的解析。

1. 基于 ID 定位 (By.id)

当HTML元素拥有唯一的id属性时,这是最优先推荐的定位方式,因其解析速度快且不易受DOM结构变化影响。

HTML 结构:

<input id="txt_username" type="text" placeholder="账号" />

Java 实现:

WebElement usernameInput = browser.findElement(By.id("txt_username"));

2. 基于 Name 属性定位 (By.name)

若元素缺乏id,但具备name属性(常见于表单提交元素),可采用此方法。

HTML 结构:

<input name="contact_phone" type="tel" />

Java 实现:

browser.findElement(By.name("contact_phone")).sendKeys("13800138000");

3. 基于 Class 名称定位 (By.className)

利用CSS类名进行定位。需要注意的是,class属性通常不保证全局唯一。如果页面中存在多个相同类名的元素,findElement只会返回DOM树中第一个匹配的节点。

HTML 结构:

<input class="form-control input-field" placeholder="搜索关键字" />
<input class="form-control input-field" placeholder="筛选条件" />

Java 实现:

// 获取第一个匹配的元素
browser.findElement(By.className("input-field")).sendKeys("Selenium");

// 若需操作第二个元素,需使用 findElements 获取集合后通过索引访问
List<WebElement> inputs = browser.findElements(By.className("input-field"));
inputs.get(1).sendKeys("Automation");

4. 基于标签名定位 (By.tagName)

直接通过HTML标签(如div, a, input)进行查找。由于同类型标签在页面中通常大量存在,此方法多用于获取元素集合而非单一元素。

Java 实现:

List<WebElement> allLinks = browser.findElements(By.tagName("a"));
System.out.println("页面链接总数: " + allLinks.size());

5. 基于链接文本定位 (By.linkText 与 By.partialLinkText)

这两种方式专门用于定位<a>标签(超链接)。linkText要求完全匹配链接的可见文本,而partialLinkText支持模糊匹配。

HTML 结构:

<a href="/help">查看用户操作手册</a>

Java 实现:

// 精确匹配
browser.findElement(By.linkText("查看用户操作手册")).click();

// 模糊匹配
browser.findElement(By.partialLinkText("操作手册")).click();
标签: Selenium

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

linux screen 用法详情 (nohup 的替代方案)

一、screen 是什么?能干嘛?screen 是一个终端复用器,可以:在一个 SSH 会话中开多个“虚拟终端”SSH 断线后,程序仍然在后台运行随时重新连接到原来的会话特别适合:nohup 的替代方案跑脚本 / 爬虫 / 训练模型运维、远程开发二、安装 screen# CentOS / Rocky / Almayum install -y screen# Debian / Ubuntuapt i...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。