pytest与Selenium结合使用指南

pytest

pytest 简介

pytest 是 Python 的测试框架,以简洁的语法和强大的功能著称。支持单元测试、功能测试和复杂集成测试,具有丰富的插件生态系统。

安装 pytest

通过 pip 安装:

复制代码
pip install pytest

验证安装:

复制代码
pytest --version

编写第一个测试

创建一个文件 test_sample.py,内容如下:

复制代码
def test_addition():
    assert 1 + 1 == 2

运行测试:

复制代码
pytest test_sample.py

测试发现规则

pytest 自动发现以下文件:

  • 文件名以 test_ 开头或 _test 结尾。
  • 测试函数以 test_ 开头。
  • 测试类以 Test 开头(方法名以 test_ 开头)。

断言用法

直接使用 Python 的 assert 语句:

复制代码
assert value == expected

pytest 提供详细的断言失败信息,例如列表或字典比较。

参数化测试

使用 @pytest.mark.parametrize 标记多组输入:

复制代码
import pytest

@pytest.mark.parametrize("a,b,expected", [(1, 2, 3), (0, 0, 0)])
def test_add(a, b, expected):
    assert a + b == expected

Fixture 功能

Fixture 用于提供测试依赖的资源,通过 @pytest.fixture 定义:

复制代码
import pytest

@pytest.fixture
def sample_data():
    return {"key": "value"}

def test_data(sample_data):
    assert sample_data["key"] == "value"

临时目录和文件

使用 tmp_path Fixture(内置):

复制代码
def test_create_file(tmp_path):
    file = tmp_path / "test.txt"
    file.write_text("content")
    assert file.read_text() == "content"

测试覆盖率

安装覆盖率插件并运行:

复制代码
pip install pytest-cov
pytest --cov=my_module tests/

常用命令行选项

  • -v: 显示详细输出。
  • -k EXPRESSION: 按名称筛选测试。
  • -m MARKER: 运行特定标记的测试(如 @pytest.mark.slow)。
  • --lf: 仅运行上次失败的测试。

插件推荐

  • pytest-xdist: 并行测试。
  • pytest-mock: 集成 unittest.mock
  • pytest-asyncio: 异步测试支持。

调试技巧

使用 --pdb 在测试失败时进入调试器:

复制代码
pytest --pdb test_sample.py

参考文档


selenium使用手册

Selenium 手册概述

Selenium 是一个开源的自动化测试工具,主要用于 Web 应用程序的测试。它支持多种编程语言(如 Python、Java、C# 等)和浏览器,提供丰富的 API 用于模拟用户操作。以下是 Selenium 的主要组件和核心功能。

Selenium 核心组件

Selenium WebDriver

WebDriver 是 Selenium 的核心组件,提供与浏览器的直接交互接口。它通过各浏览器的驱动程序(如 ChromeDriver、GeckoDriver)控制浏览器行为。

  • 支持多语言绑定(Python、Java 等)。
  • 提供元素定位、表单操作、页面导航等功能。

Selenium Grid

用于并行执行测试,支持在多台机器和不同浏览器上同时运行测试用例,提升测试效率。

Selenium IDE

浏览器插件形式的录制与回放工具,适合快速生成测试脚本,但功能较基础。

Python 环境下的 Selenium 使用

安装 Selenium

通过 pip 安装 Selenium 库:

复制代码
pip install selenium

配置浏览器驱动

下载对应浏览器的驱动(如 ChromeDriver),并将其路径添加到系统环境变量或代码中指定路径:

复制代码
from selenium import webdriver
driver = webdriver.Chrome(executable_path='path/to/chromedriver')

基本操作示例

复制代码
# 打开网页
driver.get("https://www.example.com")

# 定位元素并输入文本
search_box = driver.find_element_by_name("q")
search_box.send_keys("Selenium")

# 点击按钮
submit_button = driver.find_element_by_id("submit")
submit_button.click()

# 关闭浏览器
driver.quit()

元素定位方法

Selenium 提供多种元素定位方式,常用方法包括:

  • IDfind_element_by_id("id_value")
  • Namefind_element_by_name("name_value")
  • XPathfind_element_by_xpath("//input[@class='class_name']")
  • CSS Selectorfind_element_by_css_selector("input.class_name")

示例

复制代码
# 通过 XPath 定位
element = driver.find_element_by_xpath("//div[@id='content']/p[1]")

# 通过 CSS 选择器定位
element = driver.find_element_by_css_selector("div.content > p")

常用操作与高级功能

等待机制

  • 隐式等待 :全局设置等待时间。

    复制代码
    driver.implicitly_wait(10)  # 单位:秒
  • 显式等待 :针对特定条件等待。

    复制代码
    from selenium.webdriver.common.by import By
    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, "target_id"))
    )

浏览器操作

复制代码
# 窗口最大化
driver.maximize_window()

# 后退/前进
driver.back()
driver.forward()

# 截图保存
driver.save_screenshot("screenshot.png")

常见问题与调试

元素未找到

  • 检查元素是否在 iframe 中,需切换到对应 iframe:

    复制代码
    driver.switch_to.frame("frame_id")
  • 确保页面加载完成(使用等待机制)。

浏览器兼容性问题

  • 使用最新版本的驱动程序和浏览器。
  • 对于跨浏览器测试,结合 Selenium Grid。

扩展资源

通过以上内容,可以快速掌握 Selenium 的基本用法和核心功能,适用于自动化测试和 Web 数据抓取等场景。


结合 pytest 和 Selenium 的详细步骤

安装必要的依赖库。确保已安装 Python 和 pip,并通过以下命令安装 pytest 和 selenium:

复制代码
pip install pytest selenium

下载与浏览器匹配的 WebDriver。例如,使用 Chrome 浏览器需下载 ChromeDriver 并将其路径添加到系统环境变量中。

创建测试目录结构

初始化项目目录结构。建议按以下方式组织:

复制代码
project/
├── tests/
│   ├── __init__.py
│   ├── conftest.py
│   └── test_web.py
├── pytest.ini
└── requirements.txt

编写 conftest.py 配置

conftest.py 中定义 Selenium WebDriver 的 fixture,供所有测试用例共享:

复制代码
import pytest
from selenium import webdriver

@pytest.fixture(scope="session")
def browser():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

编写测试用例示例

test_web.py 中编写实际测试逻辑,以下示例测试百度搜索功能:

复制代码
def test_baidu_search(browser):
    browser.get("https://www.baidu.com")
    search_box = browser.find_element("id", "kw")
    search_box.send_keys("pytest selenium")
    search_box.submit()
    assert "pytest" in browser.title

配置 pytest 运行参数

pytest.ini 中添加基础配置:

复制代码
[pytest]
addopts = -v --html=report.html
testpaths = tests

运行测试并生成报告

执行以下命令运行测试并生成 HTML 报告:

复制代码
pytest

高级用法示例

实现页面对象模型(Page Object)增强可维护性。创建 pages/search_page.py

复制代码
class SearchPage:
    def __init__(self, browser):
        self.browser = browser

    def search(self, keyword):
        self.browser.find_element("id", "kw").send_keys(keyword)
        self.browser.find_element("id", "su").click()

更新测试用例使用 Page Object:

复制代码
from pages.search_page import SearchPage

def test_page_object(browser):
    browser.get("https://www.baidu.com")
    page = SearchPage(browser)
    page.search("pytest")
    assert "pytest" in browser.title

处理常见异常

添加显式等待解决元素加载问题:

复制代码
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def test_with_wait(browser):
    browser.get("https://www.baidu.com")
    element = WebDriverWait(browser, 10).until(
        EC.presence_of_element_located(("id", "kw"))
    )
    element.send_keys("selenium")

以上步骤涵盖了从环境搭建到高级用法的完整流程,可根据实际需求调整浏览器类型、等待策略和报告生成方式。

相关推荐
练习时长一年7 小时前
Jdk反射优化
java·开发语言
郝学胜-神的一滴8 小时前
深入解析C++命令模式:设计原理与实际应用
开发语言·c++·程序人生·软件工程·命令模式
AI量化投资实验室8 小时前
年化398%,回撤11%,夏普比5,免费订阅,5积分可查看参数|多智能体的架构设计|akshare的期货MCP代码
人工智能·python
ʚ希希ɞ ྀ8 小时前
单词接龙----图论
开发语言·javascript·ecmascript
散峰而望8 小时前
基本魔法语言数组 (一) (C语言)
c语言·开发语言·编辑器·github·visual studio code·visual studio
夫唯不争,故无尤也9 小时前
AI调度框架全解析:从通用到LLM专用
python·大模型·调用框架
MATLAB代码顾问9 小时前
MATLAB实现模糊PID控制
开发语言·matlab
虾说羊9 小时前
ssm面试题梳理
java·开发语言·rpc
Liudef069 小时前
基于Java的LLM长上下文数据预处理方案:实现128k上下文智能数据选择
java·开发语言·人工智能