Selenium 实战项目(千字长文)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 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 进阶学习建议

  1. 分布式测试:使用 Selenium Grid 实现跨浏览器/跨平台测试
  2. 持续集成:与 Jenkins、GitHub Actions 等 CI/CD 工具集成
  3. 页面对象模式(POM):将元素定位与操作逻辑分离,提升代码可维护性
  4. 无头浏览器:在服务器环境中使用无界面浏览器运行测试

4.3 常见问题解决方案

  • 元素定位失效:检查动态内容,使用 XPath 或 CSS 伪选择器
  • 浏览器兼容性问题:更新驱动程序到最新版本
  • 脚本执行速度慢:优化等待策略,减少不必要的等待时间

五、结束语

Selenium 实战项目不仅是技术能力的演练场,更是系统性思维的培养过程。从基础的元素定位到复杂的框架设计,每个环节都蕴含着工程化开发的智慧。建议读者从简单案例起步,逐步挑战更复杂的自动化场景。记住:自动化测试的本质不是替代人工,而是帮助开发者更高效地聚焦核心业务逻辑,让代码成为你最可靠的测试伙伴。

最新发布