Selenium 核心 API 解析(三)

在上一篇中,我们系统梳理了 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);
相关推荐
在世修行1 小时前
智学文枢:技术选型
python·技术选型
我命由我123452 小时前
Function Calling 模型
人工智能·python·学习·ai·学习方法·ai编程·ai写作
XMXFS3 小时前
小红书推荐算法底层逻辑解析:用数据思维做内容优化
python·算法·新媒体运营·推荐算法
hans7748829683 小时前
仅根据BMI反推身高和体重?还真能做到!只需要简单的数论知识~
python·数学
Anhty3 小时前
短视频音频降噪:2026 移动端剪辑工具怎么选
功能测试·智能手机·音视频
追光者493 小时前
我把 55 篇自动化日志翻了一遍:最容易出事的是这 4 个地方
python·自动化运维
2601_962885723 小时前
如何用 Python计算 CR能量指标(中间意愿指标)?
开发语言·python
打工仔折腾 AI3 小时前
LangChain 工具调用实战:从 Tool 定义到 Agent 执行链路拆解
java·前端·人工智能·后端·python·langchain·ai agent 实战
hhb_6184 小时前
Flask+SQLite实现用户管理接口
python·sqlite·flask