在上一篇中,我们系统梳理了 Selenium 的八大元素定位方式与动态元素定位方案。定位到元素之后,真正的自动化交互要靠各类元素操作、窗口控制、浏览器配置 API 来实现。本文整理 Selenium WebDriver 最常用的核心 API,覆盖元素交互、窗口管理、截图留证、导航控制、弹窗处理、文件上传、启动参数配置七大模块。
一、元素基础交互 API
元素定位完成后,最常用的就是点击、输入、清空、获取信息这四类操作,是所有自动化脚本的基础。
1. 点击操作 click ()
最核心的交互方法,用于按钮、链接、复选框、单选框等所有可点击元素。
// 点击百度一下按钮
driver.findElement(By.cssSelector("#su")).click();
2. 文本输入 sendKeys ()
用于输入框、文本域等可编辑元素,传入需要输入的字符串内容。
// 在百度搜索框输入关键词
driver.findElement(By.cssSelector("#kw")).sendKeys("输入文字");
3. 清空文本 clear ()
清空输入框中已有的内容,通常在重新输入前调用,避免内容叠加。
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
// 清空输入框现有内容
driver.findElement(By.cssSelector("#kw")).clear();
4. 获取元素文本 getText ()
获取元素的可见文本内容,是自动化断言、结果校验最常用的方法。
String bdtext = driver.findElement(By.xpath("//*[@id='title-content']/span[1]")).getText();
System.out.println("打印的内容是:" + bdtext);
5. 获取元素属性 getAttribute ()
获取元素指定属性的值,比如 href、class、id、value 等,适合获取非可见的属性信息。
// 获取元素的class属性值
String s = driver.findElement(By.xpath("......")).getAttribute("class");
System.out.println("打印的内容是:" + s);
6. 页面级信息获取
两个全局页面信息方法,常用于页面跳转后的正确性校验:
getTitle():获取当前页面的标题getCurrentUrl():获取当前页面的完整 URL 地址
二、窗口句柄与窗口管理
Selenium 通过句柄(handle) 唯一标识每个浏览器标签页或独立窗口,所有窗口级操作都基于句柄实现。
1. 句柄获取与切换
getWindowHandle():获取当前页面的句柄,返回字符串类型getWindowHandles():获取所有已打开页面的句柄集合switchTo().window(句柄):将操作上下文切换到指定句柄的窗口
典型场景:点击链接打开新标签页后,切换到新页面继续操作。
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
// 遍历所有窗口,切换到非当前的新窗口
for (String w : allWindow) {
if (!w.equals(curWindow)) {
driver.switchTo().window(w);
}
}
2. 窗口大小控制
// 窗口最大化
driver.manage().window().maximize();
// 窗口最小化
driver.manage().window().minimize();
// 全屏显示
driver.manage().window().fullscreen();
// 手动设置窗口宽高
driver.manage().window().setSize(new Dimension(1024, 768));
3. 窗口关闭:close () 与 quit () 的区别
这是一个踩坑点,二者作用范围完全不同:
driver.close():仅关闭当前句柄对应的标签页,浏览器进程本身不退出driver.quit():关闭所有标签页,彻底退出整个浏览器进程
⚠️ 注意:使用 close () 关闭页面后,必须手动切换到剩余的有效窗口句柄,否则继续操作元素会抛出
NoSuchElementException。
三、屏幕截图:自动化异常留证
自动化脚本通常在后台无人值守运行,出错时无法直观看到页面现场。屏幕截图是定位问题、留存证据的核心手段。
依赖说明
使用文件保存功能需要引入 commons-io 工具包:
XML
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
基础版本
直接截图并保存为指定文件名,适合简单调试场景。
python
File srcfile = driver.getScreenshotAs(OutputType.FILE);
// 保存为 my.png
FileUtils.copyFile(srcfile, new File("my.png"));
高阶版本:按时间命名防覆盖
通过时间戳生成文件路径,避免多次运行截图被同名覆盖,适合批量测试、CI 执行场景。
python
List<String> times = getTime(); // 自定义方法获取格式化时间
// 示例路径:./src/test/autotest-2022-08-01/goodsbroser-20220801-214130.png
String filename = "./src/test/autotest-" + times.get(0) + "/" + str + "" + times.get(1) + ".png";
File srcfile = driver.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcfile, new File(filename));
四、浏览器导航操作
1. 打开网页
两种常用写法,执行效果完全一致:
python
// 方式1:get 方法,写法简洁
driver.get("https://selenium.dev/");
// 方式2:navigate.to 方法,语义更清晰
driver.navigate().to("https://selenium.dev/");
2. 前进、后退、刷新
对应浏览器左上角的导航按钮,用于页面流转控制:
python
// 后退到上一页
driver.navigate().back();
// 前进到下一页
driver.navigate().forward();
// 刷新当前页面
driver.navigate().refresh();
五、弹窗处理
浏览器原生弹窗(alert/confirm/prompt)不属于 DOM 元素,无法用常规元素定位,必须先切换到弹窗上下文才能操作。
1. 警告 / 确认弹窗
只有提示信息和确认、取消按钮的基础弹窗:
python
// 切换到弹窗上下文
Alert alert = driver.switchTo().alert();
// 点击确认按钮
alert.accept();
// 点击取消按钮
alert.dismiss();
// 操作完成后切回主页面
driver.switchTo().defaultContent();
2. 可输入提示弹窗
支持输入文本的 prompt 类型弹窗:
python
Alert alert = driver.switchTo().alert();
// 在弹窗输入框中输入内容
alert.sendKeys("hello");
alert.accept();
六、文件上传
点击文件上传按钮会弹出系统级文件选择窗口,Selenium 无法操作系统原生控件。
通用解决方案 :直接定位页面上的 <input type="file"> 元素,通过 sendKeys() 传入本地文件的绝对路径,效果与手动选择文件完全一致。
python
WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
// 传入本地文件的绝对路径
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");
七、Chrome 浏览器启动参数配置
通过 ChromeOptions 可以自定义浏览器启动行为,适配调试、CI、性能优化等不同测试场景。
基础配置示例
python
// 自动管理驱动版本,无需手动下载
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
// 允许跨域访问所有链接
options.addArguments("--remote-allow-origins=*");
// 以指定配置启动浏览器
WebDriver driver = new ChromeDriver(options);
1. 无头模式
-
有头模式:正常显示浏览器 GUI 窗口,可直观看到操作过程,适合本地调试
-
无头模式:后台静默运行,不显示界面,资源占用低、执行速度快,适合服务器、CI/CD 流水线执行
// 开启无头模式
options.addArguments("-headless");
2. 页面加载策略
有时候页面资源很多, 为了执行效率,不可能等待所有页面元素加载完成,再去获取。
通过 setPageLoadStrategy 控制页面加载的等待程度,在执行速度和稳定性之间做平衡:
| 策略 | 说明 | 特点 |
|---|---|---|
| NONE | 完全不阻塞,浏览器开始加载后立即返回控制权 | 速度最快,但元素未加载完成容易报错,需配合显式等待使用 |
| EAGER | 等待 DOM 树解析完成,不等待图片等静态资源加载 | 速度与稳定性均衡,推荐日常使用 |
| NORMAL | 默认值,等待所有页面资源加载完成 | 最稳定,但页面资源多的时候速度最慢 |
// 设置为EAGER加载策略
options.setPageLoadStrategy(PageLoadStrategy.EAGER);