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)

publicvoidexample_test(){// 驱动程序管理自动化WebDriverManager.chromedriver().setup();ChromeOptionsoptions=newChromeOptions();// 允许访问所有链接options.addArguments("--remote-allow-origins=*");// 1) 打开浏览器WebDriverdriver=newChromeDriver(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")).sendKeys("我爱游戏");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()

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

StringcurWindow=driver.getWindowHandle();Set<String>allWindow=driver.getWindowHandles();for(Stringw: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(newDimension(1024,768));

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

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

7.1 强制等待:Thread.sleep()

  • 优点:简单、调试时好用
  • 缺点:浪费时间、影响效率

7.2 隐式等待:全局智能等待

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

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

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

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

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

WebDriverWaitwait=newWebDriverWait(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 警告/确认弹窗

Alertalert=driver.switchTo().alert();alert.accept();// 确认alert.dismiss();// 取消

9.2 提示弹窗(可输入)

Alertalert=driver.switchTo().alert();alert.sendKeys("hello");alert.accept();


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

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

WebElementele=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>

核心代码:

Filefile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file,newFile(filename));

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


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

12.1 无头模式(Headless)

ChromeOptionsoptions=newChromeOptions();options.addArguments("--headless");ChromeDriverdriver=newChromeDriver(options);

12.2 页面加载策略

options.setPageLoadStrategy(PageLoadStrategy.NONE);

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

来看几个关键结论:

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

Selenium自动化脚本总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1190941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SSM276抗疫医疗用品销售系统

目录SSM276抗疫医疗用品销售系统摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM276抗疫医疗用品销售系统摘要 抗疫医疗用品销售系统是基于SSM&#xff08;SpringSpring MVCMyBatis&#xff09;框架开发的B2C电子商务平…

Selenium中隐式等待(Implicit Wait)和显式等待(Explicit Wait)的区别

Selenium中隐式等待&#xff08;Implicit Wait&#xff09;和显式等待&#xff08;Explicit Wait&#xff09;的区别1&#xff09;本质区别&#xff1a;它们“等的对象”不一样 隐式等待等的是&#xff1a;**元素查找&#xff08;findElement / findElements&#xff09;**这件…

大数据毕设项目推荐-基于django的直播带货商品数据分析可视化系统基于django大数据在直播带货商品选品中的应用【附源码+文档,调试定制服务】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

SSM277课程在线考试组卷管理系统vue

目录SSM277课程在线考试组卷管理系统Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM277课程在线考试组卷管理系统Vue摘要 该系统基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架与Vue.js前端技术构建&a…

macOS部署docker容器的坑点

在macOS上,Docker的 --network host 模式与Linux不同,容器并不真正共享主机网络栈。需要使用端口映射来让PostgreSQL可以从主机访问。

SSM280的课程智能组卷考试系统vue

目录SSM280课程智能组卷考试系统&#xff08;Vue版&#xff09;摘要开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;SSM280课程智能组卷考试系统&#xff08;Vue版&#xff09;摘要 SSM280课程智能组卷考试系统是基于SpringSpr…

大数据毕设项目:基于django大数据在直播带货商品选品中的应用(源码+文档,讲解、调试运行,定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

SSM281的垃圾分类系统vue商城,礼品,考试

目录 SSM281垃圾分类系统概述核心功能模块技术实现亮点 开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; SSM281垃圾分类系统概述 SSM281垃圾分类系统是基于SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架与Vue.js前端…

智能体部署架构:突破性能极限的关键!

AI Agent 的部署架构没有万能解法&#xff0c;选择对了能事半功倍&#xff0c;选择错了则可能付出高昂的性能或成本代价。不同架构会直接影响性能表现、成本结构、延迟体验和适用场景。目前主流的四种部署模式包括批量部署、流式部署、实时部署和边缘部署。1.批量部署Agent 以定…

大数据毕设选题推荐:基于python大数据的国内自然地震数据可视化分析系统基于python的灾情数据可视化系统【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

【毕业设计】基于django大数据在直播带货商品选品中的应用(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

计算机大数据毕设实战-基于python的洪涝灾情数据可视化系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

【课程设计/毕业设计】基于django大数据在直播带货商品选品中的应用直播带货商品数据分析可视化系统【附源码、数据库、万字文档】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大数据领域内存计算:构建实时数据处理的高效平台

大数据领域内存计算:构建实时数据处理的高效平台 关键词:内存计算、实时数据处理、分布式存储、低延迟、大数据平台 摘要:在电商大促的实时销量看板、金融交易的毫秒级反欺诈、物联网设备的实时监控中,“实时"二字正成为大数据价值的核心。传统依赖磁盘的计算方式因高…

即插即用系列 | CVPR 2025 AmbiSSL:首个注释模糊感知的半监督医学图像分割框架

论文题目&#xff1a;Annotation Ambiguity Aware Semi-Supervised Medical Image Segmentation 论文原文&#xff08;paper&#xff09;&#xff1a;https://openaccess.thecvf.com/content/CVPR2025/html/Kumari_Annotation_Ambiguity_Aware_Semi-Supervised_Medical_Image_S…

大数据计算机毕设之基于python的灾情数据可视化系统洪水预测系统 自然灾害预测可视化(完整前后端代码+说明文档+LW,调试定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大数据毕设项目:基于python的灾情数据可视化系统(源码+文档,讲解、调试运行,定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

大模型本地部署,小号的vLLM来了!

文章介绍轻量级大模型推理引擎Nano-vLLM&#xff0c;这是代码简洁&#xff08;约1200行Python&#xff09;的vLLM替代实现。它提供快速离线推理能力&#xff0c;API与vLLM类似&#xff0c;在小模型测试中性能甚至优于vLLM。文章详解安装方法、模型下载途径&#xff08;包括mode…

Kuikly 框架架构与目录导览(HarmonyOS 视角)

本文从 KuiklyUI 源码仓库结构出发&#xff0c;解释 Kuikly 的整体架构、每个关键目录的职责&#xff0c;并给出 鸿蒙开发只需关注的目录清单&#xff0c;便于快速进入开发状态。先跟大家说个好消息&#xff0c;该框架已经解决了windows平台的快速编译鸿蒙产物&#xff08;也就…

速通秘籍!提示工程架构师上下文工程跨模态信息融合技术

速通秘籍&#xff01;提示工程架构师的上下文工程与跨模态信息融合技术 引言&#xff1a;为什么你需要这门“速通课”&#xff1f; 作为一名提示工程架构师&#xff0c;你是否经常遇到这些痛点&#xff1a; 明明写了详细的提示&#xff0c;AI却“答非所问”——因为它没理解用户…