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),实现功能与性能一体化测试。
相关推荐
用户7858298243069 小时前
Selenium3+Pytest+Allure 落地 Python Web 自动化测试
测试
felix199113 小时前
pytest-dsl: 用自然语言编写自动化测试,让测试代码不再难懂
测试
越学不动啦3 天前
十、自动化函数+实战
运维·软件测试·自动化·测试
Hy小杨3 天前
压测JMeter经验分享文档-Concurrency Thread Group
测试
waves浪游4 天前
自动化测试常用函数
测试用例·bug·测试
邹老师的小课堂4 天前
Windows环境下,Jenkins+Gitee的CICD
windows·gitee·jenkins·测试·cicd
Z_z在努力4 天前
【软件测试】bug 篇
bug·测试
越学不动啦4 天前
八、自动化函数
运维·软件测试·自动化·dubbo·测试
大话性能5 天前
等价类划分与组合测试:提升测试效率与覆盖率的关键
测试