练习 Selenium 8 种常规定位方法
本页面提供 9 种 Selenium 定位方法的完整练习场景。每个模块均包含练习要求描述卡(方法概念 + Selenium 示例 + 练习清单)和定位后操作效果展示区域,在输入框输入内容、点击按钮、勾选选择框时,效果展示区会实时显示对应卡片。
点击下方卡片可跳转到对应方法的独立练习页面进行专项训练,或在本页下方按顺序逐个练习。
利用元素全局唯一的 id 属性直接定位,是最稳定、最快的定位方式之一。
id 属性全局唯一定位单个元素;浏览器原生对 id 查询做了底层优化(哈希表),因此执行速度最快、结果最稳定。j_id123、带随机数字的)不要用;优先找带有业务语义的 id。
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")
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"By.ID, "attr_id_search_input";接着定位搜索按钮并点击 By.ID, "attr_id_btn_search";拓展:用 get_attribute("value") 读取搜索框当前值By.ID, "attr_id_cart_count";最后观察购物车状态文字变化 By.ID, "attr_id_cart_status"操作步骤:
① 定位用户名 → 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 提示
操作步骤:
① 定位搜索框输入关键词 → 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")
操作步骤:
① 点击任意商品卡片的「加入购物车」按钮,观察效果区记录
② 验证数量累加 → driver.find_element(By.ID, "attr_id_cart_count").text
③ 验证状态文字 → driver.find_element(By.ID, "attr_id_cart_status").text
本区域用于展示:使用 By.ID 定位到上方登录框/搜索框/商品加购按钮后执行操作的真实反馈结果。
当前尚无操作记录
请尝试:① 填写登录表单并点击登录 ② 在搜索框输入关键词点击搜索或点击热词 ③ 点击商品卡片「加入购物车」。
name 常用于表单元素(input[type=text/radio/checkbox/hidden] / select / textarea),是操作表单的首选。
name 属性定位;在表单提交时,name=value 会以键值对形式传递给后端,因此表单元素几乎都有 name。find_elements 取下标 [0]/[1]/[2] 或按 value 二次过滤;type=hidden 元素需 JS 才能设置。
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()
By.NAME, "nameForm1_username" 等 4 个输入框 ② 勾选性别 radio(name=nameForm1_gender)和爱好 checkbox(name=nameForm1_hobby,可多选) ③ 勾选「同意用户协议」→ 点击提交按钮观察 Toast + 效果区记录操作步骤:
① 填写 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 定位到上方注册表单后,执行「输入 / 选单选 / 勾选多选 / 选择城市 / 提交注册」等操作的真实反馈结果。
当前尚无操作记录
请尝试:① 填写「姓名 / 邮箱 / 手机号」② 选择「性别」单选 ③ 勾选多个「兴趣爱好」 ④ 选择城市 + 同意条款 ⑤ 点击「提交注册」按钮。
CLASS_NAME 只接受单个 class 名(不能包含空格!),通常用于批量获取一组同类元素。
class="demo-btn green" 必须分别用 demo-btn 或 green,不能一起传;多 class 组合请用 By.CSS_SELECTOR。
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)
find_elements(By.CLASS_NAME, "attrClass_tag_box") 拿到 5 个卡片,按索引点击每个卡片并获取文字内容find_elements(By.CLASS_NAME, "attrClass_img_card") 拿到 3 张卡片容器,再每张卡内部 card.find_element(By.CLASS_NAME, "attrClass_avatar_name") / attrClass_avatar_role 读取姓名和职位attrClass_order_card 容器,每张内部再用 class 定位 4 个子元素;完成:a. 按状态统计数量(已付款×2 / 已发货×1 / 待付款×1 / 已完成×1 / 已取消×1)b. 筛选金额 ≥ 500 的大订单(1280.50 和 899.00 共 2 张)c. 确认页面上 5 种状态徽章都能被 find_element 找到操作步骤:
① 批量获取 5 个卡片 → tags = driver.find_elements(By.CLASS_NAME, "attrClass_tag_box")
② 遍历点击每个卡片 → for t in tags: t.click()
③ 获取文字内容 → tags[0].text
操作步骤(组合定位:先拿容器,再容器内部找子元素):
① 先拿 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
操作步骤(组合定位进阶:容器 → 内部子元素):
① 拿 6 张订单卡片容器 → orders = driver.find_elements(By.CLASS_NAME, "attrClass_order_card")
② 每张卡内部读状态 + 金额 → status = orders[i].find_element(By.CLASS_NAME, "attrClass_order_status").text;amount = 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 种
本区域用于展示:使用 By.CLASS_NAME 定位到上方标签卡/用户卡/订单卡后,点击或批量读取文字内容的真实反馈结果。
当前尚无操作记录
请尝试:① 点击「技术标签」卡片 ② 点击「用户头像」卡片 ③ 点击「订单卡片」观察组合定位 ④ 用 find_elements 批量读取标签或订单。
TAG_NAME 返回所有同名标签的集合,适合遍历表格 tr/td、图片列表 img、超链接 a、按钮 button 等。
<a>、<input>、<button>、<img>、<tr>、<td>)定位所有同名标签;绝大多数场景配合 find_elements 批量获取。<input> 要区分 type=text/email/password/hidden。
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])
len(driver.find_elements(By.TAG_NAME, "a")) / "input" / "button" 对比两边数量是否一致;尝试两种写法:find_elements 过滤 vs find_element 精确定位find_elements(By.TAG_NAME, "img") 批量获取,按下标取每张图、读取 alt 属性;点击图片后效果区记录图编号和 alt 值TAG_NAME('tr') 取 rows,每行 TAG_NAME('td') 取 4 列(学号/姓名/年龄/班级),点击任意行查看详细数据操作步骤:
① 页面场景包含: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") 精确定位
id="—"
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")
操作步骤:
① 批量获取 3 张图 → imgs = driver.find_elements(By.TAG_NAME, "img")
② 按下标取每张 → imgs[0](山脉)/ imgs[1](湖泊)/ imgs[2](城市)
③ 读取 alt 属性 → imgs[0].get_attribute("alt")
操作步骤(组合定位:先拿 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) ④ 点击学生表格任意行。
LINK_TEXT 必须完全匹配超链接可见文字(区分大小写),只适用于 <a> 标签,常用于导航跳转。
<a> 标签的 innerText(可见文字,完全相等,区分大小写),只对超链接生效;内部空格和换行用 normalize-space 逻辑。from selenium import webdriver from selenium.webdriver.common.by import By # 1) 精确匹配 4 个导航链接之一 driver.find_element(By.LINK_TEXT, "Selenium 官方文档").click() # 2) 精确匹配 3 个资源卡的跳转按钮(全部完全一致) links = driver.find_elements(By.LINK_TEXT, "立即前往学习 →") for lnk in links: lnk.click() # 3) 组合定位:先 id 取导航容器 → 再在容器内 LINK_TEXT 精确查找 nav = driver.find_element(By.ID, "link_site_nav") nav.find_element(By.LINK_TEXT, "Pytest 单元测试").click()
By.LINK_TEXT, "首页" 等精确匹配,观察日志面板记录find_elements(By.LINK_TEXT, "立即前往学习 →") 取列表,按下标 [0]/[1]/[2] 分别点击sidebar = driver.find_element(By.ID, "link_sidebar_left") 定位管理后台侧边栏容器,再 sidebar.find_element(By.LINK_TEXT, "首页").click() 精准点击;扩展试试 #link_sidebar_right 电商店铺侧边栏操作步骤:
① 依次点击 5 个唯一文字链接 → driver.find_element(By.LINK_TEXT, "首页").click()
② 同理:"Selenium 官方文档" / "Appium 移动自动化" / "Pytest 单元测试" / "Playwright 新手指南"
③ 观察日志面板按顺序记录点击
<a> 链接文字完全相同)操作步骤:
⚠️ 重要:「立即前往学习 →」是 <a> 链接(CSS 做成按钮样式),实际项目很常见。
① 批量取 3 个相同文字链接 → links = driver.find_elements(By.LINK_TEXT, "立即前往学习 →")
② 按下标分别点击 → links[0].click()(Selenium 入门教程)/ links[1].click()(Python 自动化实战)/ links[2].click()(接口测试全套)
操作步骤(组合定位:全局 find_element 会命中第一个「首页」→ 必须限定容器):
① 先定位容器 → sidebar = driver.find_element(By.ID, "link_sidebar_left")(管理后台)或 #link_sidebar_right(电商店铺)
② 容器内找链接 → sidebar.find_element(By.LINK_TEXT, "首页").click()
# 第 1 步:先定位你想要的侧边栏容器(二选一)
sidebar = driver.find_element(By.ID, "link_sidebar_left") # 管理后台左侧栏
sidebar = driver.find_element(By.ID, "link_sidebar_right") # 电商店铺右侧栏
# 第 2 步:在容器内部找链接(只搜该容器范围,不会误点顶部导航的"首页")
home_link = sidebar.find_element(By.LINK_TEXT, "首页")
home_link.click()
| # | 位置 / 容器 | HTML | 管理后台侧边栏 | 电商店铺侧边栏 |
|---|
💡 辅助说明:先点高亮按钮看哪个容器被限定,再点对应颜色的模拟按钮 —— 两个侧边栏都有「首页」,全局 driver.find_element(By.LINK_TEXT,"首页") 永远定位第一个「首页」链接;用 sidebar.find_element(...) 精准限定才能定位到你想要的那个。
本区域用于展示:使用 By.LINK_TEXT(链接完整文本精确匹配)点击导航链接或资源卡跳转按钮后,记录具体点击目标。
当前尚无操作记录
请尝试:① 点击上方 5 个精确导航链接 ② 依次点击 3 张资源卡右下角「立即前往学习 →」 ③ 组合定位:先找容器再内部找链接 ④ 观察每次点击追加记录。
当链接文本很长或含有动态前缀/后缀时,可使用 PARTIAL_LINK_TEXT 通过子串模糊匹配(包含即可定位)。
<a> 可见文字中「包含指定子串」的所有链接(模糊匹配),相当于 SQL 中的 LIKE "%keyword%"。find_elements + 下标遍历;区分大小写;只适用于 a 标签。
from selenium import webdriver from selenium.webdriver.common.by import By # 1) 关键词「Selenium」模糊匹配所有相关新闻 selenium_news = driver.find_elements(By.PARTIAL_LINK_TEXT, "Selenium") # 2) 关键词「下载」可定位所有带下载的链接 dl = driver.find_elements(By.PARTIAL_LINK_TEXT, "下载") # 3) 组合:先 id 取友情链接 → 再部分匹配 box = driver.find_element(By.ID, "plink_friend_links") box.find_element(By.PARTIAL_LINK_TEXT, "官方").click()
By.PARTIAL_LINK_TEXT, "Selenium" 可定位 1/2/5;"入门" 可定位 1/4;"实战" 可定位 3/6find_elements(By.PARTIAL_LINK_TEXT, "关键词"),输入后点击执行查看匹配结果操作步骤:
① 根据关键词「Selenium」定位新闻链接(共 3 条) → find_elements(By.PARTIAL_LINK_TEXT, "Selenium"),按下标 [0]/[1]/[2] 分别点击
② 根据关键词「入门」定位新闻链接(共 2 条)、「实战」定位新闻链接(共 2 条),同理取列表
③ 点击任意链接后查看效果区显示:匹配文字、所在区域、完整链接文本
操作步骤:
① 根据关键词「下载」定位下载链接(共 6 条) → find_elements(By.PARTIAL_LINK_TEXT, "下载")
② 根据关键词「驱动」定位下载链接(Chrome/Firefox/Edge 驱动)
③ 根据关键词「PDF」定位下载链接(速查表/Selenium 中文/Pytest 合集)
④ 点击页面上的「下载」「驱动」「PDF」按钮验证匹配数量
操作步骤:
① 根据关键词「官方」/「社区」/「博客」/「文档」定位友情链接区域的链接 → driver.find_element(By.PARTIAL_LINK_TEXT, "官方").click() 等
② 下方综合搜索框输入关键词,点击「执行搜索」按钮,模拟 find_elements(By.PARTIAL_LINK_TEXT, "关键词") 的返回结果,用于验证前面的定位是否准确
本区域用于展示:使用 By.PARTIAL_LINK_TEXT 模糊匹配后点击新闻/下载/友链的真实反馈。
当前尚无操作记录
请尝试:① 用「Selenium」「入门」「下载」「官方」等模糊定位上方链接点击 ② 点击 3 个「筛选」按钮 ③ 综合搜索框执行搜索。
最强大通用的定位方法,支持相对路径、属性组合、文本匹配、父子兄弟轴、索引、函数等,适用 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 或库存合计 ② 读取/提交/重置会员资料 ③ 订单卡付款/详情/取消/确认收货 ④ 购物商城分类→加减数量→加购→结算→支付
比 XPath 更简洁、执行速度更快;浏览器原生解析,支持 #id、.class、属性匹配、组合符(> + ~ 空格)、伪类(:nth-child / :checked / :disabled / :not)等;不支持文本内容匹配和向上父级轴定位。
.login-btn 只能定位登录按钮这 1 个;.danger-btn 只能定位"删除 / 清空"这组危险操作按钮 —— 拿得准。.btn 页面上所有 30 个按钮都有 —— 定位多个元素,分不清谁是谁。.nav-item.active(同时满足两个 class)比单独用 .nav-item(一堆)或 .active(可能别处也有)都更准。css_btn_login_1 这种动态数字 → [id^='css_btn_login'] 前缀匹配;.html 结尾 → a[href$='.html'] 后缀匹配;class 含 btn 子串 → [class*='btn'] 子串匹配;#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 基)。
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") # 已勾选通知
:checked)→ 点标签切换 .active → 点「保存设置」观察效果区输出;再点「重置设置」验证默认值恢复(:checked 只剩系统公告、标签只剩自动化测试):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,应该完全相同)操作步骤:
① 填写昵称 / 年龄 / 个性签名文本框 → 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 只剩自动化测试)
操作步骤:
① 点击任意 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")) 是否一致
当前尚无操作记录
请尝试:① 设置表单填写→勾选通知→选标签→保存 ② 重置设置 ③ 任务清单点击 6 条切换完成态
使用 document.getElementById()、document.getElementsByName()、document.getElementsByClassName()、document.getElementsByTagName()、document.querySelector()、document.querySelectorAll() 等浏览器原生 JS API 定位元素;在 Selenium 中通过 driver.execute_script() 执行 JS 代码。
# 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()")
document.getElementById('js-username').value;接着定位并输入邮箱/密码/手机;继续定位并勾选协议复选框 document.getElementById('js-agree').checked = true ;然后定位并点击「读取当前表单」,观察效果区 — 每个字段都对应一行 getElementById 返回值;最后提交name="js-skill" 批量勾选并读 value); ② 课程卡片(.js-course-card 批量获取读 data-level); ③ 数据统计(TAG_NAME('td') 批量遍历计算)querySelector('#js-card-container .js-card:nth-child(3)') 选取第 3 张商品卡片;点击切换 .active 高亮态querySelectorAll('#js-tag-cloud .js-tag') 获取所有标签,遍历读取 data-category 统计各类别数量操作步骤:
① 定位用户名并输入 → 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() 与浏览器原生点击是否一致
操作步骤:
① getElementsByName → document.getElementsByName('js-skill') 获取 5 个同名 checkbox,遍历勾选并读 value
② getElementsByClassName → document.getElementsByClassName('js-course-card') 获取 6 张课程卡片,读取 data-level
③ getElementsByTagName → document.querySelectorAll('#js-stats-table td') 批量遍历计算总数
5 个技能复选框共享 name="js-skill",使用 document.getElementsByName('js-skill') 获取所有技能,遍历勾选并读取 value。
6 张课程卡片共享 CSS 类 .js-course-card,使用 document.getElementsByClassName('js-course-card') 获取所有卡片,读取 data-level 属性。
成绩表中每行每列都是 td 标签,使用 document.getElementsByTagName('td') 获取所有单元格,遍历读取内容并统计。
| 学号 | 姓名 | Python | Selenium | Pytest |
|---|---|---|---|---|
| 2026001 | 张三 | 92 | 88 | 95 |
| 2026002 | 李四 | 85 | 91 | 87 |
| 2026003 | 王五 | 78 | 82 | 90 |
| 2026004 | 赵六 | 96 | 94 | 89 |
| 方法 | 参数 | 返回类型 | 适用场景 |
|---|---|---|---|
getElementsByName |
name 属性值 | NodeList(动态) | 同名 checkbox/radio 组 |
getElementsByClassName |
CSS 类名 | HTMLCollection(动态) | 同类型卡片/标签批量 |
getElementsByTagName |
HTML 标签名 | HTMLCollection(动态) | 表格/列表/链接统计 |
操作步骤:
① 用 querySelector 精确选第 3 张卡片 → document.querySelector('#js-card-container .js-card:nth-child(3)')
② 点击卡片切换 .active 高亮态 → card.classList.toggle('active')
操作步骤:
① 批量获取所有标签 → document.querySelectorAll('#js-tag-cloud .js-tag')
② 遍历读取 data 属性 → tag.dataset.category(注意 Selenium 里用 get_attribute('data-category'))
③ 统计各类别数量并输出
当前尚无操作记录
请尝试:① 填写表单→勾选→提交 ② 点击商品卡片 ③ 点击标签 ④ 统计按钮 ⑤ 技能/课程/表格练习