在当今快速发展的软件开发领域,自动化测试已成为确保软件质量和提高开发效率的关键环节。Java 作为一门广泛使用的编程语言,在自动化测试中扮演着重要角色,本文将深入探讨 Java 自动化测试中常用的函数,从基础的元素定位到高级的浏览器参数设置。
一、元素定位
cssSelector 是一种基于 CSS 样式选择器定位方法,web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector,其中cssSelector和xpath最常用。
1、cssSelector
选择器的功能:选中页面中指定的标签元素
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位
以定位"百度热搜"为例:




2、xPath
XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点
xpath使用路径表达式来选择xml文档中的节点
xpath语法中:

① //* 获取HTML页面所有节点


② //[指定节点] 获取HTML页面指定节点
//div :获取HTML页面所有的div节点
//input:获取HTML页面所有的input节点


③**/**获取⼀个节点中的直接子节点

④**..**获取一个节点的父节点

⑤**[@...]**实现节点属性的匹配
//*[@id=\"hotsearch-content-wrapper\"] 匹配HTML页面中id属性为hotsearch-content-wrapper的节点
⑥ 使用指定索引的方式获取对应的节点内容
注意:xpath的索引是从1开始的

二、操作测试对象
获取到了页面的元素之后,接下来就是要对元素进行操作了,常见的操作有点击、提交、输⼊、清除、获取文本
1、点击/提交对象
click()
java
//找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#chat-submit-button")).click();
2、模拟按键输入
sendKeys(" ")
java
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("输⼊⽂字");
3、清除文本内容
clear() 输入文本后又想换⼀个新的关键词
java
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("星期一");
driver.findElement(By.cssSelector("#chat-textarea")).clear();
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("星期二");
4、获取文本信息
getText()
java
List<WebElement> elements = driver.findElements(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]"));
for (WebElement e : elements){
System.out.println(e.getText());
}
注意:文本和属性值不要混淆,获取属性值需要使用方法 getAttribute("属性名称") ;
5、获取当前页面标题
getTitle()
java
String title = driver.getTitle();
System.out.println(title);
6、获取当前页面URL
getCurrentUrl()
java
String currentUrl = driver.getCurrentUrl();
System.out.println(currentUrl);
三、窗口
打开⼀个新的页面之后获取到的title和URL仍然还是前⼀个页面的:

当我们手工测试的时候,我们可以通过眼睛来判断当前的窗口是什么,但对于程序来说它是不知道当前最新的窗口应该是哪⼀个,那么它怎么来识别每⼀个窗口呢?每个浏览器窗口都有⼀个唯⼀的属性句柄(handle)来表示,我们就可以通过句柄来切换。
1、切换窗口
① 获取当前页面句柄:
driver.getWindowHandle();
② 获取所有页面句柄:
driver.getWindowHandles()
③切换当前句柄为最新页面:
java
String currentHandle = driver.getWindowHandle();
// 获取所有窗口句柄
Set<String> allHandles = driver.getWindowHandles();
// 切换到新窗口(百度图片)
for (String handle : allHandles) {
if (!handle.equals(currentHandle)) { // 这里应该是"不等于"当前窗口
// 切换到新窗口
driver.switchTo().window(handle);
break; // 找到第一个非当前窗口后跳出循环
}
}
2、窗口设置大小
java
//窗⼝最⼤化
driver.manage().window().maximize();
//窗⼝最⼩化
driver.manage().window().minimize();
//全屏窗⼝
driver.manage().window().fullscreen();
//⼿动设置窗⼝⼤⼩
driver.manage().window().setSize(new Dimension(1024, 768));
3、屏幕截图
自动化脚本一般部署在机器上自动去运行,如果出现报错我们不知道,但是我们可以通过抓拍来记录当时的错误场景
屏幕截图方法需要导入依赖:
java
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
java
File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File("test_001.png"));
图片保存在项目下:

这里有个弊端,因为我们固定了文件名为"test_001.png",那如果我们需要批量截图的话前一次的截图都会被覆盖,保存下来的截图只有最后一张,为了解决这个问题,我们可以使用时间戳命名,在文件名中加入时间戳(精确到秒),确保每次截图名称唯一。
java
/**
* image/
* 2025-12-04/
* funcName_120440500.png
* ......
* 2025-12-05/
* funcName_120440500.png
* ......
*/
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
//image/2025-12-04/funcName-120440500.png
String filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";
File srcfile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcfile , new File(filename));

4、关闭窗口
java
driver.close();
注意:窗口关闭后driver要重新定义
close() :关闭标签页
quit() :关闭浏览器
四、等待
通常代码执行的速度比页面渲染的速度要快,想要避免因为渲染过慢出现自动化报错的问题可以使用seleniu提供的三种方法:
1、强制等待
java
Thread.sleep();
优点:使用简单,调试的时候比较有效
缺点:影响运行效率,浪费大量时间
2、隐式等待
隐式等待是一种智能等待,可以规定在查找元素时,在指定的时间内不断查找元素,如果查到则代码继续执行,直到超时没找到元素才会报错。
implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法
java
//隐式等待1000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
//隐式等待5秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
隐式等待作用域是整个脚本的所有元素,只要driver对象没有被释放掉(driver.quit())隐式等待就一直生效。
优点:智能等待,作用全局
3、显示等待
显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码
new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)
$express:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
返回值:boolean
java
WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3))
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#chat-submit-button")));
ExpectedConditions预定义方法的⼀些示例:
- elementToBeClickable(By locator) ---- 用于检查元素的期望是可见的并已启用,以便您可以单击它
- textToBe(Bylocator,String str) ---- 检查元素
- presenceOfElementLocated(Bylocator) ---- 检查页⾯的 DOM 上是否存在元素
- urlToBe(java.lang.String url) ---- 检查当前页面的 URL 是⼀个特定的 URL
3.1、 隐显区别
| 特性 | 隐式等待 | 显式等待 |
|---|---|---|
| 作用范围 | 全局(整个Driver生命周期) | 局部(针对特定条件/操作) |
| 触发条件 | 元素查找(如 find_element) |
自定义条件(可见、可点击等) |
| 灵活性 | 较低,无法处理复杂条件 | 高,支持多种条件组合 |
| 性能影响 | 可能增加不必要的等待时间 | 按需等待,效率更高 |
| 异常类型 | NoSuchElementException |
TimeoutException |
避免混合使用:隐式和显式等待同时使用可能导致不可预测的等待时间(如两者超时时间叠加)
优先使用显式等待:更精确、灵活,能有效减少测试执行时间
隐式等待慎用:仅在简单项目或静态页面中使用,并设置合理超时时间(一般不超过10秒)
默认设置:禁用隐式等待(设为0),全程使用显式等待
五、浏览器导航

打开网站:
java
// 更⻓的⽅法
driver.navigate().to("https://selenium.dev");
// 简洁的⽅法
driver.get("https://selenium.dev");
浏览器的前进、后退、刷新:
java
driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();
六、弹窗
弹窗不属于页面元素,无法对弹窗进行元素定位,使用selenium提供的Alert接口
1、警告弹窗+页面弹窗


弹窗的操作有:
① 切换弹窗
java
Alert alert = driver.switchTo().alert();
② 点击确认按钮
java
alert.accept();
③ 点击取消按钮
java
alert.dismiss();
当弹窗上只有一个按钮时,accept和dismiss的效果一样
2、提示弹窗

④ 输入文本消息
java
alert.sendKeys("张三");

在弹窗输入文本的过程看不到,但实际上有在输入
⑤ 获取弹窗上的提示文本
java
String text = alert.getText();
System.out.println(text);

七、文件上传
点击文件上传的场景下会弹窗系统窗口,进行文件的选择
selenium无法识别非web的控件,上传文件窗口为系统自带,所以selenium无法识别窗口元素,但是可以使用sendkeys来上传指定路径的文件,达到的效果与手动上传是⼀样的


java
driver.findElement(By.cssSelector("body > div > div > input[type=file]"))
.sendKeys("文件地址");
八、浏览器参数设置
java
//edge浏览器配置
WebDriverManager.edgedriver().setup();
EdgeOptions options = new EdgeOptions();
java
//谷歌浏览器配置
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
java
//火狐浏览器配置
WebDriverManager.firefoxdriver().setup();
FirefoxOptions options = new FirefoxOptions();

在工作中经常使用 "-headless" 无痕模式
设置浏览器加载策略:
在做自动化测试的过程中会发现自动化打开页面加载的速度很慢,drive.get() 方法默认页面所有元素加载完成在执行下一步,为了提升效率,可以使用options.setPageLoadStrategy()。
options.setPageLoadStrategy() 是 Selenium 控制页面加载策略的方法,用来告诉浏览器:"页面加载到什么程度就算完成?"
setPageLoadStrategy 有三种类型的页面加载策略:
① NORMAL(默认)
java
options.setPageLoadStrategy(PageLoadStrategy.NORMAL);
-
等整个页面完全加载完(包括图片、CSS、JS等)
-
最慢,但最稳定
-
适用于需要完整页面的场景
-
不建议使用
② EAGER
java
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
-
只要 DOM 加载完成(HTML结构好了)就继续
-
不等图片、CSS等
-
最常用,速度快很多
③ NONE
java
options.setPageLoadStrategy(PageLoadStrategy.NONE);
-
完全不等待页面加载
-
立即执行下一步操作
-
风险最高,容易出错