4、定位元素基础:ID定位、Name定位、Class Name定位、Tag Name定位、Link Text与Partial Link Text定位
好,咱们正式开始动手了。这一章我带你过一遍最基础的六种元素定位方式。说实话,这六种方法你只要掌握好,日常工作中至少能搞定80%的场景。我自己刚入行那会儿,就是靠这几个基本功撑过了大半年。
4.1 ID定位:最靠谱的定位方式
ID定位,说白了就是通过元素的唯一身份证来找它。在HTML里,id属性通常是唯一的,所以这种方式最快、最稳定。
核心要点:ID定位是Selenium定位方式中优先级最高的,我个人习惯只要看到有id,优先用它。
# Python示例
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# ID定位
username_input = driver.find_element(By.ID, "username")
password_input = driver.find_element(By.ID, "password")
login_button = driver.find_element(By.ID, "loginBtn")
username_input.send_keys("test_user")
password_input.send_keys("123456")
login_button.click()
我在项目中遇到过一个问题:有些前端框架会自动生成动态ID,比如 id="input-12345",每次刷新都不一样。这时候ID定位就废了。嗯,这里要注意,动态ID千万别硬编码。
避坑指南:我曾经因为没检查ID是否动态,写了一套脚本跑了一周全挂了。后来学乖了,每次定位前先看一眼页面源码,确认ID是静态的再用。
4.2 Name定位:表单元素的标配
Name属性在表单里特别常见,尤其是input、select、textarea这些元素。为什么?因为表单提交时,name就是键名。
# Name定位示例
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("自动化测试")
search_box.submit()
你想想看,一个页面上可能有多个同名的元素吗?理论上可以,但实践中很少。不过要注意,name不像id那样强制唯一,所以定位时可能返回多个元素。这时候 find_element 只会返回第一个,find_elements 返回列表。
| 定位方式 | 唯一性 | 推荐场景 |
|---|---|---|
| ID | 强制唯一 | 所有元素,首选 |
| Name | 不强制唯一 | 表单元素、搜索框 |
4.3 Class Name定位:批量操作的好帮手
Class Name定位,就是通过元素的CSS类名来找它。这个方式特别适合批量操作,比如你想获取页面上所有具有相同样式的元素。
# Class Name定位
# 获取所有商品卡片
products = driver.find_elements(By.CLASS_NAME, "product-item")
print(f"页面上共有 {len(products)} 个商品")
# 点击第一个商品
products[0].click()
我个人习惯用Class Name来定位一组元素,比如列表、卡片、表格行。但要注意,如果元素有多个class,比如 class="btn btn-primary",你只能用其中一个来定位。
小技巧:我建议优先用 btn 而不是 btn-primary,因为前者更通用。万一前端改了主题色,class从 btn-primary 变成 btn-secondary,你的脚本还能跑。
4.4 Tag Name定位:最不常用的定位方式
Tag Name定位,就是通过HTML标签名来找元素,比如 div、span、a、input 等。说实话,这个方式我平时用得最少,因为太宽泛了。
# Tag Name定位
# 获取页面上所有链接
all_links = driver.find_elements(By.TAG_NAME, "a")
for link in all_links:
print(link.get_attribute("href"))
# 获取所有图片
all_images = driver.find_elements(By.TAG_NAME, "img")
print(f"页面上有 {len(all_images)} 张图片")
为什么会这样?因为一个页面上可能有几十个 div、上百个 a 标签。用Tag Name定位就像大海捞针。我只有在做数据采集时,需要遍历所有同类元素才会用它。
注意:我曾经用Tag Name定位 input 元素,结果页面上有20多个输入框,脚本直接报错。后来我改成先定位表单容器,再在容器内用Tag Name,这才解决问题。
4.5 Link Text与Partial Link Text定位:链接专用
这两种方式专门用来定位超链接(<a> 标签)。Link Text要求完全匹配链接文本,Partial Link Text则支持部分匹配。
# Link Text定位(完全匹配)
driver.find_element(By.LINK_TEXT, "登录").click()
driver.find_element(By.LINK_TEXT, "注册新账号").click()
# Partial Link Text定位(部分匹配)
driver.find_element(By.PARTIAL_LINK_TEXT, "忘记密码").click()
driver.find_element(By.PARTIAL_LINK_TEXT, "帮助").click()
我个人更推荐用Partial Link Text,为什么呢?因为有时候链接文本里包含空格、特殊字符,或者有动态数字。比如 "第1页"、"第2页",用 PARTIAL_LINK_TEXT 匹配 "第" 就搞定了。
实战经验:我在做爬虫时,经常用Partial Link Text来抓取分页链接。比如页面上有「下一页」、「第2页」、「第3页」... 用 PARTIAL_LINK_TEXT="页" 就能全部抓到。
4.6 六种定位方式对比总结
| 定位方式 | By属性 | 适用元素 | 推荐指数 |
|---|---|---|---|
| ID定位 | By.ID | 所有元素(有id属性) | ⭐⭐⭐⭐⭐ |
| Name定位 | By.NAME | 表单元素为主 | ⭐⭐⭐⭐ |
| Class Name定位 | By.CLASS_NAME | 批量元素、样式类 | ⭐⭐⭐ |
| Tag Name定位 | By.TAG_NAME | 遍历同类元素 | ⭐⭐ |
| Link Text定位 | By.LINK_TEXT | 超链接(完全匹配) | ⭐⭐⭐ |
| Partial Link Text定位 | By.PARTIAL_LINK_TEXT | 超链接(部分匹配) | ⭐⭐⭐⭐ |
好了,这六种基础定位方式就讲完了。说白了,你只要记住一个原则:能用ID用ID,没有ID用Name,批量操作用Class,链接用Partial Link Text。Tag Name嘛,留到万不得已再用。
下一章我会讲更高级的定位方式——XPath和CSS选择器。这两个才是真正的杀手锏,学会了它们,几乎没有定位不到的元素。