跳到主要内容
Selenium Web 自动化测试入门与实战指南 | 极客日志
Python 大前端
Selenium Web 自动化测试入门与实战指南 综述由AI生成 Selenium Web 自动化测试的核心概念与实战技巧。涵盖环境搭建、浏览器控制、元素定位(XPath/CSS)、等待机制、页面交互(Frame/Window/Hover)及文件上传处理。通过 Python 代码示例演示了如何替代人工操作,实现高效稳定的自动化测试流程。
奇形怪状 发布于 2026/3/23 更新于 2026/4/26 3 浏览Selenium 简介
Selenium 是一个强大的开源框架,主要用于 Web 自动化测试。虽然名字听起来像汽车品牌,但在技术领域,它是模拟人类操作网页的核心工具。
简单来说,Selenium 的主要工作是模拟人类在网页上的各种操作——比如点击按钮、输入文字、提交表单,甚至还能抓取页面截图,帮你检查网站的功能和性能。
它支持多种编程语言(Python、Java、C# 等),并且能在各种浏览器(Chrome、Firefox、Edge 等)上运行。
Selenium 主要能帮你做些啥?
自动化测试: 将你手动测试的流程,转化为一行行代码,让电脑替你跑。
性能测试: 测量网页加载需要多久,响应速度怎么样,帮你找出短板。
页面截图: 自动截取网页不同状态的图片,帮你生成漂亮的测试报告,或者在出现问题时,留下证据。
总而言之,如果你想成为 Web 应用测试领域的效率达人,Selenium 绝对是你不可或缺的武器库。
Selenium vs Appium
很多人在学习自动化测试时,会遇到 Selenium 和 Appium 这对'难兄难弟'。它们名字听起来有点像,都能做自动化,但侧重点完全不同!
相同点:
血缘关系近: Appium 本质上是基于 Selenium 的思想进行二次开发的,所以它们在某些方面(比如定位元素的方式,click、send_keys 等操作)是挺像的。
不同点:
特性 Selenium Appium 应用领域 Web 应用 (浏览器里的网页)移动 App (手机上的 APP )底层技术 浏览器驱动 (如 Chrome Driver) 移动原生 API (iOS: XCUITest, Android: UiAutomator) 环境配置 需要安装不同浏览器的 Driver 需要模拟器/真机,配置 SDK 等 通信协议 HTTP 协议 WebDriver 协议
用大白话来说:
Selenium 就像一个'浏览器驾驶员' ,专门负责驾驶浏览器,在网页上进行各种操作。
Appium 就像一个'手机应用司机' ,专门驾驶手机 App,在屏幕上点点划划。
所以,看你的测试对象是网站还是 App,就能决定用谁啦!
Selenium 工作原理
你有没有好奇过,为什么你写的一行行代码,Selenium 就能让浏览器乖乖执行?这背后有一套精密的工作流程!
发号施令: 你的自动化测试脚本(Selenium Client)会启动一个 WebDriver 服务。
传达指令: WebDriver 会启动对应的浏览器驱动程序(比如 Chrome Driver)。
建立连接: 浏览器驱动程序会打开浏览器,并作为 WebDriver 的远程服务器,监听一个特定的端口。
沟通桥梁: 所有的 Selenium 操作(访问网址、查找元素等),都会通过 WebDriver,以 HTTP 请求的方式发送到浏览器驱动程序。
执行动作: 浏览器驱动程序接收到请求后,解析指令,并指挥浏览器去执行相应的动作(比如找到一个按钮并点击)。
反馈结果: 浏览器执行完动作后,会将结果(成功、失败、元素信息等)通过驱动程序,反馈给你的测试脚本。总结一下:脚本 -> WebDriver -> 浏览器驱动 -> 浏览器 -> 执行 -> 浏览器驱动 -> WebDriver -> 脚本。就像一个层层传递的指挥链!
自动化测试实战剧本
打开浏览器。
输入网址。
找到用户名输入框,输入用户名。
找到密码输入框,输入密码。
点击登录按钮。
看页面是不是跳转到登录后的页面(验证是否成功)。
请起! 调用 WebDriver API 启动浏览器。
去哪儿? 使用 get() 方法访问目标网址。
找人(元素)! 使用各种定位方式找到用户名输入框。
喂点东西! 使用 send_keys() 方法输入用户名。
重复以上步骤! 找到密码框,输入密码。
该你了! 找到登录按钮,执行 click() 操作。
检查一下! 使用断言(比较函数),判断登录后的页面是否符合预期。
环境搭建
Python 3 环境: 这个基础就不用多说了吧?如果还没有,赶紧去 Python 官网安装。
浏览器驱动(WebDriver): 这是 Selenium 和浏览器沟通的桥梁。你需要下载和你浏览器版本匹配的驱动。
驱动放置在哪儿?
最直接: 放在你浏览器的安装目录下(比如 Chrome.exe 所在的文件夹)。
Python 友好: 放在你的 Python 安装目录下。
灵活: 放到任何一个你指定的地方,然后在代码里通过 executable_path 参数告诉 Selenium。
Selenium 库: 在你的 Python 环境里,打开命令行(终端),输入:
看见'Successfully installed selenium'就说明成功了!
基础十八般武艺 工欲善其事,必先利其器。下面这些基础操作,是你玩转 Selenium 的入门技能!
1. 浏览器操作函数 python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
启动浏览器 (注意:Firefox 首字母要大写!)
driver = webdriver.Firefox()
启动 Chrome driver = webdriver.Chrome()
1. 最大化浏览器窗口
2. 访问目标网址 (URL 必须以 http/https 开头)
3. 后退/前进 driver.back()
time.sleep(2)
driver.forward()
time.sleep(2)
4. 刷新浏览器 driver.refresh()
time.sleep(2)
5. 关闭当前窗口
driver.quit() # 退出所有窗口,结束 WebDriver 会话 (更常用!)
2. 定位方式 页面上的每一个元素(按钮、输入框、链接等)都需要被精确找到,才能进行操作。Selenium 提供了多种定位方式:
定位方式 描述 示例写法(代码中) By.ID根据元素的 id 属性定位 driver.find_element(By.ID, "some_id")By.CLASS_NAME根据元素的 class 属性定位 driver.find_element(By.CLASS_NAME, "some_class")By.NAME根据元素的 name 属性定位 driver.find_element(By.NAME, "some_name")By.LINK_TEXT根据链接的完整文本定位 (<a> 标签) driver.find_element(By.LINK_TEXT, "点击这里")By.PARTIAL_LINK_TEXT根据链接的部分文本定位 (<a> 标签) driver.find_element(By.PARTIAL_LINK_TEXT, "这里")By.TAG_NAME根据元素的标签名定位 (如 <div>, <p>) driver.find_element(By.TAG_NAME, "div")By.XPATH强大的 XML 路径语言,万能定位! driver.find_element(By.XPATH, "//div[@class='hotwords']/a[1]")By.CSS_SELECTORCSS 选择器,也是非常常用的定位方式 driver.find_element(By.CSS_SELECTOR, "div.hotwords > a:first-child")
find_element() 找到第一个匹配的元素。
find_elements() 找到所有匹配的元素,返回一个列表。
3. 元素属性查看 想知道元素的身份证号(id)、绰号(class)等信息?没问题!
在浏览器中,右键点击你想查找的元素,选择'检查'(Inspect)或者按 F12 快捷键,就能打开开发者工具。在 HTML 代码里,高亮的那一块就是元素的'家谱',你可以在那里找到它的各种属性。
4. 操作方法 方法 作用 示例 (已找到元素 element) click()点击 element.click()send_keys("文本")输入文本 element.send_keys("你好,Selenium!")clear()清空输入框内容 element.clear().text获取元素的可见文本 print(element.text)get_attribute("属性名")获取元素的指定属性值 print(element.get_attribute("href")) (获取链接的 URL)get_screenshot_as_file("路径.png")截取页面截图并保存 driver.get_screenshot_as_file("screenshot.png")get_screenshot_as_png()截取页面截图,返回 bytes png_data = driver.get_screenshot_as_png()
5. 等待函数 脚本执行速度太快,页面元素还没加载出来,你就想去操作?这就像你刚进门,就大喊'我饿了!'结果家里人还没做好饭!这样肯定会报错。
显示等待 (WebDriverWait):
这是最推荐、最灵活的等待方式!你可以指定等待的条件(比如元素可见、元素可点击)和最长等待时间。
python
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
等待最多 10 秒,每 0.5 秒检查一次条件 wait = WebDriverWait(driver, 10, 0.5)
等待直到某个元素 presence_of_element_located (出现) element = wait.until(EC.presence_of_element_located((By.ID, "my_element_id")))
等待直到某个元素 visibility_of_element_located (可见) element_visible = wait.until(EC.visibility_of_element_located((By.XPATH, "//button[text()='提交']")))
等待直到某个元素 element_to_be_clickable (可点击) button_clickable = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type='submit']")))
强制等待 (time.sleep):
不管三七二十一,直接'暂停'脚本执行指定的时间。适用于一些特殊情况,但不推荐滥用,因为会降低效率。
python
import time
time.sleep(3)
隐式等待 (implicitly_wait):
设置一个全局的'等待上限'。如果在指定时间内(比如 10 秒)元素加载好了,就立即继续执行;如果没有,就一直等到 10 秒耗尽。
python
driver.implicitly_wait(10)
浏览器启动参数 启动浏览器时,你可以给它一些'指示',让它以你想要的方式运行。
参数 作用 --user-agent=""设置请求头的 User-Agent (模拟不同浏览器身份) --window-size=1366,768设置浏览器窗口大小 (分辨率) --headless无界面运行 (跑脚本时看不见浏览器窗口) --start-maximized最大化运行 (直接全屏,方便查看) --incognito隐身模式 (不保存历史记录和 cookies) --disable-javascript禁用 JavaScript (某些情况下需要)
python
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless') chrome_options.add_argument('--start-maximized')
chrome_options.add_argument('--window-size=1366,768') 提示: 启动 Chrome 时,可能会出现'Chrome 正受到自动化测试软件的控制'的提示。想去掉它?用 add_experimental_option:
python
chrome_options = Options()
chrome_options.add_experimental_option('useAutomationExtension', False)
chrome_options.add_experimental_option("excludeSwitches", ['enable-automation'])
driver = webdriver.Chrome(options=chrome_options)
XPath 定位 XPath 就像是给网页 HTML 文档制作了一份'地图',你可以通过它精确地找到任何一个元素。
绝对路径(/ 开头): 从根节点(<html>)一级一级往下找,非常精确,但一旦页面结构改动,就很容易失效。
/html/body/div/div[3]/div[2]/form/input
相对路径(// 开头): 从当前节点开始,不受页面结构改变的影响,更灵活。
//input[@id='word'] (找到 id 为 word 的 input 标签)
标签 + 属性: //div[@class='hotwords']
模糊匹配:
starts-with(@id, 'xxxx'): ID 以 'xxxx' 开头。
ends-with(@id, 'xxxx'): ID 以 'xxxx' 结尾 (支持较新版本)。
contains(@id, 'xxxx'): ID 包含 'xxxx'。
contains(text(), 'xxxx'): 元素文本包含 'xxxx'。
定位同级元素:
preceding-sibling:::当前元素的前一个兄弟元素。
following-sibling:::当前元素的后一个兄弟元素。
//input[@name="password"]/preceding-sibling::input (找到 password 输入框前面的 input 标签)
利用父级属性定位:
//div[@class='parent-class']/span[@id='child-id']
找到 id 为 'word' 的 input 元素并输入 driver.find_element(By.XPATH, "//input[@id='word']").send_keys("你好,XPath!")
找到 class 为 'hotwords' 的 div 下的第一个 a 标签 driver.find_element(By.XPATH, "//div[@class='hotwords']/a[1]").click()
CSS 定位 CSS 定位和 XPath 类似,也是用来定位元素的,但它的语法更简洁,执行速度通常更快!
标签 + 属性: img[alt="img1"] (找到 alt 属性为 img1 的 img 标签)
标签 + ID: div#my_div_id (等同于 By.ID)
标签 + Class: div.my_class_name (等同于 By.CLASS_NAME)
组合: div#main.container (ID 为 main 且 class 为 container 的 div)
层级关系:
>:直接子元素 (div > span)
空格:后代元素 (div span)
开头/结尾/包含:
a[href^="http://"] (href 以 http:// 开头)
a[href$=".com"] (href 以 .com 结尾)
a[href*="sogou"] (href 包含 sogou)
找到 class 为 'hotwords' 的 div 下的第一个 a 标签 driver.find_element(By.CSS_SELECTOR, "div.hotwords > a:first-child").click()
找到 id 为 'username' 的 input 标签 driver.find_element(By.CSS_SELECTOR, "input#username").send_keys("我的用户名")
XPath vs CSS: XPath 功能更强大,能做的更多;CSS 定位速度更快。一般情况下,XPath 更为常用,因为它更通用。
页面操作 除了基本的点击和输入,页面上还有很多花活儿,Selenium 也能帮你搞定!
1. 切换框架(Frame) 网页中嵌套的小网页(<iframe>)是个麻烦。直接定位里面的元素会失败,你需要先'钻进去'。
进入框架 (根据 id, name, index, 或 XPath 定位) driver.switch_to.frame("iframe_id")
通过 id driver.switch_to.frame(0)
通过索引 (第一个 iframe) iframe_element = driver.find_element(By.XPATH, "//iframe[@name='my_frame']")
driver.switch_to.frame(iframe_element)
在框架内操作元素 driver.find_element(By.ID, "username_in_frame").send_keys("框架里的用户名")
跳出框架 (回到主页面) driver.switch_to.default_content()
driver.switch_to.parent_frame() # 跳到上一级框架 (如果有多层嵌套)
2. 切换窗口 当点击一个链接,打开了新的浏览器窗口时,你需要切换过去才能操作。
获取当前窗口的句柄 (唯一标识) original_window = driver.current_window_handle
打开新窗口 (比如点击一个链接) driver.find_element(By.LINK_TEXT, "打开新窗口").click()
time.sleep(2)
等待新窗口出现
获取所有窗口的句柄 (是个列表) all_handles = driver.window_handles
切换到新打开的窗口 (通常是列表的最后一个) for handle in all_handles:
if handle != original_window:
driver.switch_to.window(handle)
break
找到新窗口就跳出循环
在新窗口进行操作 driver.find_element(By.ID, "element_in_new_window").click()
切回原窗口 driver.switch_to.window(original_window)
3. 鼠标悬停 (Hover) 有时候,鼠标悬停在某个元素上,才会弹出菜单或显示更多信息。
python
from selenium.webdriver.common.action_chains import ActionChains
找到需要悬停的元素 element_to_hover_over = driver.find_element(By.LINK_TEXT, "设置")
创建 ActionChains 对象 actions = ActionChains(driver)
执行鼠标悬停操作,并提交 actions.move_to_element(element_to_hover_over).perform()
time.sleep(2)
4. 弹框处理 (Alert, Confirm, Prompt)
切换到弹窗 alert = driver.switch_to.alert
获取弹窗的文本 alert_text = alert.text
print(f"弹窗内容:{alert_text}")
点击确认按钮
alert.dismiss() # 点击取消按钮 (如果存在)
alert.send_keys("输入内容") # 在 prompt 弹窗中输入
5. 下拉菜单 处理 <select> 标签的下拉菜单,有两种常见方式:
python
from selenium.webdriver.support.ui import Select
dropdown_element = driver.find_element(By.ID, "province_select")
select = Select(dropdown_element)
三种选择方式: select.select_by_index(0) # 按选项的索引选择
select.select_by_value("beijing") # 按选项的 value 属性值选择
select.select_by_visible_text("上海") # 按选项的可见文本选择
定位下拉框本身 dropdown = driver.find_element(By.ID, "province_select")
在下拉框内部,根据 value 或文本定位选项并点击 dropdown.find_element(By.XPATH, "//option[@value='10']").click()
6. 执行 JS 有些操作,比如滚动页面、修改页面元素属性,仅靠 Selenium API 难以完成,这时就可以借助 JavaScript!
1. 滚动到页面底部 js_scroll_bottom = "window.scrollTo(0, document.body.scrollHeight);"
driver.execute_script(js_scroll_bottom)
time.sleep(2)
2. 滚动到指定元素的位置
先找到元素 target_element = driver.find_element(By.ID, "footer")
js_scroll_to_element = f"arguments[0].scrollIntoView();"
arguments[0] 就是传进来的元素 driver.execute_script(js_scroll_to_element, target_element)
time.sleep(2)
3. 修改/删除元素属性 (例如,移除 input 的 readonly 属性) js_remove_readonly = 'var element = document.getElementById("my_input"); element.removeAttribute("readonly");'
driver.execute_script(js_remove_readonly)
driver.find_element(By.ID, "my_input").send_keys("我可以输入了!")
4. 通过 JS 设置元素的值 js_set_value = 'var element = document.getElementById("my_input"); element.value = "2023-10-26";'
driver.execute_script(js_set_value)
上传文件 文件上传是 Web 测试中的一个常见难题。Selenium 提供了两种方案:
方案一:使用 send_keys() (最简单,但有局限) 如果上传按钮是 <input type="file"> 这样的原生 HTML 元素,直接使用 send_keys() 传递文件的绝对路径即可。
启动浏览器并打开有文件上传功能的页面
替换成实际的上传页面
定位到文件上传按钮 upload_button = driver.find_element(By.ID, "file-upload-button")
替换成实际 ID
文件的绝对路径 (确保路径正确!) file_path = "/Users/your_username/Documents/test_file.txt"
替换成你的文件路径
将文件路径发送给上传按钮 upload_button.send_keys(file_path)
可能还需要点击上传确认按钮 driver.find_element(By.ID, "upload-confirm-button").click()
局限: 这种方法不适用于由操作系统弹出文件选择对话框的情况。
方案二:使用 AutoIt 工具 (万能解决方案,但稍复杂) 当 send_keys() 无效时,就需要借助 AutoIt 这样的第三方工具来模拟用户与操作系统弹窗的交互。
安装 AutoIt: 从 AutoIt 官网下载安装。安装包裡包含了 AutoIt Window Info 工具。
编写 AutoIt 脚本 (.au3 文件):
用 AutoIt 编写脚本,模拟按下 Ctrl+V 粘贴文件路径,然后模拟按下 Enter 键(或使用 ControlClick 精确点击'打开'按钮)。
使用 AutoIt 的编译器将脚本编译成 .exe 文件。
在 Selenium 脚本中调用 AutoIt:
先在 Selenium 中点击上传按钮,触发文件选择对话框。
等待对话框出现后,使用 os.system() 或 subprocess 调用你编译好的 AutoIt .exe 文件。
AutoIt Window Info 工具的妙用:
当你写 AutoIt 脚本时,需要知道目标窗口的标题、类名、控件 ID。AutoIt Window Info 工具就能帮你'侦测'到这些信息!
运行 AutoIt Window Info。
点击工具栏上的'十字准星',然后将鼠标移到你想要识别的对话框(如文件选择框)上,点击它。
工具会显示窗口的标题 (Title)、类名 (Class)。
切换到'Control'标签页,将鼠标移到对话框里的按钮(如'打开')上,就能看到该按钮的类名 (ClassNN) 和 控件 ID (Control ID)。
AutoIt 脚本示例 (uploadFile.au3):
autoit
; 定义文件路径变量
Local $sFilePath = "C:\path\to\your\file.txt"
; 模拟按下 Ctrl+V 粘贴文件路径
Send("^v")
Sleep(1000)
; 模拟点击'打开'按钮 (通常是 Enter 键)
Send("{ENTER}")
; 如果 Enter 键不行,需要用 ControlClick 精确点击
; ControlClick("窗口标题", "", "控件的 ClassNN")
; 例如:ControlClick("打开", "", "[CLASSNN:Button1]")
python
import os
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
upload_button = driver.find_element(By.ID, "file-upload-button")
upload_button.click()
触发文件选择对话框
等待对话框出现
调用 AutoIt 编译好的 .exe 文件 (替换成你的路径) os.system(r"C:\path\to\your\uploadFile.exe")
... 继续其他操作 ...
AutoIt 脚本的精确性很重要,窗口标题、控件 ID 都要准确。
ControlClick 是更精确的选择,但需要先用 AutoIt Window Info 获取信息。
AutoIt 主要是 Windows 平台解决方案,跨平台性不如 send_keys。
结语 恭喜你!读完这篇实战指南,你已经掌握了 Selenium 的核心技能,从基础操作到复杂的页面交互,再到文件上传,你已经可以告别手工测试的时代了!
勤动手: 理论再好,不如实操!多写代码,多尝试。
勤查阅: 遇到问题,别怕查文档!
善利用: 利用开发者工具、在线正则测试网站(如 Regex101.com)来辅助你。
掌握了 Selenium,你将拥有无限的可能,无论是提高工作效率,还是深入理解 Web 应用的底层逻辑,都会让你在技术道路上更进一步!
相关免费在线工具 curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online