当前位置: 首页 > news >正文

从零到报告:用Python Playwright写你的第一个Web自动化测试,并用pytest和Allure生成漂亮报告

从零到报告:用Python Playwright写你的第一个Web自动化测试,并用pytest和Allure生成漂亮报告

当你第一次听说Web自动化测试时,可能会感到既兴奋又迷茫。作为一个完全的新手,你可能听说过Selenium,但今天我要向你介绍一个更现代、更强大的工具——Playwright。它由微软开发,支持Chromium、WebKit和Firefox三大浏览器引擎,而且安装简单、API友好。更重要的是,我们可以结合pytest测试框架和Allure报告工具,打造一个完整的自动化测试解决方案。

这篇文章将带你从零开始,手把手完成以下里程碑:

  1. 安装必要的工具和环境
  2. 编写第一个简单的Playwright测试脚本
  3. 使用pytest运行测试
  4. 生成漂亮的Allure可视化报告

整个过程只需要30分钟左右,你就能获得第一个可运行的自动化测试和精美的报告,这种即时反馈会让你对学习自动化测试充满信心。

1. 环境准备:安装必要的工具

在开始编写测试之前,我们需要准备好开发环境。这里假设你已经安装了Python(建议3.7或更高版本),如果没有,可以从Python官网下载安装。

1.1 安装核心工具包

打开你的终端或命令行工具,执行以下命令安装必要的Python包:

pip install playwright pytest allure-python-commons

安装完成后,我们需要安装Playwright自带的浏览器:

playwright install

这个命令会自动下载Chromium、WebKit和Firefox浏览器,这些浏览器将被Playwright用于测试。

1.2 验证安装

为了确保一切安装正确,可以运行以下命令检查版本:

python -c "import playwright; print(playwright.__version__)" python -c "import pytest; print(pytest.__version__)"

如果这些命令都能正确输出版本号,说明基础环境已经准备就绪。

2. 编写第一个Playwright测试

现在,让我们创建一个简单的测试脚本。这个测试将:

  1. 打开一个网页
  2. 检查页面标题是否符合预期
  3. 验证页面上是否存在特定文本

2.1 创建测试文件

新建一个Python文件,命名为test_example.py,然后添加以下内容:

from playwright.sync_api import Page, expect import pytest def test_example_page(page: Page): # 导航到测试页面 page.goto("https://www.example.com") # 验证页面标题 expect(page).to_have_title("Example Domain") # 验证页面包含特定文本 expect(page.get_by_text("More information...")).to_be_visible()

这个简单的测试脚本展示了Playwright的基本用法:

  • page.goto()用于导航到指定URL
  • expect()用于断言页面状态
  • page.get_by_text()用于定位页面元素

2.2 理解Playwright的同步API

你可能注意到我们使用了sync_api,这是Playwright的同步API,对于初学者来说更直观易懂。Playwright也支持异步API,但对于第一个测试,同步API已经足够。

3. 使用pytest运行测试

pytest是一个功能强大的Python测试框架,它可以帮助我们组织和运行测试。

3.1 运行测试

在终端中,导航到包含测试文件的目录,然后运行:

pytest test_example.py -v

-v参数表示"verbose"模式,会显示更详细的输出信息。你应该能看到类似这样的输出:

============================= test session starts ============================== platform linux -- Python 3.9.0, pytest-7.4.0, pluggy-1.2.0 rootdir: /your/project/path collected 1 item test_example.py::test_example_page PASSED [100%] ============================== 1 passed in 1.23s ===============================

3.2 理解pytest的输出

pytest的输出包含几个关键信息:

  1. 测试环境信息(Python版本、pytest版本等)
  2. 测试收集情况(collected 1 item表示找到了1个测试)
  3. 测试结果(PASSED表示测试通过)
  4. 总运行时间

如果测试失败,pytest会提供详细的错误信息,帮助你快速定位问题。

4. 生成Allure测试报告

Allure是一个强大的测试报告工具,可以生成美观、详细的HTML报告。让我们把它集成到我们的测试中。

4.1 安装Allure命令行工具

首先,你需要安装Allure命令行工具。具体安装方法取决于你的操作系统:

  • macOS(使用Homebrew):

    brew install allure
  • Windows(使用Scoop):

    scoop install allure
  • Linux

    sudo apt-add-repository ppa:qameta/allure sudo apt-get update sudo apt-get install allure

安装完成后,验证是否安装成功:

allure --version

4.2 修改测试以支持Allure报告

更新test_example.py文件,添加Allure支持:

import allure from playwright.sync_api import Page, expect import pytest @allure.feature("Web UI Testing") @allure.story("Verify Example Domain") def test_example_page(page: Page): with allure.step("Navigate to example.com"): page.goto("https://www.example.com") with allure.step("Check page title"): expect(page).to_have_title("Example Domain") with allure.step("Verify 'More information...' text is visible"): expect(page.get_by_text("More information...")).to_be_visible()

我们添加了:

  • @allure.feature@allure.story装饰器来组织测试
  • allure.step()来记录测试步骤

4.3 生成Allure报告

现在,我们可以运行测试并生成报告了:

pytest test_example.py --alluredir=./allure-results

这个命令会运行测试并将结果保存在allure-results目录中。然后,我们可以用Allure生成HTML报告:

allure serve ./allure-results

这会启动一个本地服务器并自动在浏览器中打开报告页面。Allure报告提供了丰富的功能:

  • 测试用例的详细步骤
  • 通过/失败状态
  • 执行时间
  • 环境信息
  • 截图(如果测试失败)

5. 进阶技巧与最佳实践

现在你已经完成了第一个测试,让我们来看一些进阶技巧,让你的测试更加健壮和可维护。

5.1 使用Fixture管理浏览器实例

pytest的Fixture功能可以帮助我们更好地管理测试资源。创建一个conftest.py文件:

import pytest from playwright.sync_api import sync_playwright @pytest.fixture(scope="session") def browser(): with sync_playwright() as p: browser = p.chromium.launch(headless=False) yield browser browser.close() @pytest.fixture def page(browser): context = browser.new_context() page = context.new_page() yield page page.close() context.close()

这样,我们可以在多个测试文件中共享浏览器实例,提高测试效率。

5.2 添加失败截图

当测试失败时,截图可以帮助我们快速定位问题。修改conftest.py

@pytest.fixture def page(browser, request): context = browser.new_context() page = context.new_page() yield page if request.node.rep_call.failed: allure.attach( page.screenshot(full_page=True), name=f"{request.node.name}_failure", attachment_type=allure.attachment_type.PNG ) page.close() context.close() @pytest.hookimpl(tryfirst=True, hookwrapper=True) def pytest_runtest_makereport(item, call): outcome = yield rep = outcome.get_result() setattr(item, f"rep_{rep.when}", rep)

现在,当测试失败时,Allure报告中会自动包含页面截图。

5.3 参数化测试

pytest的@pytest.mark.parametrize装饰器可以让我们用不同的参数运行同一个测试:

import pytest @pytest.mark.parametrize("url,expected_title", [ ("https://www.example.com", "Example Domain"), ("https://www.google.com", "Google") ]) def test_page_titles(page, url, expected_title): page.goto(url) expect(page).to_have_title(expected_title)

这样,我们可以轻松地扩展测试覆盖范围。

6. 常见问题与解决方案

在学习和使用Playwright的过程中,你可能会遇到一些问题。这里列出了一些常见问题及其解决方法。

6.1 元素定位问题

Playwright提供了多种元素定位方式:

定位方式示例适用场景
文本定位page.get_by_text("Submit")按可见文本查找
角色定位page.get_by_role("button")按ARIA角色查找
标签定位page.get_by_label("Username")表单标签关联
占位符定位page.get_by_placeholder("Enter email")输入框占位符
测试ID定位page.get_by_test_id("submit-btn")自定义测试属性

最佳实践:优先使用get_by_role()get_by_text(),它们更接近用户视角。

6.2 等待策略

Playwright内置了自动等待机制,但有时需要显式等待:

# 等待元素可见 page.locator("#loading").wait_for(state="visible") # 等待网络请求完成 with page.expect_response("**/api/data") as response: page.click("#load-data") data = response.value.json()

6.3 跨浏览器测试

Playwright支持多种浏览器引擎,可以轻松实现跨浏览器测试:

@pytest.mark.parametrize("browser_type", ["chromium", "firefox", "webkit"]) def test_cross_browser(browser_type, request): with sync_playwright() as p: browser = getattr(p, browser_type).launch() page = browser.new_page() page.goto("https://example.com") # 测试逻辑... browser.close()

7. 项目结构与持续集成

随着测试规模的扩大,良好的项目结构变得尤为重要。以下是一个推荐的目录结构:

project/ ├── tests/ │ ├── __init__.py │ ├── conftest.py │ ├── test_homepage.py │ └── test_login.py ├── pages/ │ ├── __init__.py │ ├── homepage.py │ └── login_page.py ├── utils/ │ ├── __init__.py │ └── helpers.py └── pytest.ini

7.1 页面对象模式

使用页面对象模式可以提高代码的可维护性。例如,创建一个pages/login_page.py

from playwright.sync_api import Page class LoginPage: def __init__(self, page: Page): self.page = page self.username = page.get_by_label("Username") self.password = page.get_by_label("Password") self.submit = page.get_by_role("button", name="Login") def navigate(self): self.page.goto("/login") def login(self, username: str, password: str): self.username.fill(username) self.password.fill(password) self.submit.click()

然后在测试中使用:

from pages.login_page import LoginPage def test_login(page): login_page = LoginPage(page) login_page.navigate() login_page.login("testuser", "password123") # 验证登录成功...

7.2 持续集成配置

你可以轻松地将这套测试框架集成到CI/CD流程中。以下是一个GitHub Actions的示例配置:

name: Playwright Tests on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.9' - name: Install dependencies run: | python -m pip install --upgrade pip pip install playwright pytest allure-python-commons playwright install - name: Run tests run: | pytest --alluredir=./allure-results - name: Generate report if: always() uses: simple-elf/allure-report-action@v1 with: allure_results: ./allure-results

这个配置会在每次代码推送或拉取请求时自动运行测试,并生成Allure报告。

http://www.jsqmd.com/news/741276/

相关文章:

  • 大语言模型记忆管理:MEMMA架构设计与实践
  • 告别VSCode无限下载!一份为Unity开发者定制的C#插件与.NET环境避坑指南
  • MeViS数据集与LMPM++:多模态视频运动分割技术解析
  • 云盘文件直链获取方案:LinkSwift技术实现与应用实践
  • LangChain Prompt Templates实战:从Hub加载到自定义,打造你的提示词库
  • 2026年湖南高压电机绝缘在线检测仪采购指南:智能、可靠与本地化服务 - 2026年企业推荐榜
  • AI教材编写秘籍:揭秘低查重AI写教材工具,一键搞定20万字教材!
  • 2026饮料瓶洗瓶机技术解析:组培瓶洗瓶机/自动化清洗瓶机/啤酒瓶洗瓶机/回收瓶洗瓶机/实验室洗瓶机/毛刷式洗瓶机/选择指南 - 优质品牌商家
  • 2026年4月河北隐形井盖产业格局解析与源头工厂推荐 - 2026年企业推荐榜
  • 2026年研究生学位论文降AI攻略:硕士博士论文高标准降AI分章处理完整方案
  • 绝区零一条龙终极指南:如何用AI助手每天节省1小时游戏时间
  • 2026 年中国 GEO 优化公司综合实力 TOP5 权威榜单及企业选型指南 - GEO优化
  • 2026年现阶段安徽市场如何甄选靠谱的玻璃钢格栅批发厂家?河北腾森深度解析 - 2026年企业推荐榜
  • 别再手动记日志了!用Python logging模块给你的PyTorch/TensorFlow训练过程做个‘自动秘书’
  • 2025最权威的六大AI写作平台横评
  • 扩散模型视觉一致性评估与特征解耦实践
  • 保姆级调试:用adb shell am stack list分析车机多窗口Activity的显示层级
  • FusionRoute:令牌级路由协作框架解析与应用
  • 2026年4月更新:安徽图文印刷服务商推荐——京东图文 - 2026年企业推荐榜
  • 别再问客服了!手把手教你用Python+OpenCV计算无人机照片里任意区域的真实面积
  • 从PyTorch到TRT引擎:用trtexec命令行工具实现ONNX模型推理速度翻倍(Windows10实测)
  • 2026年市场观察:常州医院食堂承包服务商综合能力剖析与选择指南 - 2026年企业推荐榜
  • 从Content Script到Background:手把手教你用onMessage打通Chrome扩展数据流
  • POLCA算法:概率导向的组合优化技术解析
  • JAVA-实战8 Redis实战项目—雷神点评(1)短信登录
  • 2026年4月饮品加盟市场盘点:为何执着饮品成为热门选择? - 2026年企业推荐榜
  • 9 【自适应天线与相控阵技术】单极子相控阵天线的设计、分析与测试:从有限阵列矩量法到无限阵列 Floquet 理论的完整推导
  • OpenClaw部署助手:零代码一键部署AI智能体网关的实践指南
  • 构建支持多 AI 模型的智能客服系统架构设计与接入实践
  • 现在不建立编译器适配测试基线,明年Rust/C++23混合编译项目将触发不可逆的ABI断裂——资深编译器工程师的3条生存建议