Selenium3.0 平台级自动化测试框架综合实战(完结)

一、项目背景与目标

  1. 背景

    • 针对企业级Web应用(如电商、OA系统、SaaS平台等)的自动化测试需求,构建一个可扩展、可维护的测试框架。
    • 解决传统测试中脚本复用性低、维护成本高、测试报告不直观等问题。
  2. 目标

    • 核心功能:实现跨浏览器(Chrome、Firefox、Edge)的自动化测试,支持登录、表单提交、数据验证等常见场景。
    • 扩展能力:支持数据驱动测试(DDT)、分布式测试、持续集成(CI/CD)。
    • 报告输出:生成美观的HTML测试报告,包含截图、日志、失败重试等功能。

(Selenium 3.0 平台级自动化测试框架综合实战(完结))---"夏のke"---weiranit---.---fun/3564/

二、技术选型与架构设计

  1. 技术栈

    • Selenium 3.0:核心自动化测试工具,兼容主流浏览器。
    • Pytest:测试框架,支持参数化、插件扩展、测试用例分组。
    • Allure:测试报告工具,生成可视化HTML报告。
    • Page Object Model (POM) :设计模式,解耦页面元素与测试逻辑。
    • Logging + 日志管理:记录测试执行过程,便于问题定位。
  2. 架构设计

    csharp 复制代码
    plaintext
    	├── base/                # 基础模块(浏览器驱动、元素操作封装)
    
    	├── pages/               # 页面对象层(POM模式)
    
    	├── testcases/            # 测试用例层
    
    	├── data/                # 测试数据(Excel/CSV/JSON)
    
    	├── utils/               # 工具类(截图、日志、数据读取)
    
    	├── reports/              # 测试报告(Allure输出)
    
    	└── conftest.py           # Pytest全局配置

三、核心功能实现

1. 浏览器驱动封装
  • 目标:统一管理浏览器启动、关闭、窗口大小等操作。

  • 代码示例

    python 复制代码
    python
    	from selenium import webdriver
    
    	 
    
    	class BaseDriver:
    
    	    def __init__(self, browser_name="chrome"):
    
    	        if browser_name.lower() == "chrome":
    
    	            self.driver = webdriver.Chrome()
    
    	        elif browser_name.lower() == "firefox":
    
    	            self.driver = webdriver.Firefox()
    
    	        else:
    
    	            raise ValueError("Unsupported browser")
    
    	        self.driver.maximize_window()
    
    	 
    
    	    def get_driver(self):
    
    	        return self.driver
    
    	 
    
    	    def quit_driver(self):
    
    	        self.driver.quit()
2. 页面对象模型(POM)
  • 目标:将页面元素与测试逻辑分离,提高可维护性。

  • 代码示例

    python 复制代码
    python
    	from selenium.webdriver.common.by import By
    
    	from base.base_driver import BaseDriver
    
    	 
    
    	class LoginPage:
    
    	    def __init__(self, driver):
    
    	        self.driver = driver
    
    	        self.username_input = (By.ID, "username")
    
    	        self.password_input = (By.ID, "password")
    
    	        self.login_button = (By.ID, "login-btn")
    
    	 
    
    	    def login(self, username, password):
    
    	        self.driver.find_element(*self.username_input).send_keys(username)
    
    	        self.driver.find_element(*self.password_input).send_keys(password)
    
    	        self.driver.find_element(*self.login_button).click()
3. 测试用例层
  • 目标:编写可复用的测试用例,支持参数化与断言。

  • 代码示例

    python 复制代码
    python
    	import pytest
    
    	import allure
    
    	from base.base_driver import BaseDriver
    
    	from pages.login_page import LoginPage
    
    	 
    
    	@allure.feature("登录功能")
    
    	class TestLogin:
    
    	    @pytest.fixture(scope="class")
    
    	    def setup_class(self):
    
    	        self.driver = BaseDriver("chrome").get_driver()
    
    	        self.login_page = LoginPage(self.driver)
    
    	        self.driver.get("https://example.com/login")
    
    	        yield
    
    	        self.driver.quit()
    
    	 
    
    	    @allure.story("用户登录成功")
    
    	    def test_login_success(self, setup_class):
    
    	        self.login_page.login("testuser", "password123")
    
    	        assert "欢迎" in self.driver.page_source
4. 数据驱动测试(DDT)
  • 目标:从外部文件读取测试数据,减少代码冗余。

  • 代码示例 (使用pytest.mark.parametrize):

    python 复制代码
    python
    	import pytest
    
    	from pages.login_page import LoginPage
    
    	from base.base_driver import BaseDriver
    
    	 
    
    	@pytest.mark.parametrize("username, password, expected", [
    
    	    ("testuser1", "password123", "欢迎"),
    
    	    ("testuser2", "wrongpassword", "登录失败"),
    
    	])
    
    	def test_login_with_params(username, password, expected):
    
    	    driver = BaseDriver("chrome").get_driver()
    
    	    login_page = LoginPage(driver)
    
    	    driver.get("https://example.com/login")
    
    	    login_page.login(username, password)
    
    	    assert expected in driver.page_source
    
    	    driver.quit()

四、高级功能扩展

  1. 失败重试机制

    • 使用pytest-rerunfailures插件,自动重试失败的测试用例。

    • 安装:pip install pytest-rerunfailures

    • 配置:

      css 复制代码
      bash
      	pytest --reruns 3 --reruns-delay 2
  2. 分布式测试

    • 结合Selenium Grid,实现多浏览器并行测试。

    • 架构:

      scss 复制代码
      plaintext
      	Hub (控制节点) <-> Node1 (Chrome) <-> Node2 (Firefox)
  3. 持续集成(CI/CD)

    • 集成Jenkins:

      • 配置Jenkins任务,拉取代码后执行pytest命令。
      • 生成Allure报告并发布到服务器。

五、测试报告优化

  1. Allure报告增强

    • 添加步骤描述:with allure.step("步骤名称")

    • 嵌入截图:

      arduino 复制代码
      python
      	import allure
      
      	driver.save_screenshot("screenshot.png")
      
      	allure.attach.file("screenshot.png", name="失败截图", attachment_type=allure.attachment_type.PNG)
  2. 历史趋势分析

    • 对比多次测试结果,分析通过率、失败原因。

六、项目总结

  1. 成果

    • 构建了一个可扩展的自动化测试框架,支持跨浏览器、数据驱动、分布式测试。
    • 生成直观的Allure报告,提升测试效率与质量。
  2. 优化方向

    • 引入AI图像识别(如OpenCV),处理动态元素定位问题。
    • 集成性能测试工具(如JMeter),实现功能与性能一体化测试。

二、技术选型与架构设计

  1. 技术栈

    • Selenium 3.0:核心自动化测试工具,兼容主流浏览器。
    • Pytest:测试框架,支持参数化、插件扩展、测试用例分组。
    • Allure:测试报告工具,生成可视化HTML报告。
    • Page Object Model (POM) :设计模式,解耦页面元素与测试逻辑。
    • Logging + 日志管理:记录测试执行过程,便于问题定位。
  2. 架构设计

    csharp 复制代码
    plaintext
    	├── base/                # 基础模块(浏览器驱动、元素操作封装)
    
    	├── pages/               # 页面对象层(POM模式)
    
    	├── testcases/            # 测试用例层
    
    	├── data/                # 测试数据(Excel/CSV/JSON)
    
    	├── utils/               # 工具类(截图、日志、数据读取)
    
    	├── reports/              # 测试报告(Allure输出)
    
    	└── conftest.py           # Pytest全局配置

三、核心功能实现

1. 浏览器驱动封装
  • 目标:统一管理浏览器启动、关闭、窗口大小等操作。

  • 代码示例

    python 复制代码
    python
    	from selenium import webdriver
    
    	 
    
    	class BaseDriver:
    
    	    def __init__(self, browser_name="chrome"):
    
    	        if browser_name.lower() == "chrome":
    
    	            self.driver = webdriver.Chrome()
    
    	        elif browser_name.lower() == "firefox":
    
    	            self.driver = webdriver.Firefox()
    
    	        else:
    
    	            raise ValueError("Unsupported browser")
    
    	        self.driver.maximize_window()
    
    	 
    
    	    def get_driver(self):
    
    	        return self.driver
    
    	 
    
    	    def quit_driver(self):
    
    	        self.driver.quit()
2. 页面对象模型(POM)
  • 目标:将页面元素与测试逻辑分离,提高可维护性。

  • 代码示例

    python 复制代码
    python
    	from selenium.webdriver.common.by import By
    
    	from base.base_driver import BaseDriver
    
    	 
    
    	class LoginPage:
    
    	    def __init__(self, driver):
    
    	        self.driver = driver
    
    	        self.username_input = (By.ID, "username")
    
    	        self.password_input = (By.ID, "password")
    
    	        self.login_button = (By.ID, "login-btn")
    
    	 
    
    	    def login(self, username, password):
    
    	        self.driver.find_element(*self.username_input).send_keys(username)
    
    	        self.driver.find_element(*self.password_input).send_keys(password)
    
    	        self.driver.find_element(*self.login_button).click()
3. 测试用例层
  • 目标:编写可复用的测试用例,支持参数化与断言。

  • 代码示例

    python 复制代码
    python
    	import pytest
    
    	import allure
    
    	from base.base_driver import BaseDriver
    
    	from pages.login_page import LoginPage
    
    	 
    
    	@allure.feature("登录功能")
    
    	class TestLogin:
    
    	    @pytest.fixture(scope="class")
    
    	    def setup_class(self):
    
    	        self.driver = BaseDriver("chrome").get_driver()
    
    	        self.login_page = LoginPage(self.driver)
    
    	        self.driver.get("https://example.com/login")
    
    	        yield
    
    	        self.driver.quit()
    
    	 
    
    	    @allure.story("用户登录成功")
    
    	    def test_login_success(self, setup_class):
    
    	        self.login_page.login("testuser", "password123")
    
    	        assert "欢迎" in self.driver.page_source
4. 数据驱动测试(DDT)
  • 目标:从外部文件读取测试数据,减少代码冗余。

  • 代码示例 (使用pytest.mark.parametrize):

    python 复制代码
    python
    	import pytest
    
    	from pages.login_page import LoginPage
    
    	from base.base_driver import BaseDriver
    
    	 
    
    	@pytest.mark.parametrize("username, password, expected", [
    
    	    ("testuser1", "password123", "欢迎"),
    
    	    ("testuser2", "wrongpassword", "登录失败"),
    
    	])
    
    	def test_login_with_params(username, password, expected):
    
    	    driver = BaseDriver("chrome").get_driver()
    
    	    login_page = LoginPage(driver)
    
    	    driver.get("https://example.com/login")
    
    	    login_page.login(username, password)
    
    	    assert expected in driver.page_source
    
    	    driver.quit()

四、高级功能扩展

  1. 失败重试机制

    • 使用pytest-rerunfailures插件,自动重试失败的测试用例。

    • 安装:pip install pytest-rerunfailures

    • 配置:

      css 复制代码
      bash
      	pytest --reruns 3 --reruns-delay 2
  2. 分布式测试

    • 结合Selenium Grid,实现多浏览器并行测试。

    • 架构:

      scss 复制代码
      plaintext
      	Hub (控制节点) <-> Node1 (Chrome) <-> Node2 (Firefox)
  3. 持续集成(CI/CD)

    • 集成Jenkins:

      • 配置Jenkins任务,拉取代码后执行pytest命令。
      • 生成Allure报告并发布到服务器。

五、测试报告优化

  1. Allure报告增强

    • 添加步骤描述:with allure.step("步骤名称")

    • 嵌入截图:

      arduino 复制代码
      python
      	import allure
      
      	driver.save_screenshot("screenshot.png")
      
      	allure.attach.file("screenshot.png", name="失败截图", attachment_type=allure.attachment_type.PNG)
  2. 历史趋势分析

    • 对比多次测试结果,分析通过率、失败原因。

六、项目总结

  1. 成果

    • 构建了一个可扩展的自动化测试框架,支持跨浏览器、数据驱动、分布式测试。
    • 生成直观的Allure报告,提升测试效率与质量。
  2. 优化方向

    • 引入AI图像识别(如OpenCV),处理动态元素定位问题。
    • 集成性能测试工具(如JMeter),实现功能与性能一体化测试。
相关推荐
程序员二黑11 小时前
接口测试全流程实战:从工具到架构的深度解析
单元测试·测试·ab测试
霍格沃兹_测试12 小时前
Playwright MCP入门指南:从零开始构建自动化测试
测试
阿巴~阿巴~2 天前
测试用例设计万能公式:功能到安全
软件测试·测试
zhuyasen3 天前
单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰
后端·性能优化·测试
穷人小水滴6 天前
**静音** 键盘简单评测
测试·午夜话题·笔记测评
程序员二黑12 天前
告别硬编码!5个让Web自动化脚本更稳定的定位策略
面试·单元测试·测试
猫耳君12 天前
汽车网络安全 CyberSecurity ISO/SAE 21434 测试之四
安全·web安全·网络安全·汽车·测试·security·cybersecurity
WebInfra13 天前
📱开源 AI 工具驱动 iOS 自动化 、接入全新 Qwen 模型 - Midscene v0.29 发布
前端·ios·测试
Apifox13 天前
Apifox 9 月更新| AI 生成接口测试用例、在线文档调试能力全面升级、内置更多 HTTP 状态码、支持将目录转换为模块
前端·后端·测试
大话性能15 天前
python处理数据的风骚操作[pandas 之 groupby&agg]
测试