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标签名来找元素,比如 divspanainput 等。说实话,这个方式我平时用得最少,因为太宽泛了。

# 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选择器。这两个才是真正的杀手锏,学会了它们,几乎没有定位不到的元素。