【软件测试】Selenium自动化测试指南
一、元素定位核心方法
1.1 单元素与多元素查找
findElement:返回匹配的第一个WebElement对象,若无元素则抛出异常
findElements:返回所有匹配元素的集合,若无匹配则返回空列表
// 获取百度搜索框(单元素)
WebElement searchBox = driver.findElement(By.id("kw"));
// 获取所有热搜条目(多元素)
List<WebElement> hotItems = driver.findElements(By.cssSelector(".hotsearch-item"));
二、定位器详解
2.1 CSS选择器实战
| 选择器类型 | 示例 | 应用场景 |
|---|---|---|
| ID选择器 | #search-btn | 定位唯一元素 |
| 类选择器 | .news-title | 样式相同的元素组 |
| 属性选择器 | input[type='password'] | 表单元素精准定位 |
| 后代选择器 | div.container > form | 层级结构明确的元素 |
开发者工具使用技巧:
- 按
F12或右键"检查"打开开发者工具 - 使用
Ctrl+Shift+C快速定位页面元素 - 在元素面板右键获取XPath/CSS路径
2.2 XPath高级定位
// 通过文本内容定位
By.xpath("//button[text()='登录']")
// 通过部分属性匹配
By.xpath("//a[contains(@href,'download')]")
// 多层嵌套定位
By.xpath("//div[@id='main']//li[3]/span")
三、元素操作全流程
3.1 findElement
获取页面中的一个文本元素并打印出来,假如我想取的是这个元素
代码
public class Test01 {
// 封装打开标签页方法
public WebDriver openWeb() {
// 下载驱动程序
// 这里选择的是 edgeDriver,下载速度较快
WebDriverManager.edgedriver().setup();
// 配置驱动程序
EdgeOptions options = new EdgeOptions();
// 允许访问所有链接
options.addArguments("--remote-allow-origins=*");
// 打开浏览器标签页
WebDriver driver = new EdgeDriver(options);
return driver;
}
public void test1() {
WebDriver driver = openWeb();
driver.get("https://www.baidu.com");
WebElement element = driver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[3]/a/span[2]"));
System.out.println(element.getText());
quitWed(driver);
}
// 封装关闭浏览器方法
public void quitWed(WebDriver driver) {
driver.quit();
}
}
3.2 findElements
获取所有热搜并打印出来
代码
public class Test01 {
// 封装打开标签页方法
public WebDriver openWeb() {
// 下载驱动程序
// 这里选择的是 edgeDriver,下载速度较快
WebDriverManager.edgedriver().setup();
// 配置驱动程序
EdgeOptions options = new EdgeOptions();
// 允许访问所有链接
options.addArguments("--remote-allow-origins=*");
// 打开浏览器标签页
WebDriver driver = new EdgeDriver(options);
return driver;
}
public void test1() {
WebDriver driver = openWeb();
driver.get("https://www.baidu.com");
List<WebElement> element = driver.findElements(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li/a/span[2]"));
for(WebElement e:element){
System.out.println(e.getText());
}
quitWed(driver);
}
// 封装关闭浏览器方法
public void quitWed(WebDriver driver) {
driver.quit();
}
}
3.3 点击提交对象
driver.findElements(By.xpath("....")).click();
3.4 模拟按键输入
driver.findElements(By.xpath("....")).sendKeys("...");
3.5 清除文本内容
在找到搜索框并写入内容后,如果再执行本次操作,再次写入的内容就会追加到后面。所以此时就需要先清空上次写入的内容,再写入
driver.findElements(By.xpath("....")).clear();
3.6 获取当前页标题
System.out.println(driver.getTitle());
3.7 获取当前页 url
System.out.println(driver.getCurrentUrl());
四、窗口管理实战
4.1 多窗口操作流程
不同的窗口又不同的句柄,如果想要操作对于窗口的句柄,就必须切换到相应的句柄。
举个例子:
如果我想在网页中打开图片网页,然后点击头像
public void test3() {
WebDriver driver = openWeb();
driver.get("https://www.baidu.com");
driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[6]")).click();
driver.findElement(By.xpath("//*[@id=\"app\"]/div/div[1]/div/div[3]/div[3]/ul/li[2]/a")).click();
quitWed(driver);
}
执行这个代码,会出现这样的报错

意味着没有找到这个元素,这就是在打开了一个新网页之后,句柄没有切换到对应当前网页的句柄,还是在原来的网页中寻找元素,所以当然找不到,所以就需要获取到所有的窗口和当前窗口,进行判定后,转换到当前窗口。
查询窗口
查询当前窗口:
driver.getWindowHandle();
查询所有窗口:
driver.getWindowHandles();
切换窗口
driver.switchTo().window(handle);
于是就可以根据这些窗口操作解决一开始提出来的问题,在代码中增加窗口操作。
public void test3() {
WebDriver driver = openWeb();
driver.get("https://www.baidu.com");
driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[6]")).click();
driver.getWindowHandles();
String currentWindow = driver.getWindowHandle();
for (String handle : driver.getWindowHandles()) {
if (!handle.equals(currentWindow)) {
driver.switchTo().window(handle);
}
}
driver.findElement(By.xpath("//*[@id=\"app\"]/div/div[1]/div/div[3]/div[3]/ul/li[2]/a")).click();
quitWed(driver);
}
关闭窗口
driver.quit()
这意味着关闭浏览器,释放 driver 对象,如果想要再次使用 driver 对象,需要再次创建
driver.close()
关闭当前标签页,如果想要操作其他页面,就需要转换窗口的句柄
获取当前页的屏幕截图
五、等待机制详解
5.1 等待策略对比与基础用法
什么是等待机制?
在自动化测试中,由于页面加载速度或动态内容的影响,直接操作元素可能失败。等待机制通过设置合理的等待时间,确保元素加载完成后再进行操作。
(1) 强制等待(简单但低效)
定义:通过代码强制暂停固定时间,无论页面是否已加载完成。
适用场景:临时调试时手动观察页面变化。
代码示例:
// 暂停3秒(单位:毫秒)
Thread.sleep(3000);
缺点:
- 无论页面是否加载完成都必须等待
- 时间设置过长会浪费测试时间,过短可能导致失败
(2) 隐式等待(全局设置)
定义:为整个测试会话设置统一的等待时间,当查找元素时会自动轮询直到超时。
适用场景:所有元素加载时间相对稳定的项目。
代码示例:
// 设置全局隐式等待10秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
特性:
- 只需设置一次即可全局生效
- 找不到元素时才会触发等待,找到则立即继续
(3) 显式等待(精准控制)
定义:针对特定元素设置等待条件,只有满足条件(如元素可见、可点击)才会继续执行。
适用场景:处理动态加载内容或需要精确控制的场景。
// 等待搜索按钮可点击(最多等15秒)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement searchBtn = wait.until(
ExpectedConditions.elementToBeClickable(By.id("search-button"))
);
常用等待条件:
| 条件方法 | 说明 |
|---|---|
elementToBeClickable | 元素可点击 |
visibilityOfElementLocated | 元素可见且已显示 |
textToBePresentInElement | 元素包含指定文本 |
5.2 推荐方案
// 步骤1:设置隐式等待(兜底策略)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
// 步骤2:对关键操作添加显式等待
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement input = wait.until(
ExpectedConditions.visibilityOfElementLocated(By.id("username"))
);
input.sendKeys("test_user");
为什么这样用?
- 隐式等待确保常规元素加载
- 显式等待处理重要或动态元素
六、弹窗处理技巧
6.1 弹窗类型与基础操作
什么是浏览器弹窗?
由JavaScript触发的原生对话框,无法通过普通元素定位方式操作,必须使用Selenium的Alert接口处理。
(1) 警告弹窗(Alert)
特征:仅有“确定”按钮。
// 获取弹窗对象
Alert alert = driver.switchTo().alert();
// 获取提示文本并确认
System.out.println("警告内容:" + alert.getText());
alert.accept(); // 点击确定
典型场景:表单提交后的成功/失败提示。
(2) 确认弹窗(Confirm)
特征:有“确定”和“取消”按钮。
Alert confirm = driver.switchTo().alert();
if(confirm.getText().contains("确认删除")) {
confirm.accept(); // 点击确定
} else {
confirm.dismiss(); // 点击取消
}
典型场景:删除操作前的二次确认。
(3) 输入弹窗(Prompt)
特征:可输入文本的输入框。
Alert prompt = driver.switchTo().alert();
prompt.sendKeys("北京"); // 输入内容
prompt.accept(); // 提交
典型场景:需要用户输入地理位置或验证码。
6.2 统一处理模板
try {
// 等待弹窗出现(最多等5秒)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
// 处理弹窗
if (alert.getText().contains("确认")) {
alert.accept();
} else {
alert.dismiss();
}
} catch (TimeoutException e) {
System.out.println("未出现弹窗");
}
七、浏览器优化配置
7.1 无头模式(Headless)
定义:不显示浏览器界面,直接在后台运行测试。
优点:节省资源、提高执行速度。
EdgeOptions options = new EdgeOptions();
options.addArguments("--headless=new"); // 启用无头模式
options.addArguments("--window-size=1920,1080"); // 设置虚拟窗口大小
WebDriver driver = new EdgeDriver(options);
适用场景:服务器环境或不需要观察界面的测试。
7.2 加载策略
定义:控制浏览器何时认为页面加载完成。
| 策略 | 说明 | 适用场景 |
|---|---|---|
| NORMAL | 等待所有资源加载完成(默认) | 传统网页 |
| EAGER | 仅等待HTML加载完成 | 单页应用(SPA) |
| NONE | 不等待加载完成 | 手动控制等待 |
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
更多推荐

所有评论(0)