跳到主要内容Selenium Web 自动化测试框架入门与实战 | 极客日志Python
Selenium Web 自动化测试框架入门与实战
简介 Web 自动化测试是提升软件质量与效率的关键手段。Selenium 作为业界广泛使用的开源自动化测试框架,能够模拟用户在浏览器中的操作,实现 Web 应用的自动化测试。将介绍 Selenium 的核心概念、环境搭建、基础操作及实战技巧。 Selenium 简介 Selenium 是一个强大的开源自动化测试框架,主要用于模拟人类在网页上的操作,如点击按钮、输入文字、提交表单等。它支持多种编…
灰度发布46K 浏览 简介
Web 自动化测试是提升软件质量与效率的关键手段。Selenium 作为业界广泛使用的开源自动化测试框架,能够模拟用户在浏览器中的操作,实现 Web 应用的自动化测试。本文将介绍 Selenium 的核心概念、环境搭建、基础操作及实战技巧。
Selenium 简介
Selenium 是一个强大的开源自动化测试框架,主要用于模拟人类在网页上的操作,如点击按钮、输入文字、提交表单等。它支持多种编程语言(Python、Java、C# 等),并能在各种主流浏览器(Chrome、Firefox、Edge 等)上运行。
主要功能:
性能测试: 测量网页加载时间和响应速度。页面截图: 自动截取网页状态,用于测试报告或问题排查。Selenium 与 Appium 的区别
Selenium 和 Appium 都是自动化测试工具,但侧重点不同。
| 特性 | Selenium | Appium |
|---|
| 应用领域 | Web 应用(浏览器网页) | 移动 App(手机应用) |
| 底层技术 | 浏览器驱动(如 Chrome Driver) | 移动原生 API(iOS: XCUITest, Android: UiAutomator) |
| 环境配置 | 需安装浏览器驱动 | 需模拟器/真机,配置 SDK |
| 通信协议 | HTTP 协议 | WebDriver 协议 |
总结: Selenium 用于浏览器自动化,Appium 用于移动应用自动化。
工作原理
- 脚本启动: 自动化测试脚本(Selenium Client)启动 WebDriver 服务。
- 驱动启动: WebDriver 启动对应的浏览器驱动程序(如 Chrome Driver)。
- 建立连接: 浏览器驱动程序打开浏览器,监听特定端口。
- 指令传输: Selenium 操作通过 WebDriver 以 HTTP 请求发送到浏览器驱动。
- 执行动作: 浏览器驱动解析指令并指挥浏览器执行(如点击按钮)。
- 结果反馈: 执行结果通过驱动反馈给测试脚本。
流程:脚本 -> WebDriver -> 浏览器驱动 -> 浏览器 -> 执行 -> 反馈。
自动化测试实战流程
以登录功能为例,手动测试步骤包括打开浏览器、输入网址、输入账号密码、点击登录、验证跳转。自动化测试将其转化为代码:
- 调用 WebDriver API 启动浏览器。
- 使用
get() 方法访问目标网址。
- 使用定位方式找到用户名输入框。
- 使用
send_keys() 输入用户名。
- 重复上述步骤输入密码。
- 找到登录按钮执行
click() 操作。
- 使用断言验证页面是否符合预期。
环境搭建
- Python 环境: 安装 Python 3。
- 浏览器驱动: 下载与浏览器版本匹配的 WebDriver。
- 驱动路径: 可放在浏览器安装目录、Python 安装目录,或在代码中通过
executable_path 指定。
- 安装库: 在终端运行
pip install selenium。
基础操作
1. 浏览器操作
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
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.example.com")
driver.back()
time.sleep(2)
driver.forward()
driver.refresh()
driver.close()
driver.quit()
2. 元素定位
| 定位方式 | 描述 | 示例 |
|---|
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 | 根据链接完整文本 | driver.find_element(By.LINK_TEXT, "点击这里") |
By.PARTIAL_LINK_TEXT | 根据链接部分文本 | driver.find_element(By.PARTIAL_LINK_TEXT, "这里") |
By.TAG_NAME | 根据标签名 | driver.find_element(By.TAG_NAME, "div") |
By.XPATH | XML 路径语言 | driver.find_element(By.XPATH, "//div[@class='hotwords']/a[1]") |
By.CSS_SELECTOR | CSS 选择器 | driver.find_element(By.CSS_SELECTOR, "div.hotwords > a:first-child") |
注意: find_element() 返回第一个匹配元素,find_elements() 返回所有匹配元素的列表。
3. 元素操作
| 方法 | 作用 | 示例 |
|---|
click() | 点击 | element.click() |
send_keys("文本") | 输入文本 | element.send_keys("你好") |
clear() | 清空内容 | element.clear() |
.text | 获取可见文本 | print(element.text) |
get_attribute("属性名") | 获取属性值 | print(element.get_attribute("href")) |
get_screenshot_as_file("路径.png") | 保存截图 | driver.get_screenshot_as_file("screenshot.png") |
4. 等待机制
- 隐式等待 (
implicitly_wait): 设置全局等待上限。
driver.implicitly_wait(10)
- 强制等待 (
time.sleep): 暂停脚本执行指定时间。
import time
time.sleep(3)
- 显式等待 (
WebDriverWait): 推荐方式,等待特定条件满足。
wait = WebDriverWait(driver, 10, 0.5)
element = wait.until(EC.presence_of_element_located((By.ID, "my_element_id")))
浏览器启动参数
| 参数 | 作用 |
|---|
--user-agent | 设置 User-Agent |
--window-size | 设置窗口大小 |
--headless | 无界面运行 |
--start-maximized | 最大化启动 |
--incognito | 隐身模式 |
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--start-maximized')
driver = webdriver.Chrome(options=chrome_options)
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 定位
- 绝对路径: 从根节点开始,结构变动易失效。
- 相对路径: 从当前节点开始,更灵活。
- 标签 + 属性:
//div[@class='hotwords']
- 模糊匹配:
contains(@id, 'xxxx')
- 同级元素:
preceding-sibling::
driver.find_element(By.XPATH, "//input[@id='word']").send_keys("你好,XPath!")
CSS 定位
CSS 选择器语法简洁,执行速度通常快于 XPath。
- 标签 + 属性:
img[alt="img1"]
- 标签 + ID:
div#my_div_id
- 层级关系:
> (直接子元素), 空格 (后代元素)
- 属性匹配:
a[href^="http://"] (开头), a[href$=".com"] (结尾)
driver.find_element(By.CSS_SELECTOR, "div.hotwords > a:first-child").click()
页面操作
1. 切换框架 (Frame)
driver.switch_to.frame("iframe_id")
driver.find_element(By.ID, "username_in_frame").send_keys("框架里的用户名")
driver.switch_to.default_content()
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.switch_to.window(original_window)
3. 鼠标悬停 (Hover)
from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
element = driver.find_element(By.LINK_TEXT, "设置")
actions.move_to_element(element).perform()
4. 弹框处理 (Alert)
alert = driver.switch_to.alert
print(alert.text)
alert.accept()
5. 下拉菜单
from selenium.webdriver.support.ui import Select
dropdown = driver.find_element(By.ID, "province_select")
select = Select(dropdown)
select.select_by_visible_text("上海")
6. 执行 JavaScript
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
driver.execute_script('var element = document.getElementById("my_input"); element.removeAttribute("readonly");')
文件上传
方案一:send_keys (原生 input)
适用于 <input type="file"> 元素。
upload_button = driver.find_element(By.ID, "file-upload-button")
upload_button.send_keys("/path/to/file.txt")
方案二:AutoIt (系统弹窗)
- 安装 AutoIt。
- 编写
.au3 脚本模拟按键。
- 编译为
.exe。
- 在 Selenium 中调用
.exe。
Send("^v")
Sleep(1000)
Send("{ENTER}")
import os
upload_button.click()
time.sleep(2)
os.system(r"C:\path\to\uploadFile.exe")
结语
掌握 Selenium 的核心技能,包括基础操作、页面交互及文件上传,将显著提升 Web 测试效率。建议多动手实践,查阅官方文档,利用开发者工具辅助定位。自动化测试是提升软件质量的重要工具,持续学习将带来更大的技术价值。
本文旨在提供技术参考,代码示例请根据实际环境调整。
微信扫一扫,关注极客日志
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具
- 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