《刚刚问世》系列初窥篇-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在多角色长对话场景下存在未披露的上下文坍塌风险——附自检工具与热修复补丁

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

2026/8/21 7:33:03 阅读更多 →
LZHAM多线程压缩实战:加速大型文件处理的最佳实践

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

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是一…

2026/8/20 20:32:02 阅读更多 →
Kubernetes集群etcd备份与恢复实战指南

Kubernetes集群etcd备份与恢复实战指南

1. 为什么需要Kubernetes备份方案上周隔壁团队经历了惊魂一刻——由于存储系统故障导致整个Kubernetes集群的etcd数据库损坏,所有部署信息、配置和状态数据全部丢失。这个真实的灾难场景让我意识到,在生产环境中,完善的备份恢复方案不是可选项…

2026/8/19 19:00:43 阅读更多 →

最新新闻

6G显存本地部署4K AI视频生成:ComfyUI工作流与性能优化指南

6G显存本地部署4K AI视频生成:ComfyUI工作流与性能优化指南

这次我们来看一个能让6G显存显卡跑起4K AI视频生成的项目。核心是利用ComfyUI这个本地化、模块化的AI工作流工具,配合特定的图生视频工作流,在有限的硬件资源下实现高清视频内容的生成。对于手头只有40系或50系入门级显卡(如RTX 4060、RTX 50…

2026/8/24 5:57:04 阅读更多 →
2026年AI招聘工具真相:自研大模型的技术陷阱与动态架构革命

2026年AI招聘工具真相:自研大模型的技术陷阱与动态架构革命

1. 2026年AI招聘工具的技术真相:自研大模型的营销泡沫在2026年的人力资源数字化采购季,我注意到一个令人担忧的现象:超过70%的企业CIO在选型AI招聘工具时,都会不约而同地问出同一个问题——"你们用的是自研大模型吗&#xff…

2026/8/24 5:57:04 阅读更多 →
从流程图到状态机:嵌入式开发中的事件驱动编程范式

从流程图到状态机:嵌入式开发中的事件驱动编程范式

1. 从“流程图”到“状态机”:一个被误解的思维模型 很多刚接触“状态机”这个概念的朋友,第一反应往往是:“这不就是个流程图吗?” 我最初也是这么想的,直到在一个嵌入式项目里,因为用“流程图思维”去处理…

2026/8/24 5:57:04 阅读更多 →
自动驾驶制动系统:线控制动原理与量产落地关键

自动驾驶制动系统:线控制动原理与量产落地关键

1. 制动系统:自动驾驶里那个“从不抢话却永远压轴出场”的关键角色很多人聊自动驾驶,张口就是激光雷达、高精地图、决策规划——这些确实是台前明星。但真要让一辆车在雨夜湿滑路面上,从80km/h刹停在斑马线前30厘米,或者在儿童突然…

2026/8/24 5:57:04 阅读更多 →
完整跑通 tmom 多厂区 MOM/MES 系统:从部署到车间过站的实操手册

完整跑通 tmom 多厂区 MOM/MES 系统:从部署到车间过站的实操手册

完整跑通 tmom 多厂区 MOM/MES 系统:从部署到车间过站的实操手册 【免费下载链接】tmom 支持多厂区/多项目级的mom/mes系统,计划排程、工艺路线设计、在线低代码报表、大屏看板、移动端、AOT客户端...... 目标是尽可能打造一款通用的生产制造系统。前端基…

2026/8/24 5:57:03 阅读更多 →
江苏省中医院考研复试逆袭攻略:专业笔试与面试技巧

江苏省中医院考研复试逆袭攻略:专业笔试与面试技巧

1. 复试准备的核心逻辑江苏省中医院作为华东地区中医临床与科研重镇,每年考研复试竞争异常激烈。2025届复试中,我以笔试第三、复试第一的成绩逆袭上岸,这套方法经过实战检验具有可复制性。1.1 复试的底层考核维度不同于初试侧重知识点记忆&am…

2026/8/24 5:56:03 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/22 3:22:48 阅读更多 →