(3)pytest+Selenium自动化测试-元素定位之初级定位
回顾一下,上节课我们搭建了环境,并让脚本成功打开了百度页面。现在请大家思考:如何让脚本模拟下一步操作,比如输入关键词“天气”并执行搜索?实现这些交互的钥匙,就是“元素定位”技术。作为自动化测试的基石,我们将从本节开始,详细讲解各种元素定位方法。
在Web自动化测试中,元素定位是核心基础,直接影响测试脚本的稳定性和可维护性。无论是使用Selenium、Cypress还是Playwright等工具,精准定位页面元素都是实现自动化操作的前提。本文将系统梳理常见的初级元素定位方式,分析其适用场景及优缺点,帮助测试工程师选择最合适的定位策略。
初级定位方式
初级定位方式通常依赖元素的单一、直观属性,语法简单,学习成本低,适用于结构简单、属性明确的元素。
1) ID定位
原理:通过元素的“id”属性定位(HTML规范中id应唯一)
语法示例:
driver.find_element(By.ID, "username")
优点:定位速度快,唯一性高
缺点:部分元素无id属性,动态生成的id不可以使用
适用场景:有稳定唯一id属性的元素
案例实操:
进入百度页面,按下F12键打开浏览器的开发者工具,查看网页内容,使用元素定位工具定位到“登录”按钮,查看登录按钮的id属性,如下:

我们按照上面通过ID定位的方式编写自动化测试的代码,尝试定位到登录按钮,同时为了更好地演示测试效果,在定位到“登录”按钮以后,通过click方法触发按钮的点击,等待三秒钟关闭浏览器。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_baidu():
# 初始化浏览器驱动(chrome浏览器)
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com/")
# 定位到登录按钮,并点击
driver.find_element(By.ID,"s-top-loginbtn").click()
# 等待3秒
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == "__main__":
test_baidu()
运行后,程序自动完成了登录按钮的点击,并进入了登录页面,测试效果如下:

2)Name定位
原理:通过元素的“name”属性定位
语法示例:
driver.find_element(By.NAME, "password")
优点:语法简单,常用于表单元素
缺点:name属性可能不唯一
适用场景:表单提交相关元素(如输入框、复选框)
案例实操:
通过name属性的定位与通过ID类似,但是name属性经常会出现重名,使用的时候一定全局搜索一下,是否有重名的name属性。接着上面的实操案例,我们在登录框中找到复选框,复选框元素的name为isAgree且唯一。

我们进一步完善代码,让自动化测试程序自动完成复选框的定位以及复选框的勾选,同时要注意为了避免程序执行太快,我们也在打开登录界面之后,等待3秒之后再进行复选框的勾选,以便给复选框足够的加载时间。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_baidu():
# 初始化浏览器驱动(chrome浏览器)
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com/")
# 定位到登录按钮,并点击
driver.find_element(By.ID,"s-top-loginbtn").click()
# 等待3秒
sleep(3)
# 定位到复选框,并点击
driver.find_element(By.NAME,"isAgree").click()
# 等待3秒
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == "__main__":
test_baidu()
运行后,我们看到程序帮我们自动完成了复选框的勾选。

3)Class Name定位
原理:通过元素的“class”属性定位
语法示例:
driver.find_element(By.CLASS_NAME, "btn-submit")
优点:适用于样式相关元素定位
缺点:class可能包含多个值(空格分隔),且易因样式变更失效
适用场景:需要通过样式类名批量定位元素时
案例实操:
接下来,我们看一下登录页面的手机号输入框,我们找到该元素的class属性,如下:

我们在上一步的基础上,继续完善代码。通过元素的Class Name定位到手机号输入框,然后通过send_keys方法,为元素输入文本。但是这里特别要注意的是我们发现class的值是由两段字符串构成的,中间以空格分开,这表示当前元素同时属于两个类pass-text-input 和 pass-text-input-userName,不能使用整个带空格的字符串进行定位,因为Class Name 定位符不允许包含空格。我们使用后半部分“pass-text-input-userName”进行定位,因为这个类名是唯一的。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_baidu():
# 初始化浏览器驱动(chrome浏览器)
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com/")
# 定位到登录按钮,并点击
driver.find_element(By.ID,"s-top-loginbtn").click()
# 等待3秒
sleep(3)
# 定位到复选框,并点击
driver.find_element(By.NAME,"isAgree").click()
# 定位到手机号输入框,并输入文本
driver.find_element(By.CLASS_NAME,"pass-text-input-userName").send_keys("15111111111")
# 等待3秒
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == "__main__":
test_baidu()
运行程序,查看效果,就会发现程序自动完成了手机号的填写。

4)Tag Name定位
原理:通过HTML标签名定位(如“div”、“a”`、”input”)
语法示例:
driver.find_element(By.TAG_NAME, "input")
优点:适合定位同类标签元素
缺点:标签名重复率高,难以精确定位单个元素
适用场景:需要统计同类标签数量时(如表格行数)
案例实操:
因同类的标签名比较多,该部分的实操,我们在上一步的基础上,获取页面中所有的input标签,使用len函数计算数量并打印。注意我们这里要获取多个元素,所以使用的是find_elements函数。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_baidu():
# 初始化浏览器驱动(chrome浏览器)
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com/")
# 定位到登录按钮,并点击
driver.find_element(By.ID,"s-top-loginbtn").click()
# 等待3秒
sleep(3)
# 定位到复选框,并点击
driver.find_element(By.NAME,"isAgree").click()
# 定位到手机号输入框,并输入文本
driver.find_element(By.CLASS_NAME,"pass-text-input-userName").send_keys("15111111111")
# 找到所有的输入框,并统计数量
allinputs= driver.find_elements(By.TAG_NAME,"input")
print(f"输入框的数量:{len(allinputs)}")
# 等待3秒
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == "__main__":
test_baidu()
运行后,效果如下:

5)Link Text定位
原理:通过超链接的完整文本定位
语法示例:
driver.find_element(By.LINK_TEXT, "登录")
优点:直观易懂,适合链接元素
缺点:文本过长或包含特殊字符时不易维护,文本变更会导致定位失效
适用场景:固定文本的超链接
案例实操:
Link Text定位方式用于定位 <a> 标签(超链接节点),因为它的原理是通过 <a> 标签内的可见文本内容来匹配元素。继续接着上面的案例,我们来找一下页面的用户协议元素。

在上面代码的基础上,我们追加代码来模拟用户点击行为,即定位到该元素,然后点击。
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_baidu():
# 初始化浏览器驱动(chrome浏览器)
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com/")
# 定位到登录按钮,并点击
driver.find_element(By.ID,"s-top-loginbtn").click()
# 等待3秒
sleep(3)
# 定位到复选框,并点击
driver.find_element(By.NAME,"isAgree").click()
# 定位到手机号输入框,并输入文本
driver.find_element(By.CLASS_NAME,"pass-text-input-userName").send_keys("15111111111")
# 找到所有的输入框,并统计数量
allinputs= driver.find_elements(By.TAG_NAME,"input")
print(f"输入框的数量:{len(allinputs)}")
# 点击用户协议
driver.find_element(By.LINK_TEXT,"百度用户协议").click()
# 等待3秒
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == "__main__":
test_baidu()
运行测试一下效果,我们发现程序帮我们自动点击并打开了用户协议,如下:

6)Partial Link Text定位
原理:通过超链接的部分文本定位
语法示例:
driver.find_element(By.PARTIAL_LINK_TEXT, "登")
优点:适用于长文本链接的简化定位
缺点:可能匹配多个元素,文本变更易失效
适用场景:文本较长但核心关键词稳定的链接
案例实操:
Partial Link Text 和 Link Text 都是用于定位 <a> 标签(超链接)的方法,核心区别在于文本匹配的精确程度。Link Text用于精确匹配,必须完全匹配 <a> 标签内的全部可见文本(包括空格、标点等细节),不允许有任何偏差。而Partial Link Text用于模糊匹配,只需匹配 <a> 标签内可见文本的一部分(即文本中包含指定的字符串即可),不需要完全一致。
接下来我们在原来代码的基础上修改一下,改为模糊匹配“用户协议” 文本,代码修改如下:
from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_baidu():
# 初始化浏览器驱动(chrome浏览器)
driver = webdriver.Chrome()
# 打开百度
driver.get("https://www.baidu.com/")
# 定位到登录按钮,并点击
driver.find_element(By.ID,"s-top-loginbtn").click()
# 等待3秒
sleep(3)
# 定位到复选框,并点击
driver.find_element(By.NAME,"isAgree").click()
# 定位到手机号输入框,并输入文本
driver.find_element(By.CLASS_NAME,"pass-text-input-userName").send_keys("15111111111")
# 找到所有的输入框,并统计数量
allinputs= driver.find_elements(By.TAG_NAME,"input")
print(f"输入框的数量:{len(allinputs)}")
# 点击用户协议
driver.find_element(By.PARTIAL_LINK_TEXT,"用户协议").click()
# 等待3秒
sleep(3)
# 关闭浏览器
driver.quit()
if __name__ == "__main__":
test_baidu()
运行测试效果,发现依然可以自动打开百度用户协议,如下:

小结
元素定位是Web自动化测试的基石,没有最好的定位方式,只有最适合的定位策略。接下来的内容我们还会继续讲解复杂场景中的定位,在实际项目中,应根据元素特性、页面结构及项目迭代频率,灵活选择定位方式,平衡定位的精准性与稳定性。掌握多种定位技术并合理组合使用,能有效提升自动化脚本的健壮性和可维护性。
更多推荐
所有评论(0)