1. 从嵌入式到测试:Python+Selenium 自动化测试转型实战
作为一名从嵌入式开发转型测试的工程师,我深刻理解手工测试的痛点。每天重复执行相同的测试用例,不仅效率低下,还容易因疲劳导致漏测。Python+Selenium 这套组合拳彻底改变了我的测试工作方式,让我从"点点点"的重复劳动中解放出来。
1.1 为什么选择 Python+Selenium?
对于嵌入式背景的工程师来说,Python 的语法简洁易上手,Selenium 则提供了强大的浏览器自动化能力。这套组合特别适合以下场景:
- 需要频繁回归测试的 Web 应用
- 多浏览器兼容性测试
- 复杂业务流程的端到端测试
- 需要生成详细测试报告的项目
提示:Selenium 支持所有主流浏览器,包括 Chrome、Firefox、Edge 等,测试脚本可以跨浏览器运行。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境搭建与避坑指南
2.1 Python 环境配置
推荐使用 Python 3.8-3.10 版本,这些版本与 Selenium 4.x 兼容性最好。安装时务必勾选"Add Python to PATH"选项,否则后续会遇到各种路径问题。
验证 Python 安装成功:
bash复制python --version
pip --version
2.2 Selenium 安装与版本管理
使用 pip 安装指定版本的 Selenium:
bash复制pip install selenium==4.39.0
建议固定 Selenium 版本,避免自动升级导致兼容性问题。可以通过以下命令查看已安装版本:
bash复制pip show selenium
2.3 浏览器驱动配置
浏览器驱动是 Selenium 控制浏览器的关键组件。以 Chrome 为例:
- 查看 Chrome 浏览器版本:在地址栏输入
chrome://settings/help - 下载对应版本的 ChromeDriver:ChromeDriver 官网
- 将驱动文件放在固定目录(如
/usr/local/bin或C:\drivers)
验证驱动配置:
python复制from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.quit()
常见问题:如果遇到"chromedriver cannot be opened"错误,可能是权限问题,执行
chmod +x chromedriver赋予可执行权限。
3. 核心元素定位策略
3.1 八种定位方法详解
Selenium 提供了多种元素定位方式,按优先级排序如下:
- ID 定位:最可靠的方式,元素有唯一 ID 时首选
python复制element = driver.find_element(By.ID, "username")
- Name 定位:适用于表单元素
python复制element = driver.find_element(By.NAME, "password")
- XPath 定位:万能定位方式,适合复杂场景
python复制# 绝对路径(不推荐)
element = driver.find_element(By.XPATH, "/html/body/div[1]/form/input")
# 相对路径+属性
element = driver.find_element(By.XPATH, "//input[@id='search']")
# 文本匹配
element = driver.find_element(By.XPATH, "//button[text()='登录']")
- CSS 选择器:性能优于 XPath,语法简洁
python复制element = driver.find_element(By.CSS_SELECTOR, "#submit.btn-primary")
- Class 名称:注意类名可能有空格
python复制element = driver.find_element(By.CLASS_NAME, "form-control")
- 标签名:适合批量操作同类元素
python复制inputs = driver.find_elements(By.TAG_NAME, "input")
- 链接文本:精确匹配链接文字
python复制element = driver.find_element(By.LINK_TEXT, "忘记密码?")
- 部分链接文本:模糊匹配长链接
python复制element = driver.find_element(By.PARTIAL_LINK_TEXT, "忘记")
3.2 定位策略最佳实践
- 优先使用 ID 和 Name:最稳定可靠
- 动态元素使用 XPath/CSS:应对没有固定属性的元素
- 避免绝对路径:页面结构调整容易导致失效
- 添加等待机制:防止元素未加载完成时报错
- 封装定位方法:提高代码复用性和可维护性
4. 自动化测试实战场景
4.1 登录功能测试
python复制def test_login():
driver.get("https://example.com/login")
# 输入用户名密码
driver.find_element(By.ID, "username").send_keys("testuser")
driver.find_element(By.ID, "password").send_keys("password123")
# 勾选记住我
remember_me = driver.find_element(By.ID, "remember")
if not remember_me.is_selected():
remember_me.click()
# 点击登录按钮
driver.find_element(By.XPATH, "//button[text()='登录']").click()
# 验证登录成功
welcome = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "welcome"))
)
assert "欢迎" in welcome.text
4.2 表单提交测试
python复制def test_form_submission():
driver.get("https://example.com/register")
# 填写表单
driver.find_element(By.NAME, "name").send_keys("张三")
driver.find_element(By.NAME, "email").send_keys("zhangsan@example.com")
# 选择下拉框
from selenium.webdriver.support.select import Select
country = Select(driver.find_element(By.ID, "country"))
country.select_by_visible_text("中国")
# 提交表单
driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
# 验证提交成功
success = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CLASS_NAME, "alert-success"))
)
assert "注册成功" in success.text
4.3 文件上传处理
python复制def test_file_upload():
driver.get("https://example.com/upload")
# 文件上传元素
file_input = driver.find_element(By.XPATH, "//input[@type='file']")
# 上传文件(使用绝对路径)
file_path = os.path.abspath("testdata/sample.jpg")
file_input.send_keys(file_path)
# 提交
driver.find_element(By.ID, "upload-btn").click()
# 验证
uploaded = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "uploaded-files"))
)
assert "sample.jpg" in uploaded.text
5. 高级技巧与最佳实践
5.1 等待机制详解
- 隐式等待:全局设置,查找元素时自动等待
python复制driver.implicitly_wait(10) # 单位:秒
- 显式等待:针对特定条件等待
python复制from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "dynamic-element"))
)
- 常用等待条件:
presence_of_element_located:元素出现在DOM中visibility_of_element_located:元素可见element_to_be_clickable:元素可点击text_to_be_present_in_element:元素包含特定文本
5.2 测试框架集成
将 Selenium 与 unittest 或 pytest 结合,构建完整的测试框架:
python复制import unittest
from selenium import webdriver
class TestLogin(unittest.TestCase):
@classmethod
def setUpClass(cls):
