1.查找元素的核心函数
Selenium提供2个基础函数用于定位页面元素:
-
find_element("定位方式", "元素标识")- 作用:查找页面中符合条件的单个元素。
- 结果:找到则返回该元素对象;未找到则直接抛出"元素不存在"的异常。
-
find_elements("定位方式", "元素标识")- 作用:查找页面中所有符合条件的元素。
- 结果:返回一个包含所有匹配元素的列表(即使只有1个匹配也返回列表);未找到则返回空列表。
1.1find_elements的实际用法示例
当需要获取页面中多个相同类型的元素时,可通过find_elements遍历获取信息(以百度页面为例):
python
# 1. 访问百度页面
driver.get("https://www.baidu.com")
# 2. 用CSS选择器定位多个元素,返回元素列表
ret = driver.find_elements(By.CSS_SELECTOR, ".hotsearch-content-wrapper > li")
# 3. 遍历列表,打印每个元素的文本内容
for i in ret:
print(i.text) # 输出每个元素对应的文本信息
1.2查找元素的常用方式
常用的元素定位方式包括:
- CSS选择器(cssSelector)
- XPath
- ID
- class name
其中CSS选择器和XPath是实际项目中最常用的定位方式 ,比如示例中用"ID选择器(#su)"定位"百度一下"按钮(对应元素的id="su"属性)。
这张图片主要讲解了Selenium自动化测试中"元素定位语法"和"测试对象操作方法",核心知识总结如下:
1.2.1CSS选择器(常用语法)
- ID选择器 :
#ID值→ 定位id属性对应的元素,例:#su定位"百度一下"按钮(对应元素id="su") - 子选择器 :
父元素 > 子元素→ 定位父元素下的直接子元素,例:.hotsearch-content-wrapper > li选该类容器下的li子元素 - 第n个元素选择器 :
元素:nth-child(n)→ 定位同层级下的第n个元素,例:li:nth-child(3)选第三个li标签
1.2.2 XPath(常用语法)
XPath是XML路径语言,可在HTML中选取节点:
- 匹配属性 :
//*[@属性="值"]→ 定位包含指定属性的节点,例://*[@id="kw"]匹配id为"kw"的搜索框
-- 获取所有节点 ://*→ 选中HTML页面的所有节点
-- 直接子节点定位 :/表示直接子节点,例://*[@id="hotsearch-content-wrapper"]/li[3]/a/span[2]定位"hotsearch-content-wrapper"下第3个li里的a标签内第2个span
2.测试对象的常用操作
定位到元素后,通过以下方法对元素执行操作:
2.1点击操作:click()
-
作用:模拟鼠标左键点击页面元素(任意可交互元素都支持)
-
示例:
python# 定位元素后调用click() driver.find_element(By.CSS_SELECTOR, "目标选择器").click()
2.2模拟输入:send_keys("内容")
- 作用:模拟键盘输入,向输入框中填写文本
- 注意:连续调用
send_keys会将内容拼接(例:连续输入"a"和"b"会得到"ab")
2.3清除文本:clear()
-
作用:清空输入框中已有的文本内容
-
场景:需要替换输入内容时,先
clear()再send_keys,示例:pythoninput_ele = driver.find_element(By.CSS_SELECTOR, "#kw") input_ele.send_keys("旧内容") input_ele.clear() # 清空旧内容 input_ele.send_keys("新内容") # 输入新内容
2.4获取信息:获取元素/页面的关键数据
用于验证元素内容、页面跳转结果是否符合预期。
2.4.1 获取元素文本:.text
-
作用:获取元素显示在页面上的文本内容。
-
用法示例:
python# 定位元素后,通过.text获取文本 text = driver.find_element(By.CSS_SELECTOR, "目标选择器").text print(text) # 打印文本 assert text == "预期内容" # 断言文本是否符合预期
2.4.2 特殊情况:获取元素属性值(.text无效时)
当文本存储在元素的属性中 (比如按钮的value属性),用.text无法获取,需用 get_attribute("属性名"):
-
作用:获取元素指定属性对应的属性值。
-
示例(获取"百度一下"按钮的
value属性):pythonbtn_ele = driver.find_element(By.CSS_SELECTOR, "#su") value = btn_ele.get_attribute("value") # 获取value属性值(结果为"百度一下") print(value)
2.4.3 获取页面标题&URL
用于验证页面跳转是否正确:
-
driver.title:获取当前页面的标题(对应浏览器标签栏显示的文字)。 -
driver.current_url:获取当前页面的URL地址。 -
示例(验证页面跳转):
pythonprint("跳转前标题:", driver.title) print("跳转前URL:", driver.current_url) # 点击元素跳转页面 driver.find_element(By.CSS_SELECTOR, "目标链接选择器").click() print("跳转后标题:", driver.title) print("跳转后URL:", driver.current_url)
3.窗口操作:多窗口/新标签页的切换
当点击元素打开新标签页后,程序默认停留在原窗口,需手动切换窗口。
3.1窗口大小设置
通过方法调整浏览器窗口的尺寸,适配不同测试场景:
| 方法 | 作用 |
|---|---|
driver.maximize_window() |
窗口最大化(自动化中常用) |
driver.minimize_window() |
窗口最小化 |
driver.fullscreen_window() |
窗口全屏显示 |
driver.set_window_size(1024, 768) |
自定义窗口尺寸(宽1024、高768) |
3.2 窗口句柄(识别窗口的唯一标识)
每个浏览器窗口/标签页都有唯一的"句柄(handle)",通过以下方法获取:
driver.current_window_handle:获取当前窗口的句柄。driver.window_handles:获取所有已打开窗口的句柄列表(按打开顺序排列)。
3.3 切换窗口:driver.switch_to.window(目标句柄)
-
作用:切换到指定句柄对应的窗口/标签页。
-
示例(切换到新打开的标签页):
python# 获取所有窗口句柄 all_handles = driver.window_handles # 遍历句柄,切换到新窗口(通常是列表最后一个) for handle in all_handles: driver.switch_to.window(handle)
3.4故障排查必备
用于记录自动化过程中的页面状态(尤其是报错时),核心方法是 driver.save_screenshot(保存路径/文件名)。
3.4.1基础用法
python
# 保存到当前脚本所在目录,文件名为test.png
driver.save_screenshot("test.png")
# 保存到指定文件夹(需提前创建images文件夹)
driver.save_screenshot("./images/test.png")
3.4.2避免文件被覆盖:用时间戳命名
固定文件名会被后续截图覆盖,需结合datetime生成唯一文件名(注意文件名不能包含空格,需格式化时间):
python
import datetime
# 生成带时间戳的文件名(格式:autotest-2024-06-08-103729.png)
filename = "autotest-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"
# 保存到images文件夹
driver.save_screenshot("./images/" + filename)
3.5关闭窗口/浏览器
两个核心方法,适用场景不同:
-
driver.close()- 作用:关闭当前激活的窗口/标签页(仅关一个)。
- 注意:关闭后若需继续操作浏览器,需重新定位窗口;若所有窗口都关闭,
driver会失效。
-
driver.quit()- 作用:退出整个浏览器进程 (关闭所有标签页),同时释放
driver资源。 - 场景:自动化脚本结束时,建议用
quit()彻底清理资源。
- 作用:退出整个浏览器进程 (关闭所有标签页),同时释放
4.弹窗
4.1弹窗的核心特点
弹窗是页面的特殊交互组件,无法通过常规元素定位(如CSS/XPath)操作,且有以下特性:
- 页面上无法定位到弹窗元素;
- 弹窗出现后,页面其他元素也无法被定位 ,会抛出
UnexpectedAlertPresentException异常; - 必须先处理弹窗,才能继续操作页面其他元素。
4.2弹窗的3种类型
根据交互形式,弹窗分为3类:
| 弹窗类型 | 特点 | 交互按钮/组件 |
|---|---|---|
| 警告弹窗 | 仅展示提示信息 | 只有「确定」按钮 |
| 确认弹窗 | 需选择"确认/取消"操作 | 「确定」+「取消」按钮 |
| 提示弹窗 | 支持输入文本后再确认/取消 | 输入框 + 「确定」+「取消」按钮 |
4.3弹窗的处理流程与方法
通过Selenium的Alert接口处理,步骤为"切换到弹窗 → 执行操作":
4.1切换到弹窗
先将操作焦点切换到弹窗对象(Selenium 4写法):
python
alert = driver.switch_to.alert
4.2弹窗操作方法
根据弹窗类型,调用对应方法:
- 点击「确定」:
alert.accept()(适用于所有弹窗) - 点击「取消」:
alert.dismiss()(适用于确认/提示弹窗) - 输入文本(仅提示弹窗):
alert.send_keys("输入内容")
4.3Selenium自动化中"元素定位失败"的两类常见问题及临时解决思路
4.3.1问题1:CSS选择器包含特殊字符,导致"非法选择器"报错
- 场景:当元素的标识(如ID)以特殊字符/数字开头(比如ID为"1"),直接写CSS选择器(如
#1)会触发错误。 - 错误提示:
javascript error: an invalid or illegal selector was specified(非法选择器)。 - 解决:对特殊字符做转义处理 ,比如ID为"1"的元素,CSS选择器需写成
#\\31(注意转义符的使用)。
4.3.2问题2:脚本执行速度 > 页面加载速度,导致"元素找不到"
-
核心原因:脚本执行速度快,但页面资源(元素)还没加载完成,此时定位元素会失败。
-
错误提示:
NoSuchElementException: no such element: Unable to locate element(无法定位元素)。 -
临时解决方法:添加硬等待(
time.sleep(n)) ,让脚本暂停n秒,等页面加载完成后再执行定位操作。
示例:pythontime.sleep(3) # 暂停3秒,等待页面加载 driver.find_element(By.CSS_SELECTOR, "目标选择器") # 此时元素已加载,可定位到
(注:硬等待是临时方案,更优的是用显式等待精准等待元素加载,避免无效等待)