元素定位综合练习平台

练习 Selenium 8 种常规定位方法

页面导读

本页面提供 9 种 Selenium 定位方法的完整练习场景。每个模块均包含练习要求描述卡(方法概念 + Selenium 示例 + 练习清单)和定位后操作效果展示区域,在输入框输入内容、点击按钮、勾选选择框时,效果展示区会实时显示对应卡片。

点击下方卡片可跳转到对应方法的独立练习页面进行专项训练,或在本页下方按顺序逐个练习。

方法 1:By.ID — 通过 id 属性定位

利用元素全局唯一的 id 属性直接定位,是最稳定、最快的定位方式之一。

练习要求 · 方法 1:By.ID
📌 方法概念
原理:通过 id 属性全局唯一定位单个元素;浏览器原生对 id 查询做了底层优化(哈希表),因此执行速度最快、结果最稳定。
适用场景:元素 id 唯一、不动态变化、语义明确的场景(按钮、输入框、表单、搜索框)。
注意事项:需确认 id 在整个 HTML 中全局唯一;动态生成的 id(如 j_id123、带随机数字的)不要用;优先找带有业务语义的 id。
💻 Selenium 示例(Python)
from selenium import webdriver
from selenium.webdriver.common.by import By
# 1) 定位单个按钮(登录按钮 / 提交按钮 / 搜索按钮)
driver.find_element(By.ID, "attr_id_btn_login").click()
# 2) 定位搜索框输入关键词后回车
driver.find_element(By.ID, "attr_id_search_input").send_keys("Selenium入门")
# 3) 先通过父容器 ID 定位 再找子元素(组合定位)
form = driver.find_element(By.ID, "attr_id_login_form")
form.find_element(By.ID, "attr_id_login_user").send_keys("admin")
📋 本节练习清单
  • ✅ 练习目标 1:登录表单 — 首先定位用户名输入框并输入用户名 By.ID, "attr_id_login_user";接着定位密码输入框并输入密码 By.ID, "attr_id_login_pwd";然后定位并勾选“7天内记住我”复选框By.ID, "attr_id_remember_me";最后定位并点击登录按钮 By.ID, "attr_id_btn_login"
  • ✅ 练习目标 2:搜索框 — 首先定位搜索框并输入关键词 By.ID, "attr_id_search_input";接着定位搜索按钮并点击 By.ID, "attr_id_btn_search";拓展:用 get_attribute("value") 读取搜索框当前值
  • ✅ 练习目标 3:商品面板 + 购物车 — 首先定位并点击任意商品「加入购物车」按钮;接着观察购物车数量变化 By.ID, "attr_id_cart_count";最后观察购物车状态文字变化 By.ID, "attr_id_cart_status"

练习目标 1:登录表单(id="attr_id_login_form")

操作步骤:
① 定位用户名 → driver.find_element(By.ID, "attr_id_login_user").send_keys("admin")
② 定位密码 → driver.find_element(By.ID, "attr_id_login_pwd").send_keys("123456")
③ 定位记住我复选框 → driver.find_element(By.ID, "attr_id_remember_me").click()
④ 定位登录按钮 → driver.find_element(By.ID, "attr_id_btn_login").click(),观察 Toast 提示


练习目标 2:搜索框(id="attr_id_search_input" / "attr_id_btn_search")

操作步骤:
① 定位搜索框输入关键词 → driver.find_element(By.ID, "attr_id_search_input").send_keys("Pytest")
② 定位搜索按钮点击 → driver.find_element(By.ID, "attr_id_btn_search").click(),观察结果面板显示匹配关键词的商品
③ 拓展:读取搜索框当前值 → driver.find_element(By.ID, "attr_id_search_input").get_attribute("value")

热门搜索: Selenium 元素定位 Pytest 单元测试 自动化测试框架 XPath 轴定位 CSS 选择器伪类

练习目标 3:商品面板 + 购物车(id="attr_id_cart_count" / "attr_id_cart_status")

操作步骤:
① 点击任意商品卡片的「加入购物车」按钮,观察效果区记录
② 验证数量累加 → driver.find_element(By.ID, "attr_id_cart_count").text
③ 验证状态文字 → driver.find_element(By.ID, "attr_id_cart_status").text

购物车目前是空的。
0 件商品
HOTNEW
Selenium 自动化实战
Python + Pytest 全套教程
¥299
HOT
接口自动化高级篇
Requests + Allure 报告实战
¥399
NEW
性能测试 JMeter
从入门到压测实战
¥199
HOTNEW
测试开发架构师
平台开发 + 持续集成
¥499

定位后操作效果展示区域

本区域用于展示:使用 By.ID 定位到上方登录框/搜索框/商品加购按钮后执行操作的真实反馈结果。

当前尚无操作记录

请尝试:① 填写登录表单并点击登录 ② 在搜索框输入关键词点击搜索或点击热词 ③ 点击商品卡片「加入购物车」。


方法 2:By.NAME — 通过 name 属性定位

name 常用于表单元素(input[type=text/radio/checkbox/hidden] / select / textarea),是操作表单的首选。

练习要求 · 方法 2:By.NAME
📌 方法概念
原理:通过 HTML 元素的 name 属性定位;在表单提交时,name=value 会以键值对形式传递给后端,因此表单元素几乎都有 name。
适用场景:表单操作(输入文字、单选、多选、下拉选择、提交/重置)、同名多值元素(如 radio group 性别、checkbox 爱好)。
注意事项:name 可能不唯一,需使用 find_elements 取下标 [0]/[1]/[2] 或按 value 二次过滤;type=hidden 元素需 JS 才能设置。
💻 Selenium 示例(Python)
from selenium import webdriver
from selenium.webdriver.common.by import By
# 1) 定位用户名输入框(name="nameForm1_username")
driver.find_element(By.NAME, "nameForm1_username").send_keys("zhangsan")
# 2) 定位 radio group 选性别女(多个同名按下标)
genders = driver.find_elements(By.NAME, "nameForm1_gender")
for g in genders:
    if g.get_attribute("value") == "F": g.click()
# 3) 组合定位:name 表单容器 + 再找子元素
form = driver.find_element(By.ID, "nameForm1_form")
form.find_element(By.NAME, "nameForm1_submit").click()
📋 本节练习清单
  • ✅ 练习目标 1:新用户注册表单 — ① 填写姓名/邮箱/手机号/城市 By.NAME, "nameForm1_username" 等 4 个输入框 ② 勾选性别 radio(name=nameForm1_gender)和爱好 checkbox(name=nameForm1_hobby,可多选) ③ 勾选「同意用户协议」→ 点击提交按钮观察 Toast + 效果区记录

练习目标 1:新用户注册表单(By.NAME 定位各表单元素)

操作步骤:
① 填写 4 个输入框 → 姓名 driver.find_element(By.NAME, "nameForm1_username").send_keys("张三"),同理 邮箱 / 电话 / 城市
② 勾选性别 radio → find_elements(By.NAME, "nameForm1_gender") 再按下标或 value 过滤;爱好 checkbox(name=nameForm1_hobby)可多选
③ 勾选「同意用户协议」→ driver.find_element(By.NAME, "nameForm1_agree"),点击提交按钮观察 Toast + 效果区记录

新用户注册

练习 By.NAME 定位:单选框 radio、多选框 checkbox、下拉选中框 select、提交按钮

定位后操作效果展示区域

本区域用于展示:使用 By.NAME 定位到上方注册表单后,执行「输入 / 选单选 / 勾选多选 / 选择城市 / 提交注册」等操作的真实反馈结果。

当前尚无操作记录

请尝试:① 填写「姓名 / 邮箱 / 手机号」② 选择「性别」单选 ③ 勾选多个「兴趣爱好」 ④ 选择城市 + 同意条款 ⑤ 点击「提交注册」按钮。


方法 3:By.CLASS_NAME — 通过 class 属性定位

CLASS_NAME 只接受单个 class 名(不能包含空格!),通常用于批量获取一组同类元素。

练习要求 · 方法 3:By.CLASS_NAME
📌 方法概念
原理:通过元素的一个 class 名称定位;匹配所有 classList 中包含该名称的元素(多个 class 元素也能定位其中任何一个)。
适用场景:批量统计同类元素(如一组标签卡片、用户头像、商品卡片、列表项)、或页面中 class 语义明确且唯一的特殊元素。
注意事项:只能传「单个 class 名」,不能有空格!如元素 class="demo-btn green" 必须分别用 demo-btngreen,不能一起传;多 class 组合请用 By.CSS_SELECTOR。
💻 Selenium 示例(Python)
from selenium import webdriver
from selenium.webdriver.common.by import By
# 1) 定位单个 class="avatar-name" 的第一个用户卡片
first_user = driver.find_element(By.CLASS_NAME, "attrClass_avatar_name")
print(first_user.text)
# 2) find_elements 批量读取所有 5 个标签卡片文字
tags = driver.find_elements(By.CLASS_NAME, "attrClass_tag_box")
for t in tags: print(t.text)
# 3) 组合定位:先 CLASS 取用户卡片容器,再找内部姓名/职位
cards = driver.find_elements(By.CLASS_NAME, "attrClass_img_card")
for c in cards:
    name = c.find_element(By.CLASS_NAME, "attrClass_avatar_name").text
    role = c.find_element(By.CLASS_NAME, "attrClass_avatar_role").text
# 4) 进阶:订单卡组合定位 — 遍历所有订单容器,在每张卡内部读取状态/金额,做统计或过滤
orders = driver.find_elements(By.CLASS_NAME, "attrClass_order_card")
for o in orders:
    st    = o.find_element(By.CLASS_NAME, "attrClass_order_status").text
    amount = o.find_element(By.CLASS_NAME, "attrClass_order_amount").text
    print(st, amount)
📋 本节练习清单
  • ✅ 练习目标 1:技术标签卡片find_elements(By.CLASS_NAME, "attrClass_tag_box") 拿到 5 个卡片,按索引点击每个卡片并获取文字内容
  • ✅ 练习目标 2:用户头像卡片(组合定位) — 先 find_elements(By.CLASS_NAME, "attrClass_img_card") 拿到 3 张卡片容器,再每张卡内部 card.find_element(By.CLASS_NAME, "attrClass_avatar_name") / attrClass_avatar_role 读取姓名和职位
  • ✅ 练习目标 3:订单卡片(组合定位进阶) — 先拿 6 张 attrClass_order_card 容器,每张内部再用 class 定位 4 个子元素;完成:a. 按状态统计数量(已付款×2 / 已发货×1 / 待付款×1 / 已完成×1 / 已取消×1)b. 筛选金额 ≥ 500 的大订单(1280.50 和 899.00 共 2 张)c. 确认页面上 5 种状态徽章都能被 find_element 找到

练习目标 1:技术标签卡片(class="attrClass_tag_box",共 5 个)

操作步骤:
① 批量获取 5 个卡片 → tags = driver.find_elements(By.CLASS_NAME, "attrClass_tag_box")
② 遍历点击每个卡片 → for t in tags: t.click()
③ 获取文字内容 → tags[0].text

自动化测试 Selenium Appium Playwright Pytest

练习目标 2:用户头像卡片(class="attrClass_img_card",共 3 个)

操作步骤(组合定位:先拿容器,再容器内部找子元素):
① 先拿 3 张卡片容器 → cards = driver.find_elements(By.CLASS_NAME, "attrClass_img_card")
② 每张卡内部找姓名 → cards[0].find_element(By.CLASS_NAME, "attrClass_avatar_name").text
③ 每张卡内部找职位 → cards[0].find_element(By.CLASS_NAME, "attrClass_avatar_role").text

avatar
李小华
测试工程师
avatar
王大伟
开发工程师
avatar
赵敏
产品经理

练习目标 3:订单卡片(外层 class="attrClass_order_card",内层 4 个子 class)

操作步骤(组合定位进阶:容器 → 内部子元素):
① 拿 6 张订单卡片容器 → orders = driver.find_elements(By.CLASS_NAME, "attrClass_order_card")
② 每张卡内部读状态 + 金额 → status = orders[i].find_element(By.CLASS_NAME, "attrClass_order_status").textamount = float(orders[i].find_element(By.CLASS_NAME, "attrClass_order_amount").text)
③ 完成三个小任务:
  a. 按状态统计数量 → 已付款=2 / 已发货=1 / 待付款=1 / 已完成=1 / 已取消=1
  b. 筛选金额 ≥ 500 的大订单 → 1280.50 和 899.00 共 2 张
  c. 确认 5 种状态徽章都能被找到 → 分别 find_element(By.CSS_SELECTOR, ".attrClass_order_status.paid") 等 5 种

DD20260829-001
李小华 299.00
DD20260829-002 已发货
王大伟 1280.50
DD20260829-003 待付款
赵敏 59.90
DD20260829-004 已完成
陈强 899.00
DD20260829-005
周婷 456.00
DD20260829-006 已取消
吴昊 199.00
🛠 组合定位练习辅助

定位后操作效果展示区域

本区域用于展示:使用 By.CLASS_NAME 定位到上方标签卡/用户卡/订单卡后,点击或批量读取文字内容的真实反馈结果。

当前尚无操作记录

请尝试:① 点击「技术标签」卡片 ② 点击「用户头像」卡片 ③ 点击「订单卡片」观察组合定位 ④ 用 find_elements 批量读取标签或订单。


方法 4:By.TAG_NAME — 通过 HTML 标签名定位

TAG_NAME 返回所有同名标签的集合,适合遍历表格 tr/td、图片列表 img、超链接 a、按钮 button 等。

练习要求 · 方法 4:By.TAG_NAME
📌 方法概念
原理:通过 HTML 原生标签名(如 <a>、<input>、<button>、<img>、<tr>、<td>)定位所有同名标签;绝大多数场景配合 find_elements 批量获取。
适用场景:统计链接数量、批量读取图片 alt 列表、遍历表格每一行数据、获取页面中所有按钮并依次点击。
注意事项:TAG_NAME 返回通常元素很多,一定要二次过滤(按属性、按位置、按父容器);<input> 要区分 type=text/email/password/hidden。
💻 Selenium 示例(Python)
from selenium import webdriver
from selenium.webdriver.common.by import By
# 1) 统计当前页面所有 <a> 超链接
links = driver.find_elements(By.TAG_NAME, "a")
print("链接总数:", len(links))
# 2) 读取所有 <img> 的 alt 属性(检查是否合规)
imgs = driver.find_elements(By.TAG_NAME, "img")
for img in imgs: print(img.get_attribute("alt"))
# 3) 组合:先 id 找学生表格 → 再 TAG_NAME('tr') 遍历每行
tbl = driver.find_element(By.ID, "tag_student_table")
rows = tbl.find_elements(By.TAG_NAME, "tr")
for r in rows:
    cells = r.find_elements(By.TAG_NAME, "td")
    print([c.text for c in cells])
📋 本节练习清单
  • ✅ 练习目标 1:TAG_NAME 统计 + 按钮点击 — 点击页面上的「统计链接/输入框/按钮」按钮,记下显示数字(基准值),再用 len(driver.find_elements(By.TAG_NAME, "a")) / "input" / "button" 对比两边数量是否一致;尝试两种写法:find_elements 过滤 vs find_element 精确定位
  • ✅ 练习目标 2:3 张风景图片find_elements(By.TAG_NAME, "img") 批量获取,按下标取每张图、读取 alt 属性;点击图片后效果区记录图编号和 alt 值
  • ✅ 练习目标 3:学生表格 4 行 — 先 id 拿 table,再 TAG_NAME('tr') 取 rows,每行 TAG_NAME('td') 取 4 列(学号/姓名/年龄/班级),点击任意行查看详细数据

练习目标 1:TAG_NAME 统计 + 按钮点击(累加计数)

操作步骤:
① 页面场景包含:5 个 <a>、4 个 <input>、3 个 <button>
② 点击页面上的统计按钮,记下显示数字(基准值)
③ 对比:len(driver.find_elements(By.TAG_NAME, "a")) 等,和页面基准值应一致
④ 点击 3 个统计按钮,观察「最近一次点击」显示的按钮名和 id;尝试两种写法:buttons = driver.find_elements(By.TAG_NAME, "button") 再过滤 vs driver.find_element(By.ID, "tag_btn_links") 精确定位

按钮点击计数: 您已点击按钮 0
🎯 最近一次点击: id=""
💡 用 Selenium 验证:buttons = driver.find_elements(By.TAG_NAME,"button") 再过滤出 3 个统计按钮,或直接精确定位 driver.find_element(By.ID,"tag_btn_links")、 driver.find_element(By.ID,"tag_btn_inputs")、 driver.find_element(By.ID,"tag_btn_buttons")

练习目标 2:风景图片(TAG_NAME('img'),共 3 张)

操作步骤:
① 批量获取 3 张图 → imgs = driver.find_elements(By.TAG_NAME, "img")
② 按下标取每张 → imgs[0](山脉)/ imgs[1](湖泊)/ imgs[2](城市)
③ 读取 alt 属性 → imgs[0].get_attribute("alt")

风景图-山脉(id=tag_img_1) 风景图-湖泊(id=tag_img_2) 风景图-城市(id=tag_img_3)

练习目标 3:学生表格(TAG_NAME('tr') / TAG_NAME('td'),共 4 行数据)

操作步骤(组合定位:先拿 table 容器,再内部取行和列):
① 先 id 拿 table → table = driver.find_element(By.ID, "tag_student_table")
② 内部取所有 tr → rows = table.find_elements(By.TAG_NAME, "tr")(会拿到表头 + 4 行数据)
③ 每行取 4 列 → cells = rows[1].find_elements(By.TAG_NAME, "td"),cells[0] 学号 / cells[1] 姓名 / cells[2] 年龄 / cells[3] 班级
④ 点击任意行查看详细数据

学号姓名年龄班级
A001张三20软件1班
A002李四21软件2班
A003王五19计科1班
A004赵六22计科2班

定位后操作效果展示区域

本区域用于展示:使用 By.TAG_NAME(a / input / button / img / tr / td 等)定位到一组标签后,执行批量统计、读取 alt、遍历表格行等操作反馈。

当前尚无操作记录

请尝试:① 点击 3 个「统计数量」按钮 ② 点击 5 个导航链接或聚焦输入框 ③ 点击任意风景图(查看alt) ④ 点击学生表格任意行。




方法 7:By.XPATH — 通过 XPath 表达式定位

最强大通用的定位方法,支持相对路径、属性组合、文本匹配、父子兄弟轴、索引、函数等,适用 99% 场景。

练习要求 · 方法 7:By.XPATH
📌 方法概念
原理:在 XML/HTML DOM 树中用路径表达式导航到节点;支持相对路径 //、索引 [n](从 1 开始)、属性 [@attr='val']、函数 contains() / starts-with() / text() / normalize-space() / last()、逻辑运算 and/or、轴定位 parent::*/following-sibling::*
适用场景:表格行按内容找操作按钮、动态 id、多属性组合、父子兄弟轴相对定位、找不到稳定 CSS 选择器时兜底。
注意事项:优先用相对路径 // 而不是绝对路径 /html/body/...;索引用括号包起来再 [n];单双引号嵌套避免报错。
💻 Selenium 示例(Python)
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')]")
📋 本节练习清单
  • ✅ 练习目标 1:商品管理表格 — 根据 data-id/data-cat/data-status 等属性组合定位「查看/编辑/删除」按钮://tr[@data-id='P003']//button//tr[td[contains(.,'键盘')]]//button[@data-act='edit']
  • ✅ 练习目标 2:会员资料表单 — ① 读取 disabled 元素 //input[@disabled](会员编号) ② 读取已勾选 radio //input[@type='radio' and @checked](保密) ③ 读取已勾选兴趣 checkbox //input[@type='checkbox' and @checked](默认 2 个);试试 //input[starts-with(@name,'xc_') and @checked],为什么多了 1 个? ④ 点击读取按钮
  • ✅ 练习目标 3:订单卡片 — ① starts-with 匹配订单号前缀 //*[starts-with(@data-oid,'NO202608')] ② @data-status 过滤待付款 //*[@data-status='pending'](命中 2 张:NO20260802 / NO20260806) ③ 点击「立即付款」按钮:按钮没有 data 属性,推荐用"先拿卡片容器 → 容器内找按钮文字"的组合定位;进阶用 ancestor 轴从订单号跳到按钮
  • ✅ 练习目标 4:购物商城 — 依次定位分类侧边栏筛选商品 → 加入购物车 → 立即结算(计算小计/运费/满减)→ 去支付(模拟付款)

练习目标 1:商品管理表格(共 6 行,表格行具有data-id、data‑cat、data‑status业务属性)

操作步骤:
① 用 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-003A4 打印纸(箱)办公用品0缺货
SKU-004精品咖啡豆食品饮料77在售
SKU-005Selenium 实战圣经图书文娱32下架
SKU-006USB-C 扩展坞数码配件41在售

练习目标 2:会员资料表单(disabled + radio checked + starts-with 练习)

操作步骤:
① 读取 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)
④ 点击「读取当前表单」观察效果区输出

会员资料

练习 XPath:disabled 属性、@checked、starts-with(@name,'xc_')、多属性 and 组合


练习目标 3:订单卡片(6 张;starts-with NO202608 + data-status + 轴定位「付款」按钮)

操作步骤:
① 用 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 提示「发起支付流程」+ 效果区新增一行「订单卡片操作」日志(页面状态不会真的变化,这只是演示交互)

NO20260801已付款
商品:机械键盘 ×1
金额:¥399
下单时间:2026-08-22 10:12
NO20260802待付款
商品:4K 显示器 ×1
金额:¥1899
下单时间:2026-08-22 11:34
NO20260803已取消
商品:无线鼠标 ×2
金额:¥258
下单时间:2026-08-21 22:47
NO20260804已发货
商品:笔记本支架 ×1
金额:¥89
下单时间:2026-08-21 18:05
NO20260805已付款
商品:精品咖啡豆 ×3
金额:¥297
下单时间:2026-08-20 09:20
NO20260806待付款
商品:USB-C 扩展坞 ×1
金额:¥459
下单时间:2026-08-19 20:15

练习目标 4:购物商城(分类筛选 → 加购 → 结算 → 支付)

操作步骤:
① 点击侧边栏分类按钮筛选商品 → //aside[@id='xc_sidebar']//button
② 修改商品数量后加购 → //button[contains(@class,'btn-add-cart')]
③ 点击「立即结算」打开结算模态 → //div[@id='xc_checkout_modal'],查看小计/运费/满减计算
④ 点击「去支付」打开支付模态 → //div[@id='xc_pay_modal'],模拟付款完成

5 种商品
购物车:0
数码
机械键盘(青轴)
¥399
办公
A4 复印纸 5 包装
¥128
食品
精品咖啡豆 500g
¥99
图书
圣经(和合本精装)
¥69
数码
USB-C 扩展坞 12 合 1
¥459
XPath 定位效果展示

当前尚无操作记录

请尝试:① 商品表 view/edit/del 或库存合计 ② 读取/提交/重置会员资料 ③ 订单卡付款/详情/取消/确认收货 ④ 购物商城分类→加减数量→加购→结算→支付


方法 8:By.CSS_SELECTOR — 通过 CSS 选择器定位

比 XPath 更简洁、执行速度更快;浏览器原生解析,支持 #id、.class、属性匹配、组合符(> + ~ 空格)、伪类(:nth-child / :checked / :disabled / :not)等;不支持文本内容匹配和向上父级轴定位。

练习要求 · 方法 8:By.CSS_SELECTOR
📌 方法概念
原理:CSS 选择器是浏览器渲染页面时原生使用的定位语法,通过元素的标签、属性、class/id、层级关系等组合来定位;浏览器底层直接解析,比 XPath 更简洁、执行速度更快
适用场景:
class 有特征(判断标准:用这个 class 当选择器,能不能精准定位到你想要的元素 —— 不是一堆,也不是零个):
    ✅ 好 class(有特征).login-btn 只能定位登录按钮这 1 个;.danger-btn 只能定位"删除 / 清空"这组危险操作按钮 —— 拿得准。
    ❌ 差 class(没特征).btn 页面上所有 30 个按钮都有 —— 定位多个元素,分不清谁是谁。
    定位精准 → 有特征;定位多了或少了 → 没特征。
    多 class 组合可以让它变精准:.nav-item.active(同时满足两个 class)比单独用 .nav-item(一堆)或 .active(可能别处也有)都更准。
属性前缀/后缀/子串:id 是 css_btn_login_1 这种动态数字 → [id^='css_btn_login'] 前缀匹配;
    href 都是 .html 结尾 → a[href$='.html'] 后缀匹配;class 含 btn 子串 → [class*='btn'] 子串匹配;
按位置取:6 个任务项取奇数位 → #task_list li:nth-child(odd);取第 3 个 → li:nth-child(3)
状态筛选:勾选了通知的复选框 → input[name='notify']:checked;置灰禁用的按钮 → button:disabled
层级/组合:找某个容器内的按钮 → #sidebar .menu-item(后代),.card > .title(直接子级),.label + .input(紧邻下一个兄弟)。
注意事项:不支持 text() 文本内容匹配,不支持 parent:: 向上父级轴定位,索引从 1 开始(与 XPath 一致但不同于 JS 的 0 基)。
💻 Selenium 示例(Python)
from selenium import webdriver
from selenium.webdriver.common.by import By
form = driver.find_element(By.CSS_SELECTOR, "#sec-by-css .register-form")  # 组合定位:id + class + 后代
even_tasks = driver.find_elements(By.CSS_SELECTOR, "#css_task_list li:nth-child(even)")  # 偶数位任务
notify_checks = driver.find_elements(By.CSS_SELECTOR, "#sec-by-css input[name='css_notify']:checked")  # 已勾选通知
📋 本节练习清单
  • ✅ 练习目标 1:个人设置表单 — 填写昵称/年龄/签名 → 勾选/取消通知复选框(练习 :checked)→ 点标签切换 .active → 点「保存设置」观察效果区输出;再点「重置设置」验证默认值恢复(:checked 只剩系统公告、标签只剩自动化测试)
  • ✅ 练习目标 2:任务清单 6 条 — 点击 li 切换完成态(出现 .done 类 + 删除线);练习 :nth-child(odd) 取奇数位、li[data-priority='urgent'] 取紧急项、.done 取已完成项;最后打开浏览器 F12 控制台,输入 $$('.css-tag.active').length 回车,对比 Selenium 脚本里 len(driver.find_elements(By.CSS_SELECTOR, ".css-tag.active")) 的值是否一致(底层都是 querySelectorAll,应该完全相同)

练习目标 1:个人设置表单(#id / [name] / :checked / .css-tag.active)

操作步骤:
① 填写昵称 / 年龄 / 个性签名文本框 → find_element(By.CSS_SELECTOR, "#css_form_settings input[name='css_nickname']")
② 勾选/取消 4 个通知复选框 → find_elements(By.CSS_SELECTOR, "input[name='css_notify']:checked")(:checked 伪类取已勾选项)
③ 点 5 个兴趣标签切换选中态 → find_elements(By.CSS_SELECTOR, ".css-tag.active")(.active 类表示已选中)
④ 点「保存设置」观察效果区输出
⑤ 点「重置设置」验证默认值恢复(:checked 只剩系统公告、.active 只剩自动化测试)

个人设置

练习 CSS 选择器:#id / [name] / :checked / .css-tag.active / 多属性组合

自动化测试 接口测试 性能测试 安全测试 测试开发

练习目标 2:任务清单 6 条(:nth-child / [data-priority] / .done)

操作步骤:
① 点击任意 li 切换完成态(出现 .done 类 + 删除线)
② 练习 3 个选择器写法:
  #css_task_list li:nth-child(odd) 取奇数位任务
  #css_task_list li[data-priority='urgent'] 取紧急任务
  #css_task_list li.done 取已完成任务
③ 打开浏览器 F12 控制台,输入 $$('#css_task_list li.done').length 回车,对比 Selenium 脚本里 len(driver.find_elements(By.CSS_SELECTOR, "#css_task_list li.done")) 是否一致

    CSS 定位效果展示

    当前尚无操作记录

    请尝试:① 设置表单填写→勾选通知→选标签→保存 ② 重置设置 ③ 任务清单点击 6 条切换完成态

    方法 9:JavaScript — 通过 JavaScript 定位元素

    使用 document.getElementById()document.getElementsByName()document.getElementsByClassName()document.getElementsByTagName()document.querySelector()document.querySelectorAll() 等浏览器原生 JS API 定位元素;在 Selenium 中通过 driver.execute_script() 执行 JS 代码。

    练习要求 · 方法 9:JavaScript 定位
    📖 方法概念 JavaScript 直接使用浏览器内置 API 定位,绕过 Selenium 的 By 机制,适合处理复杂 DOM、动态渲染内容或需要批量操作的场景。
    💻 Selenium 示例
    # getElementById — 最快速,返回单个元素
    element = driver.execute_script(
        "return document.getElementById('js-username')")
    
    # getElementsByName — 返回 NodeList
    elements = driver.execute_script(
        "return document.getElementsByName('js-skill')")
    
    # getElementsByClassName — 返回 HTMLCollection
    elements = driver.execute_script(
        "return document.getElementsByClassName('js-card')")
    
    # getElementsByTagName — 返回 HTMLCollection
    elements = driver.execute_script(
        "return document.getElementsByTagName('input')")
    
    # querySelector / querySelectorAll — CSS 选择器
    element = driver.execute_script(
        "return document.querySelector('.js-card.active')")
    elements = driver.execute_script(
        "return document.querySelectorAll('.js-card')")
    
    # 直接执行操作(无需 find_element)
    driver.execute_script(
        "document.getElementById('js-btn').click()")
    📋 本节练习清单
    • ✅ 练习目标 1:getElementById 表单定位 — 首先定位并输入用户名 document.getElementById('js-username').value;接着定位并输入邮箱/密码/手机;继续定位并勾选协议复选框 document.getElementById('js-agree').checked = true ;然后定位并点击「读取当前表单」,观察效果区 — 每个字段都对应一行 getElementById 返回值;最后提交
    • ✅ 练习目标 2:getElementsByName / ByClassName / ByTagName 批量获取 — ① 技能选择(name="js-skill" 批量勾选并读 value); ② 课程卡片(.js-course-card 批量获取读 data-level); ③ 数据统计(TAG_NAME('td') 批量遍历计算)
    • ✅ 练习目标 3:querySelector 精确选择 — 用 querySelector('#js-card-container .js-card:nth-child(3)') 选取第 3 张商品卡片;点击切换 .active 高亮态
    • ✅ 练习目标 4:querySelectorAll 批量 + data 属性querySelectorAll('#js-tag-cloud .js-tag') 获取所有标签,遍历读取 data-category 统计各类别数量

    练习目标 1:JS 表单(getElementById 定位 id="js-*" 系列元素)

    操作步骤:
    ① 定位用户名并输入 → document.getElementById('js-username').value = 'admin'
    ② 定位邮箱/密码/手机并输入 → document.getElementById('js-email').value = 'admin@test.com'
    ③ 定位并勾选「同意协议」→ document.getElementById('js-agree').checked = true
    ④ 定位并点击「读取当前表单」,观察效果区 — 每个字段都对应一行 getElementById(id).value.checked 的返回值
    ⑤ 定位并点击提交按钮,对比 document.getElementById('js-btn-submit').click() 与浏览器原生点击是否一致

    JavaScript 定位练习表单

    全部字段用 getElementById('js-*') 定位 — Selenium 里用 execute_script("return document.getElementById('...')")


    练习目标 2:DOM 快捷批量定位(3 种 getElements 方法对比)

    操作步骤:
    ① getElementsByName → document.getElementsByName('js-skill') 获取 5 个同名 checkbox,遍历勾选并读 value
    ② getElementsByClassName → document.getElementsByClassName('js-course-card') 获取 6 张课程卡片,读取 data-level
    ③ getElementsByTagName → document.querySelectorAll('#js-stats-table td') 批量遍历计算总数

    ① getElementsByName — 批量获取同名元素(技能选择)

    5 个技能复选框共享 name="js-skill",使用 document.getElementsByName('js-skill') 获取所有技能,遍历勾选并读取 value。

    ② getElementsByClassName — 按类名批量获取(课程卡片)

    6 张课程卡片共享 CSS 类 .js-course-card,使用 document.getElementsByClassName('js-course-card') 获取所有卡片,读取 data-level 属性。

    📘
    Selenium 入门
    level=入门
    📗
    Pytest 进阶
    level=进阶
    📕
    自动化架构
    level=高级
    📙
    Python 基础
    level=入门
    📓
    接口测试
    level=进阶
    📔
    性能测试
    level=高级

    ③ getElementsByTagName — 按标签名获取(成绩统计表)

    成绩表中每行每列都是 td 标签,使用 document.getElementsByTagName('td') 获取所有单元格,遍历读取内容并统计。

    学号 姓名 Python Selenium Pytest
    2026001 张三 92 88 95
    2026002 李四 85 91 87
    2026003 王五 78 82 90
    2026004 赵六 96 94 89
    三种 getElements 方法对比:
    方法 参数 返回类型 适用场景
    getElementsByName name 属性值 NodeList(动态) 同名 checkbox/radio 组
    getElementsByClassName CSS 类名 HTMLCollection(动态) 同类型卡片/标签批量
    getElementsByTagName HTML 标签名 HTMLCollection(动态) 表格/列表/链接统计

    练习目标 3:商品卡片(querySelector + 伪类选择器)

    操作步骤:
    ① 用 querySelector 精确选第 3 张卡片 → document.querySelector('#js-card-container .js-card:nth-child(3)')
    ② 点击卡片切换 .active 高亮态 → card.classList.toggle('active')

    🖱️
    无线鼠标
    ¥89
    ⌨️
    机械键盘
    ¥399
    🖥️
    4K显示器
    ¥2499
    🔌
    USB-C 扩展坞
    ¥299
    🎧
    降噪耳机
    ¥1299

    练习目标 4:技术标签云(querySelectorAll 批量获取 + 遍历)

    操作步骤:
    ① 批量获取所有标签 → document.querySelectorAll('#js-tag-cloud .js-tag')
    ② 遍历读取 data 属性 → tag.dataset.category(注意 Selenium 里用 get_attribute('data-category')
    ③ 统计各类别数量并输出

    HTML5 CSS3 JavaScript Python Java Selenium Pytest Appium MySQL Redis
    JavaScript 定位效果展示

    当前尚无操作记录

    请尝试:① 填写表单→勾选→提交 ② 点击商品卡片 ③ 点击标签 ④ 统计按钮 ⑤ 技能/课程/表格练习