《刚刚问世》系列初窥篇-Java+Playwright自动化测试-- 操作单选和多选按钮 - 下篇(详细教程)

发布时间:2026/7/25 22:33:47

《刚刚问世》系列初窥篇-Java+Playwright自动化测试-- 操作单选和多选按钮 - 下篇(详细教程)
《刚刚问世》系列初窥篇-JavaPlaywright自动化测试-- 操作单选和多选按钮 - 下篇详细教程前言在上一篇文章中我们初步了解了如何使用 Java Playwright 进行单选和多选按钮的基本操作。今天我们将深入探讨更复杂的场景动态加载的单选按钮、联动选择、多选按钮的全选/反选以及如何处理非原生自定义样式的按钮。这些技巧在实际项目中非常实用能帮你应对大部分前端交互挑战。## 准备工作环境与依赖确保你的项目中已经导入 Playwright 的 Java 依赖Maven示例xmldependency groupIdcom.microsoft.playwright/groupId artifactIdplaywright/artifactId version1.40.0/version/dependency同时建议使用最新版本的浏览器驱动Playwright 会自动管理。## 技巧一操作动态加载的单选按钮很多现代应用如 React、Vue的单选按钮是在用户交互后才渲染的。例如一个“选择支付方式”的弹窗需要点击触发后才出现。### 场景模拟假设有一个【立即支付】按钮点击后出现一组选项微信支付、支付宝、银行卡。### 核心代码示例Javajavaimport com.microsoft.playwright.*;import org.junit.jupiter.api.*;public class DynamicRadioTest { static Playwright playwright; static Browser browser; static Page page; BeforeAll static void setup() { playwright Playwright.create(); browser playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false)); page browser.newPage(); page.navigate(https://example.com/payment); // 假设的测试页面 } Test void testDynamicRadio() { // 1. 点击触发按钮让单选按钮组出现 page.click(button#showPaymentOptions); // 2. 等待单选按钮渲染完成使用定位器等待 page.waitForSelector(input[namepayment][typeradio], new Page.WaitForSelectorOptions() .setTimeout(5000)); // 最多等5秒 // 3. 选择第二个选项支付宝 // 使用 nth() 定位第二个 radio page.locator(input[namepayment][typeradio]).nth(1).check(); // 4. 断言验证支付宝被选中 boolean isAlipayChecked page.locator(input[valuealipay]).isChecked(); Assertions.assertTrue(isAlipayChecked, 支付宝应该被选中); System.out.println(✅ 动态单选按钮操作成功); } AfterAll static void tearDown() { browser.close(); playwright.close(); }}注释解析-waitForSelector确保动态元素加载完成。-nth(1)选取第二个 radio索引从0开始。-isChecked()验证是否被选中返回布尔值。## 技巧二联动单选与多选在实际业务中经常遇到“如果选了某个选项就禁用其他选项”的逻辑。例如选择“学生”身份后学历选项自动禁用“博士”。### 场景模拟一个表单包含身份选择单选学生/职工和学历选择多选本科/硕士/博士。当身份为“学生”时学历中的“博士”不可选。### 代码示例javaTestvoid testCascadingSelection() { // 1. 选择身份为“学生” page.locator(label:has-text(学生)).click(); // 假设 radio 被 label 包裹 // 2. 等待联动效果生效通常需要短暂延迟或用 waitForFunction page.waitForFunction(!document.querySelector(input[value\博士\]).disabled); // 3. 尝试验证“博士”是否被禁用 Locator phdCheckbox page.locator(input[value博士]); boolean isDisabled phdCheckbox.isDisabled(); Assertions.assertTrue(isDisabled, 博士选项应该被禁用); // 4. 切换身份为“职工” page.locator(label:has-text(职工)).click(); // 5. 等待状态恢复 page.waitForFunction(!document.querySelector(input[value\博士\]).disabled); // 6. 现在博士应该可用选中它 phdCheckbox.check(); Assertions.assertTrue(phdCheckbox.isChecked(), 博士应该被选中); System.out.println(✅ 联动逻辑验证通过);}要点说明-waitForFunction用于等待 JavaScript 条件满足这里是等待disabled属性变化。- 使用label:has-text()选择器更贴近用户视角也避免直接依赖id或name。## 技巧三多选按钮的全选、反选与批量操作很多列表页会提供“全选/反选”功能例如购物车、权限管理。我们需要模拟用户点击全选、验证所有子项被选中再取消全选。### 高效批量操作代码javaTestvoid testSelectAllAndDeselectAll() { // 假设页面有5个多选框id 从 item1 到 item5以及一个全选框 idselectAll // 1. 点击全选 page.check(#selectAll); // 2. 验证所有子项都被选中 for (int i 1; i 5; i) { Locator item page.locator(#item i); Assertions.assertTrue(item.isChecked(), 项目 i 应该被选中); } // 3. 取消其中一个子项模拟用户手动取消 page.uncheck(#item3); // 4. 验证全选框状态变为未选中 boolean isAllChecked page.locator(#selectAll).isChecked(); Assertions.assertFalse(isAllChecked, 取消子项后全选框应取消); // 5. 重新选中所有子项 page.locator(input[typecheckbox]).check(); // 批量选中所有 checkbox // 6. 验证全选框又变回选中 isAllChecked page.locator(#selectAll).isChecked(); Assertions.assertTrue(isAllChecked, 所有子项选中后全选框应选中); System.out.println(✅ 全选/反选逻辑完美运行);}关键点- 使用check()和uncheck()方法直接操作比click()更明确。- 批量操作时page.locator(input[typecheckbox]).check()会选中页面上所有 checkbox谨慎使用建议加范围限制。- 注意业务逻辑全选通常需要监听子项的变化Playwright 的isChecked()可以实时反映状态。## 技巧四处理自定义样式的按钮有些项目使用 div、span 或第三方库如 Material-UI模拟单选/多选这些元素不是原生input标签无法直接使用check()方法。此时需要模拟点击并验证 CSS 类的变化。### 实战代码javaTestvoid testCustomRadioButton() { // 假设页面使用 div 模拟单选按钮选中时添加 classselected // div classradio-option>

相关新闻

紧急预警:当前主流AI配音SDK在多角色长对话场景下存在未披露的上下文坍塌风险——附自检工具与热修复补丁

紧急预警:当前主流AI配音SDK在多角色长对话场景下存在未披露的上下文坍塌风险——附自检工具与热修复补丁

2026/7/25 22:33:47

更多请点击: https://kaifayun.com 第一章:紧急预警:当前主流AI配音SDK在多角色长对话场景下存在未披露的上下文坍塌风险——附自检工具与热修复补丁 近期深度测试发现,包括ElevenLabs v4.2、Azure Neural TTS 2024-Q2、PlayHT S…

LZHAM多线程压缩实战:加速大型文件处理的最佳实践

LZHAM多线程压缩实战:加速大型文件处理的最佳实践

2026/7/25 22:33:47

LZHAM多线程压缩实战:加速大型文件处理的最佳实践 【免费下载链接】lzham_codec Lossless data compression codec with LZMA-like ratios but 1.5x-8x faster decompression speed, C/C 项目地址: https://gitcode.com/gh_mirrors/lz/lzham_codec LZHAM是一…

MARS-M训练损失曲线深度分析:为什么它能超越Moonlight?

MARS-M训练损失曲线深度分析:为什么它能超越Moonlight?

2026/7/25 22:23:47

MARS-M训练损失曲线深度分析:为什么它能超越Moonlight? 【免费下载链接】MARS The official implementation of MARS: Unleashing the Power of Variance Reduction for Training Large Models 项目地址: https://gitcode.com/gh_mirrors/mars11/MARS …

Codex 为什么越用越慢?大型项目中的上下文管理与方案选择

Codex 为什么越用越慢?大型项目中的上下文管理与方案选择

2026/7/25 23:34:01

刚开始使用 Codex 时,很多开发者会觉得效率非常高。只需要描述需求,它就能帮助分析代码、修改文件、补充测试,甚至完成一些原本需要手动排查很久的问题。但使用一段时间后,也有人发现:项目越大,Codex 响应越…

Adrenaline:Facebook Relay的轻量替代方案,如何用更简洁API实现声明式数据获取?

Adrenaline:Facebook Relay的轻量替代方案,如何用更简洁API实现声明式数据获取?

2026/7/25 23:34:01

Adrenaline:Facebook Relay的轻量替代方案,如何用更简洁API实现声明式数据获取? 【免费下载链接】adrenaline Simple Relay alternative 项目地址: https://gitcode.com/gh_mirrors/adre/adrenaline Adrenaline是一个轻量级的Facebook…

Codex 长任务频繁中断怎么办?从上下文管理到 ChatGPT Pro 选择

Codex 长任务频繁中断怎么办?从上下文管理到 ChatGPT Pro 选择

2026/7/25 23:34:01

使用 Codex 处理小任务时,体验通常比较顺畅:解释报错、补充函数、修改单个页面,往往几轮对话就能完成。但当任务变成项目重构、批量修改文件、运行测试并持续修复时,一些开发者会遇到新的问题:任务执行到一半停止&…

huststore API完全指南:从基础操作到高级功能的全面解析

huststore API完全指南:从基础操作到高级功能的全面解析

2026/7/25 23:34:01

huststore API完全指南:从基础操作到高级功能的全面解析 【免费下载链接】huststore High-performance Distributed Storage 项目地址: https://gitcode.com/gh_mirrors/hu/huststore huststore 是一款高性能分布式存储系统(High-performance Dis…

DeepSeek V4 API成本优化:缓存策略与批量处理的工程实践

DeepSeek V4 API成本优化:缓存策略与批量处理的工程实践

2026/7/25 23:34:01

最近在技术社群里,不少开发者都在讨论一个现象:DeepSeek V4 API在高峰时段的价格似乎出现了明显波动。作为一个长期关注AI工具成本优化的实践者,我决定深入分析一下这个现象背后的逻辑,以及我们作为使用者应该如何应对。1. 先搞清…

零代码配置:Codex客户端接入DeepSeek API打造免费AI编程助手

零代码配置:Codex客户端接入DeepSeek API打造免费AI编程助手

2026/7/25 23:24:00

如果你是一名开发者,最近可能已经注意到一个现象:身边越来越多的人开始讨论“Codex”和“DeepSeek”的组合。这背后反映了一个非常实际的痛点:我们渴望一个强大、智能的编程助手,但受限于网络环境、订阅费用或对国外服务的依赖&am…

微服务进阶:服务网格与Istio

微服务进阶:服务网格与Istio

2026/7/25 6:25:13

541|微服务进阶:服务网格与Istio 上篇文章我们聊了微服务的基本概念和拆分方法。 但微服务多了,问题也多了: 服务之间怎么通信? 怎么监控每个服务的调用链路? 熔断、限流、重试怎么做? 安全认证怎么统一? 以前这些都靠SDK库(比如Hystrix、Feign),每个服务都要集成…

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

零售超级终端全域协同:ShareKit 碰一碰商品流转业务落地案例

2026/7/24 19:29:25

一、零售门店全域协同业务背景与行业痛点 1.1 门店超级终端设备矩阵(连锁便利店/商超标准配置) 自助收银Kiosk一体机:顾客结算、自助核销优惠券、商品素材预览;运营折叠平板:店长后台商品上新、图片录入、活动配置、…

噗叽短视频界面分析

噗叽短视频界面分析

2026/7/25 9:26:35

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

挑战一天速通Spring全家桶!

挑战一天速通Spring全家桶!

2026/7/25 0:02:22

不知道各位Java好大哥们闲的时候会不会去关注Spring目前的官网,你会发现他的slogan是: Spring makes Java Simple。它让Java的开发变得更加简单。某种意义上来说:是Spring成就了Java!但随之而来的就是:由他之后诞生出来的各种组件…

挑战一天速通Java高并发!

挑战一天速通Java高并发!

2026/7/25 0:02:22

有出去面试的朋友肯定深有感受,像我们刚入行那会面试的加分项现在卷得已经成为了面试的基础题(手动狗头)。其中最典型的就属这个Java并发编程了。之前一般只有大厂才会有高并发编程相关的面试内容,但现在只要你入了Java行业就会涉…

从暴雪到米哈游都在用的平衡性评估框架,深度拆解LSTM+胜率归因分析法(附开源工具链)

从暴雪到米哈游都在用的平衡性评估框架,深度拆解LSTM+胜率归因分析法(附开源工具链)

2026/7/25 0:02:22

更多请点击: https://kaifayun.com 第一章:AI 游戏平衡性分析 现代游戏开发中,AI 不再仅用于控制 NPC 行为,更被深度整合进游戏平衡性调优流程。通过强化学习与对抗性仿真,AI 可以在数百万局对局中自动识别数值失衡点…