Web 自动化测试实战:常用函数全解析与场景化应用指南
系统梳理了 Web 自动化测试中的核心函数与实战技巧,涵盖元素定位(cssSelector、xpath)、测试对象操作(点击、输入、获取文本)、窗口与弹窗控制(句柄切换、Alert 接口)、等待机制(强制、隐式、显示等待)以及浏览器参数设置(无头模式、加载策略)。文章通过 Python Selenium 代码示例,演示了如何解决元素找不到、操作时序错乱、窗口切换失败等常见问题,帮助测试工程师编写稳定高效的自动化脚本。

系统梳理了 Web 自动化测试中的核心函数与实战技巧,涵盖元素定位(cssSelector、xpath)、测试对象操作(点击、输入、获取文本)、窗口与弹窗控制(句柄切换、Alert 接口)、等待机制(强制、隐式、显示等待)以及浏览器参数设置(无头模式、加载策略)。文章通过 Python Selenium 代码示例,演示了如何解决元素找不到、操作时序错乱、窗口切换失败等常见问题,帮助测试工程师编写稳定高效的自动化脚本。

在 Web 自动化测试领域,高效定位元素、精准操作对象、灵活控制浏览器行为是核心能力。尤其是在 Python 技术栈的测试场景中,掌握标准化的自动化函数与逻辑,能大幅减少脚本报错率、提升测试效率。本文将从元素定位、测试对象操作、窗口控制、弹窗处理、等待机制等核心模块,拆解自动化测试中的常用函数与实战技巧。
Web 自动化的第一步,是让程序'找到'页面对应元素 —— 这就需要依赖标准化的定位方式。常见的元素定位方式包括 id、classname、tagname、xpath、cssSelector,其中 cssSelector 和 xpath 是实际测试中最常用的两种。
cssSelector 通过元素的属性或层级关系定位元素,分为基础选择器和复合选择器,实战中常用 id 选择器和子类选择器组合定位,确保精准性。例如:
#hotsearch-wrapper > div,通过 id 选择器(#hotsearch-wrapper)和子类选择器(>)锁定父元素下的指定子元素;#kw,因输入框的 id 属性'kw'在页面中唯一;#su,简洁且不易出错。
xpath 不仅能在 HTML 中选取节点,还支持通过路径表达式、属性匹配、索引定位等复杂逻辑查找元素,适用场景更广泛。文档中给出了 xpath 的核心语法与实战案例:
//*[@id='kw'] 可定位 id 为'kw'的元素,* 表示匹配任意节点,@id='kw' 是属性匹配条件;//div/ul/li[3] 可定位百度首页第三个'百度热搜'标签;//input/.. 能快速定位 input 元素的父节点,适用于需要通过子元素反向查找父元素的场景。值得注意的是,虽然浏览器右键'Copy selector/xpath'能快速生成定位表达式,但这些自动生成的表达式可能不满足'唯一性'要求,实际测试中常需要手动修改 —— 比如删除冗余的层级路径、补充属性匹配条件,这也是掌握定位语法的核心原因。
找到元素后,需要通过函数对元素执行点击、输入、文本获取等操作,文档中详细列出了 Python 自动化测试中最常用的操作函数及实战场景。
click() 函数,例如定位'百度一下'按钮后执行点击,触发搜索动作,代码示例为 driver.find_element(By.CSS_SELECTOR, "#su").click();# 找到百度一下按钮并点击
driver.find_element(By.CSS_SELECTOR, "#su").click()
submit() 函数提交表单,但实际测试中 click() 适用性更广,多数场景下优先使用。send_keys("内容") 函数可模拟键盘输入,例如向百度搜索框输入'迪丽热巴',代码为 driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴");driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")
clear() 函数清空原有文本,再执行新的输入 —— 比如先输入'迪丽热巴',1 秒后清空并输入'古力娜扎',完整代码需结合 time.sleep() 控制时序。driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("迪丽热巴")
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "#kw").clear()
time.sleep(1)
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("古力娜扎")
自动化测试中,常需要获取元素文本或属性值来验证结果是否符合预期:
text 属性获取元素可见文本,例如获取百度热搜第一个标签的文本,代码为 text = driver.find_element(By.XPATH, '//*[@id="hotsearch-content-wrapper"]/li[1]/a/span[2]').text;text = driver.find_element(By.XPATH, '//*[@id="hotsearch-contentwrapper"]/li[1]/a/span[2]').text
print(f"text:{text}")
get_attribute("属性名称") 函数获取元素属性值 —— 比如获取按钮的'value'属性、链接的'href'属性,需注意区分'文本'和'属性值',避免混淆;title = driver.title
driver.title 可获取当前页面标题,driver.current_url 可获取当前页面 URL,常用于验证页面跳转是否正确。url = driver.current_url
自动化测试中,多窗口切换、弹窗弹出是常见场景,若不处理会导致脚本'迷路'或元素定位失败,文档中提供了完整的控制方案。
每个浏览器窗口都有唯一的'句柄(handle)',程序通过句柄识别和切换窗口:
driver.current_window_handle 获取当前窗口句柄,driver.window_handles 获取所有打开窗口的句柄列表;driver.switch_to.window(window) 切换到新窗口,适用于点击链接打开新页面的场景;curWindow = driver.current_window_handle
allWindows = driver.window_handles
for window in allWindows:
if window != curWindow:
driver.switch_to.window(window)
driver.maximize_window()(最大化)、driver.minimize_window()(最小化)可控制窗口大小;driver.save_screenshot("路径") 能截取当前屏幕,用于报错时记录现场;—— 高阶用法可结合时间戳生成唯一文件名,避免截图覆盖。# 窗口最大化
driver.maximize_window()
# 窗口最小化
driver.minimize_window()
# 窗口全屏
driver.fullscreen_window()
# 手动设置窗口大小
driver.set_window_size(1024, 768)
# 关闭窗口
driver.close() # 注意:窗口关闭后 driver 要重新定义
# 简单版本
driver.save_screenshot('../images/image.png')
# 高阶版本
filename = "autotest-" + datetime.datetime.now().strftime('%Y-%m-%d-%H%M%S') + '.png'
driver.save_screenshot('../images/' + filename)
页面弹窗(警告弹窗、确认弹窗、提示弹窗)无法通过常规元素定位找到,需使用 Selenium 提供的 Alert 接口:
警告 / 确认弹窗:通过 driver.switch_to.alert 切换到弹窗,alert.accept() 点击'确定',alert.dismiss() 点击'取消';

alert = driver.switch_to.alert
# 确认
alert.accept()
# 取消
alert.dismiss()
alert.send_keys("内容") 输入,再执行确认操作。
alert = driver.switch_to.alert
alert.send_keys("hello")
alert.accept()
代码执行速度远快于页面渲染速度,若不设置等待,程序可能在元素未加载时就执行操作,导致'元素找不到'的误报。文档中介绍了三种等待方式,各有适用场景。
time.sleep(秒数),强制让代码暂停指定时间,等待页面加载;driver.implicitly_wait(秒数),设置全局等待时间,在指定时间内不断查找元素,找到则继续执行,超时未找到则报错;driver 对象未释放(未执行 driver.quit()),等待就一直生效,无需重复设置。WebDriverWait(driver, 秒数).until(条件),在指定时间内等待'条件满足',满足则继续执行,超时则报错;ExpectedConditions 类,例如 EC.presence_of_element_located(locator)(元素存在于 DOM 中)、EC.visibility_of_element_located(locator)(元素可见)、EC.alert_is_present()(弹窗出现)等;from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 2)
wait.until(EC.invisibility_of_element((By.XPATH, '//*[@id="2"]/div/div/div[3]/div[1]/div[1]/div')))
| 方法 | 说明 |
|---|---|
title_is(title) | 检查页面标题的期望值 |
title_contains(title) | 检查标题是否包含区分大小写的子字符串的期望值 |
visibility_of_element_located(locator, str]) | 检查元素是否存在于页面的 DOM 上并且可见的期望值。 |
presence_of_element_located (locator, str]) | 用于检查元素是否存在于页面的 DOM 上的期望值 |
visibility_of (element) | 检查已知存在于页面 DOM 上的元素是否可见的期望 |
alert_is_present () | 检查是否出现弹窗 |
关键提醒: 隐式等待和显示等待不能混合使用!文档中的实验表明,设置 10 秒隐式等待 + 15 秒显示等待,最终会导致 20 秒后才超时,出现不可预测的等待时间。
# 隐式等待设置为 10s,显示等待设置为 15s,那么结果会是 5+10=15s 吗?
driver.implicitly_wait(10)
wait = WebDriverWait(driver, 15)
start = time.time()
try:
res = wait.until(EC.presence_of_element_located((By.XPATH, '//*[@id="2"]/div/div/div[3]/div[1]/div[1]/div/div/div')))
except:
end = time.time()
print("no such element")
driver.quit()
print(end - start)

除了核心模块,文档还补充了浏览器导航和文件上传的常用函数,覆盖更多测试场景。
driver.get("URL"),例如 driver.get("https://tool.lu/");driver.get("https://tool.lu/")
driver.forward()(前进)、driver.back()(后退)、driver.refresh()(刷新),适用于需要在多个页面间切换的测试场景。driver.back()
driver.forward()
driver.refresh()

Selenium 无法识别系统自带的文件上传窗口,但可通过 send_keys 函数直接传入文件路径,间接实现上传:
input 元素(类型为 file),调用 send_keys("文件路径"),例如 ele.send_keys("D:\\file\\test.txt");driver.get("file:///D:/file/%E6%AF%94%E7%89%B9%E6%95%99%E5%8A%A1/%E6%B5%8B%E8%A F%95/selenium4html/selenium-html/upload.html")
ele = driver.find_element(By.CSS_SELECTOR, "body > div > div > input[type=file]")
ele.send_keys("D:\\file\\test.txt")
\\(转义)或 /。浏览器参数设置是自动化测试的'前置配置',通过自定义参数可模拟不同设备、禁用弹窗、设置代理等,解决特殊场景下的测试需求。以下是 Python 自动化中常用的浏览器参数配置方法:
options = webdriver.ChromeOptions()
options.add_argument("-headless")
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)
options.page_load_strategy = '加载方式'
页面加载方式主要有三种类型:
| 策略 | 说明 |
|---|---|
| normal | 默认值,等待所有资源下载 |
| eager | DOM 访问已准备就绪,但诸如图像的其他资源可能仍在加载 |
| none | 完全不会阻塞 WebDriver |
options = webdriver.ChromeOptions()
options.page_load_strategy = 'eager'
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online