练习 Selenium execute_script 定位方法 — 独立专项练习页
本次作业练习 Selenium execute_script 高级操作:当 Selenium 常规 8 大定位受 shadow DOM / 滚动覆盖 / 禁用态等限制时,可用 driver.execute_script(...) 直接操作 DOM。请完成以下进阶任务,解锁 JavaScript 执行器的威力。
当 Selenium 常规 8 大定位受 shadow DOM / 滚动覆盖 / 禁用态等影响时,可调用浏览器原生 JS 接口。
getElementById — 绕过前端限制写入禁用 / 只读输入框
下方两个输入框,一个加了 disabled="disabled"(灰色禁用态),另一个加了 readonly="readonly"(只读态)。
常规 By.ID + send_keys() 会直接报错 ElementNotInteractableException,
必须通过 execute_script() 调用 document.getElementById() 先移除属性,再 .value = "..." 强制写入。
getElementsByName — 读取 / 修改 type=hidden 的表单字段
页面中经常存在 <input type="hidden" name="csrf_token" /> 等隐藏字段,用于防 CSRF 或跨页传参。
Selenium 中 By.NAME / By.CSS_SELECTOR + get_attribute('value') 虽然能读,但 send_keys() 对 hidden 元素会报 ElementNotVisibleException,
必须通过 document.getElementsByName() 取下标 [0] 再 .value = "..." 强制赋值。
getElementsByClassName — 批量修改一批无法直接选中的自定义组件
下方有 6 个"自定义徽章组件"(class="js-badge-pill"),它们用了特殊的自定义标签(非 button / input / a),
Selenium 中 By.CLASS_NAME 只能 find_elements 读取文字,无法批量切换状态;
而 document.getElementsByClassName() 返回 HTMLCollection,可 for 循环批量 .classList.toggle() 或 .dataset.xxx = "..."。
getElementsByTagName — 统计 / 操作 SVG / 自定义标签(非标准 HTML)
下方是一个 SVG 条形图(使用 <svg> / <rect> / <text> 等 SVG 标签)。
Selenium 中 By.TAG_NAME('rect') 对 SVG 命名空间常常取不到或 get_attribute 丢失,
必须通过 document.getElementsByTagName() 原生 SVG DOM 才能准确读取高度、宽度、y 坐标等属性。
querySelector — CSS 伪类 / 组合选择器定位(:checked / :disabled / + 兄弟)
Selenium 的 By.CSS_SELECTOR 对 :checked、:disabled、+、~ 等高级伪类 / 组合符 有时会因浏览器驱动版本差异导致匹配不准,
而 document.querySelector() 使用浏览器原生 CSS 引擎,100% 还原 CSS 规则。另外「嵌套在 shadow-root 里的元素」也只能用 JS 穿透。
By.* 和普通 document.querySelector 都无法直接穿透。.shadowRoot → 再在 shadowRoot 上调用 querySelector。querySelectorAll — 批量遍历 + 复杂 CSS 筛选(:nth-child / :not / [attr^=])
下方是一张混合状态的任务列表。Selenium 中 组合多个 CSS 伪类(如 :nth-child(even) + :not(.done))后 find_elements 常因浏览器差异匹配不到;
document.querySelectorAll() 可直接写完整 CSS 表达式,返回静态 NodeList,再 .forEach() 批量操作。
本区域用于展示:使用 execute_script()(JS 执行器)调用原生 DOM API 查询 / 操作元素后,返回的查询结果或触发动作的反馈。
当前尚无操作记录
请尝试:点击下方 6 个练习目标的各操作按钮(getElementById 解除禁用 / getElementsByName 改隐藏字段 / getElementsByClassName 批量激活徽章 / getElementsByTagName 读 SVG / querySelector 解锁按钮 / querySelectorAll 批量标记任务)。
本日志仅展示效果,方便你在 Selenium 脚本里用 By.ID, "action-log" 读取后断言操作是否成功执行。