
做 Web 自动化测试时,你是否遇到过这些崩溃瞬间:明明看到页面上的按钮,脚本却死活找不到;好不容易定位到元素,点击后却没反应;页面还没加载完成,代码就已经执行下一步导致报错;切换窗口后,脚本直接 “迷路” 找不到目标元素…… 其实,自动化测试的核心就是 “和浏览器打交道”,而 Selenium 提供的常用函数,就是你与浏览器沟通的 “语言”。就像学英语要先掌握核心词汇和句型,做自动化测试也必须吃透这些常用函数 —— 它们是搭建自动化脚本的 “砖瓦”,是解决实战问题的 “钥匙”,更是从 “自动化新手” 进阶到 “测试高手” 的必经之路。 很多人之所以觉得自动化测试难,不是因为逻辑复杂,而是因为没理清常用函数的用法、场景和坑点。比如同样是 “等待”,什么时候用强制等待,什么时候用显式等待?同样是 “获取文本”,为什么有时候用
text方法拿不到值?同样是 “切换窗口”,为什么切换后还是找不到元素? 今天这篇文章,就带大家彻底吃透 Selenium 自动化测试的常用函数。我们以 Python 语言为基础,从元素定位、操作测试对象、窗口控制、弹窗处理、等待机制、浏览器导航、文件上传到浏览器参数设置,8 大核心模块逐一拆解,让你看完就能用,用了就见效!下面就让我们正式开始吧!
Web 自动化测试的第一步,也是最关键的一步,就是 “找到页面上的元素”—— 就像追求心仪的对象,首先得知道对方在哪里。Selenium 提供了多种元素定位方式,其中最常用、最稳定的就是CSS Selector和XPath。
CSS Selector 是通过 CSS 选择器语法定位元素,优点是语法简洁、定位速度快、稳定性高,是企业实战中最常用的定位方式。

选择器类型 | 语法 | 示例 | 说明 |
|---|---|---|---|
ID 选择器 | #id值 | #kw | 定位 id 为 “kw” 的元素(如百度搜索框) |
Class 选择器 | .class值 | .s_ipt | 定位 class 为 “s_ipt” 的元素 |
标签选择器 | 标签名 | input | 定位所有 input 标签的元素 |
子类选择器 | 父元素 > 子元素 | #s-hotsearch-wrapper > div | 定位 id 为 “s-hotsearch-wrapper” 下的直接子 div 元素 |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
# 初始化浏览器
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 1. 定位百度搜索框(id=kw)
search_input = driver.find_element(By.CSS_SELECTOR, "#kw")
print("成功定位搜索框")
# 2. 定位“百度一下”按钮(id=su)
search_btn = driver.find_element(By.CSS_SELECTOR, "#su")
print("成功定位百度一下按钮")
# 3. 定位百度热搜标题(class=s-hotsearch-title)
hotsearch_title = driver.find_element(By.CSS_SELECTOR, ".s-hotsearch-title")
print(f"百度热搜标题:{hotsearch_title.text}")
driver.quit()find_element会返回第一个匹配的元素,此时需要结合其他选择器优化;>(如#s-hotsearch-wrapper div)。XPath 是 XML 路径语言,不仅能定位 HTML 元素,还能通过路径、属性、层级等多种方式定位,堪称 “万能定位器”。当 CSS Selector 无法满足需求时,XPath 总能派上用场。
语法 | 功能 | 示例 |
|---|---|---|
//* | 获取页面所有节点 | //* 定位页面所有元素 |
//标签名 | 获取指定标签的所有节点 | //ul 定位所有 ul 标签元素 |
/ | 匹配直接子节点 | //span/input 定位 span 标签下的直接子 input 元素 |
.. | 匹配父节点 | //input/.. 定位 input 元素的父节点 |
[@属性名='属性值'] | 按属性匹配节点 | //*[@id='kw'] 定位 id 为 kw 的元素 |
[索引] | 按索引匹配节点 | //div/ul/li[3] 定位第 3 个 li 元素(索引从 1 开始) |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 1. 按ID定位搜索框
search_input = driver.find_element(By.XPATH, "//*[@id='kw']")
search_input.send_keys("自动化测试常用函数")
# 2. 按索引定位第2个热搜词条
second_hotsearch = driver.find_element(By.XPATH, "//div[@id='hotsearch-content-wrapper']/li[2]/a/span[2]")
print(f"第2个热搜词条:{second_hotsearch.text}")
# 3. 定位父节点(搜索框的父div)
search_input_parent = driver.find_element(By.XPATH, "//*[@id='kw']/..")
print(f"搜索框父节点标签名:{search_input_parent.tag_name}")
driver.quit()新手不用死记硬背语法,Chrome 浏览器提供了快速复制功能:
定位方式 | 语法 | 优点 | 缺点 |
|---|---|---|---|
CSS Selector | By.CSS_SELECTOR, "选择器" | 速度快、语法简洁、稳定 | 部分复杂场景支持不足 |
XPath | By.XPATH, "路径表达式" | 功能强大、覆盖所有场景 | 速度较慢、语法复杂 |
实战建议:90% 的场景用 CSS Selector,10% 的复杂场景(如定位父节点、按文本匹配)用 XPath。
找到元素后,下一步就是对元素进行操作 —— 输入文本、点击按钮、获取信息等。这部分函数是自动化脚本的核心,必须熟练掌握。
click()(最常用)模拟用户点击元素,适用于按钮、链接、复选框等可点击元素。
element.click()from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 定位并点击“百度一下”按钮
search_btn = driver.find_element(By.CSS_SELECTOR, "#su")
search_btn.click()
print("成功点击百度一下按钮")
driver.quit()click()会报错;send_keys()(核心输入函数)模拟用户在输入框中输入文本,支持字符串、键盘按键(如回车、空格)。
element.send_keys("文本内容")from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 定位搜索框并输入文本
search_input = driver.find_element(By.CSS_SELECTOR, "#kw")
search_input.send_keys("Selenium常用函数")
print("成功输入搜索关键词")
driver.quit()# 导入键盘按键模块
from selenium.webdriver.common.keys import Keys
# 输入文本后按回车(替代点击搜索按钮)
search_input.send_keys("Selenium常用函数", Keys.ENTER)clear()(输入前必做)清除输入框中的已有文本,避免旧文本影响测试结果。
element.clear()from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
search_input = driver.find_element(By.CSS_SELECTOR, "#kw")
# 输入第一个关键词
search_input.send_keys("迪丽热巴")
time.sleep(1) # 等待1秒,便于观察
print("第一次输入:迪丽热巴")
# 清除文本
search_input.clear()
time.sleep(1)
print("已清除文本")
# 输入第二个关键词
search_input.send_keys("古力娜扎")
print("第二次输入:古力娜扎")
driver.quit()clear()会报错;clear()未清除干净,可先按Ctrl+A全选再删除。text(验证结果核心)获取元素的文本内容,用于验证测试结果是否符合预期。
element.text(注意:是属性,不是方法,无需加括号)from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 获取百度热搜第一个词条的文本
first_hotsearch = driver.find_element(By.XPATH, "//*[@id='hotsearch-content-wrapper']/li[1]/a/span[2]")
hotsearch_text = first_hotsearch.text
print(f"百度热搜第一名:{hotsearch_text}")
# 验证结果(断言)
assert "热搜" in hotsearch_text, "测试失败:热搜词条不包含关键词"
print("测试通过:热搜词条符合预期")
driver.quit()text拿不到 “百度一下” 按钮的文字? 很多新手会疑惑:“百度一下” 按钮上明明有文字,为什么用element.text获取到的是空字符串?
答案:text方法只能获取元素 “标签内的文本”,而 “百度一下” 按钮的文字是通过value属性设置的(HTML 代码:<input type="submit" id="su" value="百度一下">),并非标签内的文本。
get_attribute() 要获取元素的属性值(如value、href、src),需要使用get_attribute("属性名")方法。
# 获取“百度一下”按钮的value属性值
search_btn = driver.find_element(By.CSS_SELECTOR, "#su")
btn_text = search_btn.get_attribute("value")
print(f"按钮文字:{btn_text}") # 输出:百度一下# 获取链接的href属性(跳转地址)
link = driver.find_element(By.XPATH, "//a[text()='新闻']")
link_url = link.get_attribute("href")
print(f"新闻链接:{link_url}")
# 获取图片的src属性(图片地址)
img = driver.find_element(By.CSS_SELECTOR, ".index-logo-src")
img_src = img.get_attribute("src")
print(f"百度Logo地址:{img_src}")title和current_url在自动化测试中,经常需要验证是否跳转到了正确的页面,此时就需要获取当前页面的标题和 URL。
driver.titledriver.title(属性,无需括号)<title>标签内容)。driver.current_urldriver.current_url(属性,无需括号)from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 1. 获取首页标题和URL
home_title = driver.title
home_url = driver.current_url
print(f"首页标题:{home_title}")
print(f"首页URL:{home_url}")
# 2. 搜索后验证跳转
search_input = driver.find_element(By.CSS_SELECTOR, "#kw")
search_input.send_keys("Selenium")
driver.find_element(By.CSS_SELECTOR, "#su").click()
# 3. 获取搜索结果页的标题和URL
result_title = driver.title
result_url = driver.current_url
print(f"搜索结果页标题:{result_title}")
print(f"搜索结果页URL:{result_url}")
# 4. 断言验证
assert "Selenium" in result_title, "测试失败:页面标题不包含关键词"
assert "wd=Selenium" in result_url, "测试失败:URL不包含搜索关键词"
print("测试通过:页面跳转符合预期")
driver.quit()函数 / 属性 | 语法 | 功能 | 适用场景 |
|---|---|---|---|
点击 | element.click() | 模拟用户点击 | 按钮、链接、复选框 |
输入文本 | element.send_keys("文本") | 模拟输入文本 | 输入框、文本域 |
清除文本 | element.clear() | 清除输入框内容 | 输入框重新输入时 |
获取文本 | element.text | 获取元素标签内文本 | 标题、词条、提示信息 |
获取属性 | element.get_attribute("属性名") | 获取元素属性值 | value、href、src 等 |
获取页面标题 | driver.title | 获取当前页面标题 | 验证页面跳转 |
获取当前 URL | driver.current_url | 获取当前页面 URL | 验证页面跳转 |
在自动化测试中,经常会遇到打开新窗口的场景(如点击链接弹出新页面)。此时脚本会默认停留在原窗口,导致无法操作新窗口的元素,这就需要通过 “窗口句柄” 来切换窗口。
每个浏览器窗口都有一个唯一的标识符,称为 “窗口句柄”(handle)。Selenium 通过句柄来区分不同的窗口,实现窗口切换。
driver.current_window_handle(返回当前聚焦窗口的句柄)driver.window_handles(返回所有已打开窗口的句柄列表,顺序为窗口打开顺序)switch_to.window()driver.switch_to.window(目标窗口句柄)from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 1. 获取原窗口句柄
original_handle = driver.current_window_handle
print(f"原窗口句柄:{original_handle}")
# 2. 点击“新闻”链接,打开新窗口
news_link = driver.find_element(By.XPATH, "//a[text()='新闻']")
news_link.click()
# 3. 获取所有窗口句柄
all_handles = driver.window_handles
print(f"所有窗口句柄:{all_handles}")
# 4. 切换到新窗口(遍历所有句柄,找到非原窗口的句柄)
for handle in all_handles:
if handle != original_handle:
driver.switch_to.window(handle)
break
# 5. 操作新窗口(验证新闻页面标题)
news_title = driver.title
print(f"新窗口(新闻页)标题:{news_title}")
assert "百度新闻" in news_title, "测试失败:未成功切换到新闻窗口"
print("测试通过:成功切换到新窗口")
# 6. 切换回原窗口(可选)
driver.switch_to.window(original_handle)
print(f"切换回原窗口,标题:{driver.title}")
driver.quit()Selenium 提供了多种窗口大小控制函数,满足不同测试场景需求。
函数 | 语法 | 功能 |
|---|---|---|
窗口最大化 | driver.maximize_window() | 模拟用户点击窗口最大化按钮 |
窗口最小化 | driver.minimize_window() | 模拟用户点击窗口最小化按钮 |
窗口全屏 | driver.fullscreen_window() | 模拟用户按 F11 进入全屏模式 |
自定义窗口大小 | driver.set_window_size(宽度, 高度) | 设置窗口为指定尺寸(像素) |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import time
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 1. 窗口最大化
driver.maximize_window()
print("窗口已最大化")
time.sleep(2)
# 2. 自定义窗口大小(1024x768)
driver.set_window_size(1024, 768)
print("窗口大小设置为1024x768")
time.sleep(2)
# 3. 窗口全屏
driver.fullscreen_window()
print("窗口已全屏")
time.sleep(2)
# 4. 窗口最小化
driver.minimize_window()
print("窗口已最小化")
time.sleep(2)
driver.quit()set_window_size(375, 667)模拟 iPhone 8)。save_screenshot()(调试 / 报错必备)自动化脚本通常在后台运行,当脚本报错时,无法直接看到当时的页面状态。屏幕截图功能可以记录报错瞬间的页面,帮助快速定位问题。
driver.save_screenshot("截图路径")from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 截图并保存到指定路径(相对路径或绝对路径均可)
driver.save_screenshot("./screenshots/baidu_home.png")
print("截图已保存到 ./screenshots/baidu_home.png")
driver.quit()from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
import datetime
import os
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 1. 创建截图目录(如果不存在)
screenshot_dir = "./screenshots"
if not os.path.exists(screenshot_dir):
os.makedirs(screenshot_dir)
# 2. 按时间生成截图文件名(格式:年-月-日-时-分-秒.png)
current_time = datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")
screenshot_path = f"{screenshot_dir}/autotest-{current_time}.png"
# 3. 截图并保存
driver.save_screenshot(screenshot_path)
print(f"截图已保存到:{screenshot_path}")
driver.quit()try-except异常捕获中添加截图代码,报错时自动记录状态;close() vs quit()很多新手会混淆这两个关闭函数,其实它们的功能差异很大:
函数 | 语法 | 功能 | 适用场景 |
|---|---|---|---|
close() | driver.close() | 关闭当前聚焦的窗口 | 只关闭单个窗口,其他窗口保持打开 |
quit() | driver.quit() | 关闭所有浏览器窗口,终止驱动进程 | 脚本执行完毕,彻底退出浏览器 |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 打开新窗口
driver.find_element(By.XPATH, "//a[text()='新闻']").click()
all_handles = driver.window_handles
# 切换到新窗口并关闭
driver.switch_to.window(all_handles[1])
driver.close()
print("已关闭新闻窗口")
# 切换回原窗口,继续操作
driver.switch_to.window(all_handles[0])
print(f"当前窗口标题:{driver.title}")
# 脚本结束,关闭所有窗口
driver.quit()quit():quit()会释放驱动进程,避免占用系统资源;如果只用close(),驱动进程可能残留。 Web 页面中常见的弹窗有 3 种:警告弹窗、确认弹窗、提示弹窗。这些弹窗是浏览器自带的,并非 HTML 元素,无法通过常规元素定位方式操作,需要使用 Selenium 的Alert接口处理。
switch_to.alert 首先需要将脚本聚焦到弹窗上,语法:alert = driver.switch_to.alert(Python 中是switch_to.alert,注意大小写)。
获取到alert对象后,可使用以下方法操作弹窗:
方法 | 功能 | 适用弹窗类型 |
|---|---|---|
accept() | 点击 “确定” 按钮 | 所有弹窗 |
dismiss() | 点击 “取消” 按钮 | 确认弹窗、提示弹窗 |
send_keys("文本") | 输入文本 | 提示弹窗(带输入框的弹窗) |

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
# 本地HTML文件(含警告弹窗)
html_path = "file:///D:/test/alert_test.html"
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get(html_path)
# 点击按钮触发警告弹窗
driver.find_element(By.CSS_SELECTOR, "#alertBtn").click()
# 切换到弹窗并点击确定
alert = driver.switch_to.alert
print(f"弹窗提示内容:{alert.text}") # 获取弹窗文本
alert.accept()
print("已关闭警告弹窗")
driver.quit()from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
html_path = "file:///D:/test/confirm_test.html"
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get(html_path)
# 点击按钮触发确认弹窗
driver.find_element(By.CSS_SELECTOR, "#confirmBtn").click()
# 切换到弹窗
alert = driver.switch_to.alert
print(f"弹窗提示内容:{alert.text}")
# 点击取消按钮(点击确定用 alert.accept())
alert.dismiss()
print("已点击取消按钮")
driver.quit()
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
html_path = "file:///D:/test/prompt_test.html"
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get(html_path)
# 点击按钮触发提示弹窗
driver.find_element(By.CSS_SELECTOR, "#promptBtn").click()
# 切换到弹窗
alert = driver.switch_to.alert
print(f"弹窗提示内容:{alert.text}")
# 输入文本并点击确定
alert.send_keys("自动化测试工程师")
alert.accept()
print("已输入文本并点击确定")
driver.quit()switch_to.alert,否则会报错;自动化脚本执行速度远快于页面渲染速度 —— 如果脚本执行到某个步骤时,页面元素还未加载完成,就会导致元素定位失败,脚本报错。等待机制就是为了解决这个问题,让脚本 “等待” 页面加载完成后再执行下一步。
Selenium 提供 3 种等待方式:强制等待、隐式等待、显式等待。
time.sleep(秒数)(最简单)import time; time.sleep(5)from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 强制等待3秒(模拟页面加载)
time.sleep(3)
# 定位元素
search_input = driver.find_element(By.CSS_SELECTOR, "#kw")
search_input.send_keys("强制等待")
print("输入成功")
driver.quit()implicitly_wait(秒数)(全局智能等待)driver.implicitly_wait(10)from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# 设置隐式等待10秒(作用于整个脚本)
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 无需额外等待,脚本会自动等待元素加载完成
search_input = driver.find_element(By.CSS_SELECTOR, "#kw")
search_input.send_keys("隐式等待")
print("输入成功")
driver.quit()driver对象未被quit(),隐式等待就对所有元素定位生效;WebDriverWait(精准智能等待)WebDriverWait(driver, 超时时间).until(等待条件)需要导入以下模块:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ECexpected_conditions)条件 | 说明 | 示例 |
|---|---|---|
EC.presence_of_element_located((定位方式, 定位值)) | 元素存在于 DOM 中 | 等待搜索框存在 |
EC.visibility_of_element_located((定位方式, 定位值)) | 元素可见(存在且未隐藏) | 等待按钮可见 |
EC.element_to_be_clickable((定位方式, 定位值)) | 元素可点击 | 等待按钮可点击 |
EC.title_contains("关键词") | 页面标题包含关键词 | 等待页面标题包含 “百度” |
EC.alert_is_present() | 弹窗出现 | 等待弹窗弹出 |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
driver.get("https://www.baidu.com")
# 显式等待:等待搜索框可见(最多等待10秒,每0.5秒检查一次)
wait = WebDriverWait(driver, 10)
search_input = wait.until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "#kw"))
)
# 输入文本
search_input.send_keys("显式等待")
print("输入成功")
# 显式等待:等待“百度一下”按钮可点击,并点击
search_btn = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "#su"))
)
search_btn.click()
driver.quit()很多新人或许会觉得 “多等总比少等好”,同时设置隐式等待和显式等待,但这样会导致等待时间不可预测。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# 隐式等待10秒
driver.implicitly_wait(10)
# 显式等待15秒
wait = WebDriverWait(driver, 15)
start_time = time.time()
try:
# 定位一个不存在的元素
wait.until(EC.presence_of_element_located((By.ID, "nonexistent-element")))
except Exception as e:
end_time = time.time()
print(f"报错时间:{end_time - start_time:.2f}秒") # 输出约20秒(10+15)
driver.quit()隐式等待和显式等待的等待时间会叠加,导致实际等待时间远超预期,影响脚本执行效率。
time.sleep);implicitly_wait);WebDriverWait);Selenium 提供了模拟浏览器导航栏操作的函数,如打开网页、前进、后退、刷新等,完美复刻用户的浏览器操作。
driver.get("URL")(最基础)driver.get("https://www.baidu.com")driver.forward()driver.forward()driver.back()driver.back()driver.refresh()driver.refresh()from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
import time
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# 1. 打开百度首页
driver.get("https://www.baidu.com")
print(f"当前页面:{driver.title}")
time.sleep(2)
# 2. 搜索关键词,跳转到结果页
driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("浏览器导航")
driver.find_element(By.CSS_SELECTOR, "#su").click()
print(f"搜索后页面:{driver.title}")
time.sleep(2)
# 3. 后退到百度首页
driver.back()
print(f"后退后页面:{driver.title}")
time.sleep(2)
# 4. 前进到搜索结果页
driver.forward()
print(f"前进后页面:{driver.title}")
time.sleep(2)
# 5. 刷新当前页面
driver.refresh()
print("页面已刷新")
time.sleep(2)
driver.quit()forward()和back()才有效; 文件上传是自动化测试中的常见场景,但上传文件时会弹出系统自带的文件选择窗口 ——Selenium 无法识别系统窗口,此时需要用send_keys()函数绕开系统窗口,直接上传文件。
文件上传的本质是向<input type="file">类型的元素传递文件路径。Selenium 的send_keys()函数可以直接向该元素传入文件的绝对路径,从而实现文件上传,无需操作系统窗口。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
# 打开本地文件上传测试页面
driver.get("file:///D:/test/upload.html")
# 定位<input type="file">元素
upload_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
# 传入文件绝对路径(注意:Windows系统用双反斜杠\\,Linux/Mac用斜杠/)
file_path = "D:\\test\\test_file.txt"
upload_input.send_keys(file_path)
print(f"已上传文件:{file_path}")
driver.quit()<input type="file">元素:该元素可能被隐藏(通过 CSS 设置display:none),需先让元素可见(如通过 JS 修改样式);\\(避免转义),Linux/Mac 系统用/。如果上传元素被隐藏,可通过执行 JavaScript 代码让元素可见:
# 定位隐藏的上传元素
upload_input = driver.find_element(By.CSS_SELECTOR, "input[type='file']")
# 执行JS代码,让元素可见
driver.execute_script("arguments[0].style.display = 'block';", upload_input)
# 上传文件
upload_input.send_keys("D:\\test\\test_file.txt") Selenium 支持通过ChromeOptions(Chrome 浏览器)设置浏览器启动参数,如无头模式、页面加载策略、禁用缓存等,满足不同测试场景需求。
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
# 创建ChromeOptions对象
options = webdriver.ChromeOptions()
# 添加启动参数
options.add_argument("参数名")
# 初始化浏览器时传入options
driver = webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=options
)options.add_argument("--headless=new")(Chrome 112 + 版本推荐)from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
# 启用无头模式
options.add_argument("--headless=new")
driver = webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=options
)
driver.get("https://www.baidu.com")
print(f"页面标题:{driver.title}") # 正常输出标题,无浏览器窗口显示
driver.quit()options.page_load_strategy = "策略名称"策略 | 说明 | 适用场景 |
|---|---|---|
normal | 默认值,等待所有资源(图片、JS、CSS)加载完成 | 需要完整页面交互 |
eager | DOM 加载完成后即可执行脚本,无需等待图片等资源 | 只操作 DOM 元素,不关心图片 |
none | 不等待页面加载完成,立即执行后续脚本 | 快速获取页面信息,无需交互 |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
# 设置页面加载策略为eager(DOM就绪即可)
options.page_load_strategy = "eager"
driver = webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=options
)
driver.get("https://www.baidu.com")
print(f"页面标题:{driver.title}")
driver.quit()参数 | 功能 | 代码示例 |
|---|---|---|
禁用缓存 | 禁止浏览器缓存,避免缓存影响测试 | options.add_argument("--disable-cache") |
禁用 JavaScript | 禁用页面 JS 执行 | options.add_argument("--disable-javascript") |
模拟手机设备 | 模拟指定手机型号(如 iPhone 12) | options.add_experimental_option("mobileEmulation", {"deviceName": "iPhone 12"}) |
忽略证书错误 | 忽略 HTTPS 证书错误 | options.add_argument("--ignore-certificate-errors") |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
# 模拟iPhone 12访问
options.add_experimental_option(
"mobileEmulation",
{"deviceName": "iPhone 12"}
)
driver = webdriver.Chrome(
service=ChromeService(ChromeDriverManager().install()),
options=options
)
driver.get("https://www.baidu.com")
print(f"手机端页面标题:{driver.title}")
driver.save_screenshot("./mobile_baidu.png")
print("手机端截图已保存")
driver.quit()掌握 Selenium 常用函数的关键,不是死记硬背,而是理解 “什么时候用、怎么用、怎么避坑”。 自动化测试的本质是 “用代码解决重复工作”,而常用函数就是实现这个目标的 “工具库”。希望这篇文章能帮你彻底吃透 Selenium 常用函数,让你在自动化测试的路上少走弯路,快速从新手进阶为高手! 如果在实际使用中遇到具体问题(如元素定位失败、弹窗处理不了、文件上传报错),欢迎在评论区留言,我们一起交流探讨!