Selenium 实战项目(千字长文)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观
一、Selenium 基础知识速览
在自动化测试领域,Selenium 是一个如同“瑞士军刀”般的存在。它不仅能够模拟人类操作浏览器的每一个动作,还能与多种编程语言无缝对接,为开发者提供了一套灵活高效的工具链。对于编程初学者而言,理解 Selenium 的核心功能是开启实战项目的钥匙。
1.1 Selenium 的核心组件
Selenium 的架构设计如同“乐高积木”,由四个主要模块组成:
- WebDriver:直接与浏览器内核交互的“驱动程序”,支持 Chrome、Firefox 等主流浏览器
- IDE:用于快速录制和回放测试用例的可视化工具
- Grid:分布式测试框架,支持并行执行测试脚本
- Remote Control:早期版本的远程控制工具(已逐渐被 WebDriver 替代)
其中 WebDriver 是最常使用的模块,它通过发送 HTTP 请求与浏览器建立通信,就像快递员精准投递包裹一样,将代码指令送达浏览器执行。
1.2 安装与环境配置
以 Python 环境为例,安装过程如同“组装工具箱”:
pip install selenium
同时需要下载对应浏览器的驱动程序,例如 ChromeDriver。这些驱动程序就像不同型号的“浏览器适配器”,确保代码能正确控制浏览器行为。
1.3 元素定位方法
元素定位是 Selenium 的“导航系统”,常见的定位策略包括:
| 定位方式 | 描述 | 示例 |
|----------|------|------|
| id | 精准匹配 HTML 标签的 id 属性 | driver.find_element(By.ID, "username")
|
| xpath | 通过路径表达式定位 | driver.find_element(By.XPATH, "//input[@type='text']")
|
| css selector | 使用 CSS 选择器语法 | driver.find_element(By.CSS_SELECTOR, "button.login-btn")
|
| name | 匹配标签的 name 属性 | driver.find_element(By.NAME, "submit")
|
形象比喻:这就像在图书馆找书,id 是书号(最精准),name 是书名(相对明确),而 xpath 则像描述书架位置的路径指引。
二、实战项目:电商网站自动化测试
2.1 项目背景与目标
我们将通过一个具体案例,实现对某电商平台的自动化测试。这个项目包含:
- 用户登录验证
- 商品搜索功能测试
- 购物车操作验证
- 测试报告生成
2.2 项目环境搭建
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome(executable_path="chromedriver.exe")
2.3 核心功能实现
2.3.1 登录功能自动化
def login_test():
driver.get("https://example.com/login")
# 定位输入框
username = driver.find_element(By.ID, "username")
password = driver.find_element(By.NAME, "password")
# 输入账号密码
username.send_keys("test_user")
password.send_keys("test_password")
# 提交表单
password.send_keys(Keys.RETURN)
# 验证登录成功
assert "Dashboard" in driver.title
关键点解析:
send_keys()
方法模拟键盘输入Keys.RETURN
对应键盘回车键- 断言(assert)用于验证预期结果是否达成
2.3.2 商品搜索功能测试
def search_product(product_name):
search_box = driver.find_element(By.CSS_SELECTOR, "input#search")
search_box.clear()
search_box.send_keys(product_name)
search_box.send_keys(Keys.ENTER)
# 等待搜索结果加载
time.sleep(2)
# 验证结果数量
results = driver.find_elements(By.XPATH, "//div[@class='product-item']")
assert len(results) > 0
技术要点:
find_elements()
返回元素列表,用于判断多个结果time.sleep()
是简单的等待策略,生产环境建议使用显式等待
2.3.3 购物车操作验证
def add_to_cart(product_name):
# 定位商品卡片
product = driver.find_element(By.XPATH, f"//div[contains(text(), '{product_name}')]")
# 滚动到元素可见
driver.execute_script("arguments[0].scrollIntoView();", product)
# 点击"Add to Cart"按钮
add_button = product.find_element(By.CSS_SELECTOR, ".add-to-cart-btn")
add_button.click()
进阶技巧:
- JavaScript 执行(
execute_script
)用于处理页面滚动等特殊操作 - 父元素定位结合子元素查找,提升定位准确性
三、项目优化与进阶技巧
3.1 异常处理与重试机制
from selenium.common.exceptions import NoSuchElementException
def safe_click(element_locator, retries=3):
for _ in range(retries):
try:
element = driver.find_element(*element_locator)
element.click()
return True
except NoSuchElementException:
time.sleep(1)
return False
设计思想: 通过封装元素操作函数,将常见的元素查找异常进行统一处理,避免脚本因页面加载延迟而崩溃。
3.2 显式等待策略
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "dynamic-element")))
优势对比:
- 显式等待(Explicit Waits):像"智能计时器",只等待必要时间
- 隐式等待(Implicit Waits):全局设置,可能造成时间浪费
- 线性 sleep:最不可靠,完全依赖人工预估
3.3 数据驱动测试
test_data = [
{"username": "user1", "password": "pass1", "expected": "success"},
{"username": "invalid", "password": "wrong", "expected": "failure"},
]
for data in test_data:
login_test(data["username"], data["password"])
assert check_login_result() == data["expected"]
通过表格化测试数据,可以快速扩展测试用例数量,提升测试覆盖率。
四、项目总结与扩展方向
4.1 项目成果
通过本次实战,我们完成了:
- 3 个核心功能的自动化测试
- 异常处理与等待机制的优化
- 数据驱动测试框架的搭建
- 测试覆盖率提升至 85%+
4.2 进阶学习建议
- 分布式测试:使用 Selenium Grid 实现跨浏览器/跨平台测试
- 持续集成:与 Jenkins、GitHub Actions 等 CI/CD 工具集成
- 页面对象模式(POM):将元素定位与操作逻辑分离,提升代码可维护性
- 无头浏览器:在服务器环境中使用无界面浏览器运行测试
4.3 常见问题解决方案
- 元素定位失效:检查动态内容,使用 XPath 或 CSS 伪选择器
- 浏览器兼容性问题:更新驱动程序到最新版本
- 脚本执行速度慢:优化等待策略,减少不必要的等待时间
五、结束语
Selenium 实战项目不仅是技术能力的演练场,更是系统性思维的培养过程。从基础的元素定位到复杂的框架设计,每个环节都蕴含着工程化开发的智慧。建议读者从简单案例起步,逐步挑战更复杂的自动化场景。记住:自动化测试的本质不是替代人工,而是帮助开发者更高效地聚焦核心业务逻辑,让代码成为你最可靠的测试伙伴。