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

发布时间:2026/9/22 23:38:43

《刚刚问世》系列初窥篇-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/9/22 23:37:49

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

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

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

2026/9/22 23:37:56

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/9/8 9:50:25

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 …

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/21 18:38:46

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/21 18:41:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/21 18:36:40

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/21 18:37:26

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/21 18:40:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/21 18:36:17

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/22 0:19:28

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/21 23:38:13

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/22 0:48:53

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…