练习 By.XPATH 定位方法的核心实操与效果验证
本页面提供 By.XPATH 定位方法的完整练习场景。页面包含练习要求描述卡(方法概念 + Selenium 示例 + 练习清单)和定位后操作效果展示区域,在输入框输入内容、点击按钮、勾选选择框时,效果展示区会实时显示对应卡片。
最强大通用的定位方法,支持相对路径、属性组合、文本匹配、父子兄弟轴、索引、函数等,适用 99% 场景。
//、索引 [n](从 1 开始)、属性 [@attr='val']、函数 contains() / starts-with() / text() / normalize-space() / last()、逻辑运算 and/or、轴定位 parent::*/following-sibling::*。// 而不是绝对路径 /html/body/...;索引用括号包起来再 [n];单双引号嵌套避免报错。
from selenium import webdriver from selenium.webdriver.common.by import By # 1) 多属性:商品表格,通过 name + data‑cat 属性组合完成元素定位 p = driver.find_element(By.XPATH, "//*[@data-name='无线鼠标' and @data-cat='数码配件']") # 2) 轴定位:先匹配订单号以202608开头的元素节点,再使用following‑sibling兄弟轴,筛选获取同订单卡片下的付款按钮 btn = driver.find_element(By.XPATH, "//*[starts-with(@data-oid,'NO202608')]/following-sibling::div//button[@data-act='pay']") # 3) 购物商城分类侧边栏:利用contains(.,'电子产品')定位侧边栏分类项,通过父子层级关系,向下查找该分类下对应的商品。 cat = driver.find_element(By.XPATH, "//*[@class='xc-sidebar']//*[contains(normalize-space(),'电子产品')]") items = driver.find_elements(By.XPATH, "//div[contains(@class,'xc-goods')]")
//tr[@data-id='P003']//button 或 //tr[td[contains(.,'键盘')]]//button[@data-act='edit']//input[@disabled](会员编号) ② 读取已勾选 radio //input[@type='radio' and @checked](保密) ③ 读取已勾选兴趣 checkbox //input[@type='checkbox' and @checked](默认 2 个);试试 //input[starts-with(@name,'xc_') and @checked],为什么多了 1 个? ④ 点击读取按钮//*[starts-with(@data-oid,'NO202608')] ② @data-status 过滤待付款 //*[@data-status='pending'](命中 2 张:NO20260802 / NO20260806) ③ 点击「立即付款」按钮:按钮没有 data 属性,推荐用"先拿卡片容器 → 容器内找按钮文字"的组合定位;进阶用 ancestor 轴从订单号跳到按钮操作步骤:
① 用 data-id 属性锁定行 → //tr[@data-id='P003']
② 文本包含匹配 → //tr[td[contains(.,'键盘')]]
③ 组合定位行内按钮 → //tr[@data-id='P003']//button[@data-act='edit']
④ 点击任意行的「查看/编辑/删除」按钮,观察效果区记录
| SKU | 商品名 | 分类 | 库存 | 状态 | 操作 |
|---|---|---|---|---|---|
| SKU-001 | 机械键盘 | 数码配件 | 128 | 在售 | |
| SKU-002 | 无线鼠标 | 数码配件 | 256 | 在售 | |
| SKU-003 | A4 打印纸(箱) | 办公用品 | 0 | 缺货 | |
| SKU-004 | 精品咖啡豆 | 食品饮料 | 77 | 在售 | |
| SKU-005 | Selenium 实战圣经 | 图书文娱 | 32 | 下架 | |
| SKU-006 | USB-C 扩展坞 | 数码配件 | 41 | 在售 |
操作步骤:
① 读取 disabled 会员编号 → driver.find_element(By.XPATH, "//input[@disabled]").get_attribute("value")
② 读取已勾选性别 radio → driver.find_element(By.XPATH, "//input[@type='radio' and @checked]").get_attribute("value")(页面默认是 O=保密)
③ 读取已勾选兴趣 checkbox → hobby_list = driver.find_elements(By.XPATH, "//input[@type='checkbox' and @checked]"),默认勾选 2 个;试试改成 //input[starts-with(@name,'xc_') and @checked],为什么变成 3 个了?(因为把已勾选 radio 也算进去了,starts-with 是前缀匹配,不管 type)
④ 点击「读取当前表单」观察效果区输出
操作步骤:
① 用 starts-with 批量匹配订单号前缀 NO202608 → //*[starts-with(@data-oid,'NO202608')](6 张全命中)
② 叠加 data-status 过滤待付款 → //*[starts-with(@data-oid,'NO202608') and @data-status='pending'](命中 2 张:NO20260802 和 NO20260806)
③ 点击「立即付款」按钮 —— 这里的难点:按钮没有 data 属性,怎么定位?
a) 先定位到 pending 卡片容器 → pending = driver.find_element(By.XPATH, "//*[@data-status='pending']")(默认取第一张)
b) 在容器内找按钮文字 → pending.find_element(By.XPATH, ".//button[text()='立即付款']").click()(注意 XPath 要以 . 开头表示"从当前节点往下找",否则又是全局搜索)
c) 也可以用 following-sibling 轴从订单号跳到按钮://span[contains(.,'NO20260802')]/ancestor::*[@data-status='pending']//button[text()='立即付款']
④ 点击后观察:Toast 提示「发起支付流程」+ 效果区新增一行「订单卡片操作」日志(页面状态不会真的变化,这只是演示交互)
操作步骤:
① 点击侧边栏分类按钮筛选商品 → //aside[@id='xc_sidebar']//button
② 修改商品数量后加购 → //button[contains(@class,'btn-add-cart')]
③ 点击「立即结算」打开结算模态 → //div[@id='xc_checkout_modal'],查看小计/运费/满减计算
④ 点击「去支付」打开支付模态 → //div[@id='xc_pay_modal'],模拟付款完成
当前尚无操作记录
请尝试:① 商品表 view/edit/del 或库存合计 ② 读取/提交/重置会员资料 ③ 订单卡付款/详情/取消/确认收货 ④ 购物商城分类→加减数量→加购→结算→支付