场景网页使用 Playwright 勾选 Element UI 表格el-table中匹配病人的行。## 一、问题描述在 el-table 中勾选匹配病人的行时遇到三个问题1. 表格里**部分行的复选框根本不可选**被 CSS 隐藏但代码识别不出来导致对这些行执行勾选动作。2. 对不可选行调用 locator.click() / check() 时操作**一直卡在 waiting...**最终报 Timeout exceeded默认等 30 秒设短超时后等 2 秒。3. 同时有些行**一开始就已经被勾上了**is-checked再点会把它取消掉。## 二、排查与尝试过程### 尝试 1用 isDisabled() 判断可选性 —— 失败原以为不可选行会有 disabled 属性。但打印两个 input 的 outerHTML 后发现两者完全一致htmlinput typecheckbox aria-hiddenfalse classel-checkbox__original value都没有 disabled结果 isDisabled() 对两行都返回 falseif (!disabled) 走进了不可选行并卡死。### 尝试 2检查 pointer-events / is-disabled 类 —— 方向偏了打印 label 完整 HTML 后发现两行都是 pointerEvents: auto、都没有 is-disabled 类即不是 CSS 禁用也不是原生禁用。但第 1 行 label 带 is-checked——说明它是**已勾选**不是不可选。### 尝试 3拿到完整 tbody 才看到真信号 —— 成功定位完整 HTML 显示选择列 td 的差异- 可选行td class...el-table-column--selection undefined- 不可选行td class...el-table-column--selection hiddenTdCheckbox**关键差异是选择列 td 上的 hiddenTdCheckbox 类**——它用 CSS 把勾选框藏起来所以不可选。之前的 disabled / is-disabled 思路都没打到点。### 卡死原因click() 默认要等元素「可见、稳定、能接收事件」hiddenTdCheckbox 行被隐藏永远不满足于一直接 waiting 直到超时。## 三、最终解决方法### 1. 用 hiddenTdCheckbox 类识别不可选行提前跳过真实信号tsconst selClass (await row.locator(td.el-table-column--selection).getAttribute(class)) ?? ;if (selClass.includes(hiddenTdCheckbox)) continue; // 不可选跳过### 2. 用 isChecked() 跳过已勾选行防止点一下反被取消tsconst input row.locator(input.el-checkbox__original);if (await input.isChecked()) continue;### 3. 用 evaluate 触发勾选彻底避免等待/卡死tsawait input.evaluate((el: HTMLInputElement) el.click());evaluate 是浏览器内同步立即执行不做任何 actionability 等待不会被隐藏/失稳元素卡住。### 4. 兜底短超时 try/catch 保证不卡流程tstry {await row.locator(.el-checkbox__inner).click({ timeout: 2000 });} catch (e) {console.log(点击失败跳过 (e as Error).message);}## 四、完整逻辑tsconst n await rows.count();for (let i 0; i n; i) {const row rows.nth(i);const selClass (await row.locator(td.el-table-column--selection).getAttribute(class)) ?? ;if (selClass.includes(hiddenTdCheckbox)) continue; // 不可选行跳过const input row.locator(input.el-checkbox__original);if (await input.isChecked()) continue; // 已勾选跳过await input.evaluate((el: HTMLInputElement) el.click()); // 勾选未选行}## 五、核心结论- Element UI 表格「不可选」行的判定信号是选择列 td 的 **hiddenTdCheckbox 类CSS 隐藏**不是 disabled 属性。- 勾选动作用 evaluate 触发比 click() / check() 更稳不会被隐藏 / 重渲染元素卡住。- force: true 不是「不等待」隐藏元素仍会超时必须用 hiddenTdCheckbox 类提前跳过。