跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava

Selenium Web 自动化测试脚本总结

总结了 Selenium Web 自动化测试的核心流程与关键技巧。涵盖环境搭建(Selenium+ 驱动 + 浏览器)、驱动管理(WebDriverManager)、元素定位(XPath/CSS)、常见操作(点击/输入/截图/上传)、窗口句柄处理、等待机制(显式/隐式/强制)及弹窗处理。强调定位唯一性、避免混用等待策略、无头模式配置等最佳实践,旨在帮助开发者构建稳定可维护的自动化脚本。

黑客发布于 2026/4/6更新于 2026/7/2469 浏览
Selenium Web 自动化测试脚本总结

Selenium Web 自动化测试脚本总结

Web 自动化的本质,是模拟人在浏览器里的操作行为:打开浏览器、访问页面、定位元素、输入/点击、做断言验证。Selenium 之所以常用,是因为它把这些动作抽象成了一套稳定的 API,再配合浏览器驱动(WebDriver)就能把'测试步骤'变成'可重复执行的脚本'。

下面按'工程上最常遇到的问题链路'来讲:先跑通 → 再定位稳 → 再等待稳 → 再窗口/弹窗/上传/截图/参数全覆盖。测试概念相关内容会简要收束在文末。


1)先搞清三件套:Selenium + 浏览器驱动 + 浏览器怎么协作

来看 Web 自动化落地需要的三件套:

  • 浏览器:最终执行动作的地方
  • 浏览器驱动(WebDriver):把自动化指令翻译成浏览器能理解的操作
  • Selenium 脚本:你写的 Java 代码,负责发出'打开页面/找元素/点击/断言'的指令

再来看它们的交互流程(非常关键,理解了后面排错就简单):

  1. Selenium 脚本里会在 ChromeDriverService 创建一个服务
  2. 通过服务启动本地驱动(一般是 localhost:<port>),这是 Selenium 向 WebDriver 发送请求的地址
  3. Selenium 向驱动发 HTTP 请求,驱动解析请求,打开浏览器并返回 sessionId(后续操作需要携带)
  4. 访问地址、查找元素等动作都通过该服务连接到 WebDriver,再通过 execute 发送请求
  5. 驱动把请求翻译成浏览器可执行的脚本并发送给浏览器,浏览器执行后把结果再经驱动返回给脚本

验证'驱动服务真的存在'的方式也很直观:执行脚本时终端会打印出驱动服务地址和端口信息。


2)驱动管理:别手动下载驱动,交给 WebDriverManager

来看一个现实问题:Chrome/Edge/Firefox 驱动版本经常和浏览器版本'拧巴',手动维护很痛。

解决办法:用 WebDriverManager 做驱动管理,它会自动下载、设置、维护驱动;并且从 v5 起还支持发现本机浏览器、构建 ChromeDriver/FirefoxDriver/EdgeDriver 等对象。

Maven 依赖(示例):

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.8.0</version>
    <scope>test</scope>
</dependency>

3)Selenium 快速上手:一段'百度搜索'脚本跑通全链路

来看最小可运行例子:打开浏览器 → 访问百度 → 输入关键字 → 点击搜索 → 退出。

Selenium 依赖(示例):

<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>4.0.0</version>
</dependency>

代码骨架(Java):

public void example_test() {
    // 驱动程序管理自动化
    WebDriverManager.chromedriver().setup();
    ChromeOptions options = new ChromeOptions();
    // 允许访问所有链接
    options.addArguments("--remote-allow-origins=*");
    // 1) 打开浏览器
    WebDriver driver = new ChromeDriver(options);
    // 2) 访问百度
    driver.get("https://www.baidu.com");
    // 3) 输入关键词
    driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("迪丽热巴");
    // 4) 点击'百度一下'
    driver.findElement(By.xpath("//*[@id=\"su\"]")).click();
    // 5) 关闭浏览器
    driver.quit();
}

4)元素定位:自动化的核心是'定位必须唯一'

Web 自动化测试的操作核心是:先找到元素,再对元素操作。常见定位方式很多(id/className/tagName/xpath/cssSelector),实际高频主要是 cssSelector 和 xpath。

4.1 cssSelector:更贴近前端,写起来也短

在这里插入图片描述

来看 selector 的用途:选中页面指定标签元素。常见写法:

  • id 选择器:#kw(百度搜索输入框)
  • 子类/层级选择器:例如热搜区域:#s-hotsearch-wrapper > div
4.2 XPath:路径语言,表达力强

来看 XPath 的常用语法点(能覆盖 80% 场景):

  • 获取所有节点://*
  • 获取指定标签节点://ul、//input
  • 直接子节点:/(如 //span/input)
  • 父节点:..(如 //input/..)
  • 按属性匹配://*[@id='kw']
  • 按索引取第 N 个://div/ul/li[3](注意索引从 1 开始)
4.3 '复制 selector/xpath'很香,但要小心'不唯一'

浏览器右键 Copy selector/xpath 很便捷,但复制出来的表达式不一定满足唯一性,有时需要手动改。 来看提醒:元素定位方法必须唯一;不唯一会导致脚本点错对象、偶现失败、甚至误判通过。


5)操作元素:点击、输入、清空、取文本与取属性

定位到元素后,常见操作包括点击、提交、输入、清除、获取文本。

5.1 点击/提交
driver.findElement(By.cssSelector("#su")).click();
5.2 输入(模拟键盘)
driver.findElement(By.cssSelector("#kw")).sendKeys("输入文字");
5.3 清空再输入
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
5.4 获取文本 vs 获取属性:别把'文本'和'属性值'混了
  • 获取文本:getText()
  • 获取属性值:getAttribute("属性名称")

另外两个经常要用的'页面级信息':

  • 当前标题:getTitle()
  • 当前 URL:getCurrentUrl()

6)窗口与句柄:新窗口打开后,脚本并不知道'你眼睛看到的那个窗口'

手工测试靠眼睛判断当前窗口;脚本需要靠 窗口句柄(handle)。

6.1 获取与切换窗口
  • 当前窗口句柄:driver.getWindowHandle()
  • 所有窗口句柄:driver.getWindowHandles()

切换到新窗口的常见写法:

String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();
for(String w : allWindow){
    if(w != curWindow){
        driver.switchTo().window(w);
    }
}

注意:执行 driver.close() 之前要先切到未被关闭的窗口。

6.2 窗口大小控制
driver.manage().window().maximize();
driver.manage().window().minimize();
driver.manage().window().fullscreen();
driver.manage().window().setSize(new Dimension(1024, 768));

7)等待:稳定性的分水岭(强制 / 隐式 / 显式)

代码执行速度通常比页面渲染快,不等待就容易出现'元素还没出来就去找'的误报。来看三种等待方式:

7.1 强制等待:Thread.sleep()
  • 优点:简单、调试时好用
  • 缺点:浪费时间、影响效率
7.2 隐式等待:全局智能等待

隐式等待会在查找元素时在指定时间内不断尝试,找到就继续,超时才报错。

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

它的作用域是整个脚本(只要 driver 没 quit() 就一直生效)。

7.3 显式等待:带条件的智能等待(更灵活)

显式等待在超时时间内只要满足条件就继续执行:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));

常见条件(ExpectedConditions)包括:

  • elementToBeClickable:元素可见且可点击
  • textToBe:文本符合预期
  • presenceOfElementLocated:DOM 上存在该元素
  • urlToBe:URL 符合预期
7.4 重要结论:不要混合隐式等待和显式等待

来看实验现象:隐式等待 5s + 显式等待 10s,最终等待时间并不稳定(会出现 10s、11s…),因此结论是:不要混用,等待时间可能不可预测。


8)浏览器导航:前进、后退、刷新

打开网站两种写法:

driver.navigate().to("https://selenium.dev");
driver.get("https://selenium.dev");

前进/后退/刷新:

driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();

9)弹窗处理:页面里找不到元素时,用 Alert

弹窗在页面 DOM 里通常找不到元素,需要切到 Alert:

在这里插入图片描述

9.1 警告/确认弹窗
Alert alert = driver.switchTo().alert();
alert.accept(); // 确认
alert.dismiss(); // 取消
9.2 提示弹窗(可输入)
Alert alert = driver.switchTo().alert();
alert.sendKeys("hello");
alert.accept();

在这里插入图片描述


10)文件上传:系统文件选择框不可控,但可以绕过去

点击'上传文件'会弹出系统窗口,这是非 Web 控件,Selenium 无法直接识别。 解决办法:对 <input type="file"> 直接 sendKeys(文件路径):

WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");

11)截图:让'线上跑挂了但你看不见'的问题可追溯

自动化脚本往往跑在机器上,失败时你不一定能看到现场。截图可以记录当时的错误画面。

需要额外依赖(示例):

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

核心代码:

File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file, new File(filename));

并且可以做'简单版/带时间戳归档版'的路径管理。


12)浏览器参数:无头模式 + 页面加载策略

12.1 无头模式(Headless)
ChromeOptions options = new ChromeOptions();
options.addArguments("--headless");
ChromeDriver driver = new ChromeDriver(options);
12.2 页面加载策略
options.setPageLoadStrategy(PageLoadStrategy.NONE);

13)测试概念(简要收束):自动化主要服务回归,但不能'神化'

来看几个关键结论:

  • 自动化的主要目的常用于回归测试:避免新增功能影响历史功能,需要整体回归。
  • 自动化不一定能取代人工:脚本也是人写的,功能变更后脚本需要维护与更新。
  • '自动化能大幅降低工作量'这种绝对化表达要小心,更准确的说法是:在一定程度上降低,但前期投入与维护成本真实存在。
  • 自动化类型很多:接口自动化、UI 自动化(Web、移动端)等;移动端常依赖模拟器,受环境影响更大,稳定性通常比接口与 Web 自动化更差。
  • 来看'自动化测试金字塔':理想状态是更多精力放在单元层,UI 层更少;而实际企业里常出现'冰淇淋蛋筒反模式',UI 自动化过重导致成本高、维护难。自动化需要找到'突破点',当持续运行带来长期成本收益时,价值才会逐渐体现。

Selenium 自动化脚本总结

定位要唯一、等待别混用、窗口要切对、失败要留证据(截图/日志)、能用配置别硬编码。

目录

  1. Selenium Web 自动化测试脚本总结
  2. 1)先搞清三件套:Selenium + 浏览器驱动 + 浏览器怎么协作
  3. 2)驱动管理:别手动下载驱动,交给 WebDriverManager
  4. 3)Selenium 快速上手:一段“百度搜索”脚本跑通全链路
  5. 4)元素定位:自动化的核心是“定位必须唯一”
  6. 4.1 cssSelector:更贴近前端,写起来也短
  7. 4.2 XPath:路径语言,表达力强
  8. 4.3 “复制 selector/xpath”很香,但要小心“不唯一”
  9. 5)操作元素:点击、输入、清空、取文本与取属性
  10. 5.1 点击/提交
  11. 5.2 输入(模拟键盘)
  12. 5.3 清空再输入
  13. 5.4 获取文本 vs 获取属性:别把“文本”和“属性值”混了
  14. 6)窗口与句柄:新窗口打开后,脚本并不知道“你眼睛看到的那个窗口”
  15. 6.1 获取与切换窗口
  16. 6.2 窗口大小控制
  17. 7)等待:稳定性的分水岭(强制 / 隐式 / 显式)
  18. 7.1 强制等待:Thread.sleep()
  19. 7.2 隐式等待:全局智能等待
  20. 7.3 显式等待:带条件的智能等待(更灵活)
  21. 7.4 重要结论:不要混合隐式等待和显式等待
  22. 8)浏览器导航:前进、后退、刷新
  23. 9)弹窗处理:页面里找不到元素时,用 Alert
  24. 9.1 警告/确认弹窗
  25. 9.2 提示弹窗(可输入)
  26. 10)文件上传:系统文件选择框不可控,但可以绕过去
  27. 11)截图:让“线上跑挂了但你看不见”的问题可追溯
  28. 12)浏览器参数:无头模式 + 页面加载策略
  29. 12.1 无头模式(Headless)
  30. 12.2 页面加载策略
  31. 13)测试概念(简要收束):自动化主要服务回归,但不能“神化”
  32. Selenium 自动化脚本总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 大模型驱动的 Agent 体系框架与核心推理引擎解析
  • Python 编程快速入门
  • MiniMax 海螺 AI 视频:图片与文本生成高质量视频
  • Web 对讲网关:基于 Netty 的 GB28181 音频推流实现
  • SQL 用户管理与权限控制
  • VS Code 远程 Copilot 调用 Claude Agent 提示无效请求的修正方案
  • Linux 系统下 Git 入门指南:高效管理代码库
  • Flutter 三方库 arcade 的鸿蒙化适配指南
  • Python AI 大模型部署指南:本地运行、API 服务与 Docker 封装
  • IntelliJ IDEA 集成 GitHub Copilot 实战指南
  • 用 Python 把 CSV 导入 Neo4j 的实操记录
  • 毕业论文降低 AI 检测率的原理与实操指南
  • 二分答案专题实战:木材加工与砍树问题解析
  • Z-Image ComfyUI:本地化 AI 绘画的高效实践
  • Java 面试核心考点梳理:基础、并发与容器篇
  • RAG 框架全景解析:7 个 GraphRAG 及 17 个传统框架汇总
  • 人工智能大模型基础:历史演进与核心技术解析
  • Java 图论基础:有向图与无向图详解
  • Claude Code Router 与 cpolar 组合优化 AI 开发流程
  • 大模型的 6 项核心技术:Transformer、预训练与 RLHF 等

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online