Playwright 测试夹具

简介: Playwright 测试夹具

介绍
Playwright 测试基于测试装置的概念。测试夹具用于为每个测试建立环境,为测试提供所需的一切。测试之间的测试夹具是隔离的。使用夹具,你可以根据测试的含义而不是常见的设置对测试进行分组。

内置夹具
你已经在第一次测试中使用了测试装置。

import { test, expect } from '@playwright/test';

test('basic test', async ({ page }) => {
await page.goto('https://playwright.nodejs.cn/');

await expect(page).toHaveTitle(/Playwright/);
});

{ page } 参数告诉 Playwright Test 设置 page 夹具并将其提供给你的测试函数。

以下是你大部分时间可能使用的预定义装置的列表:
夹具 类型 描述
page [Page] 此测试运行的独立页面。
context [BrowserContext] 此测试运行的隔离上下文。page 装置也属于这种情况。了解如何 配置上下文。
browser [Browser] 跨测试共享浏览器以优化资源。了解如何 配置浏览器。
browserName [字符串] 当前运行测试的浏览器的名称。chromium、firefox 或 webkit。
request [APIRequestContext] 用于此测试运行的隔离 APIRequestContext 实例。
不使用夹具
以下是传统测试风格和基于夹具的测试风格之间典型测试环境设置的差异。

TodoPage 是一个帮助与 Web 应用的 "待办事项清单" 页面交互的类,遵循 页面对象模型 模式。它内部使用 Playwright 的 page。
todo.spec.ts
const { test } = require('@playwright/test');
const { TodoPage } = require('./todo-page');

test.describe('todo tests', () => {
let todoPage;

test.beforeEach(async ({ page }) => {
todoPage = new TodoPage(page);
await todoPage.goto();
await todoPage.addToDo('item1');
await todoPage.addToDo('item2');
});

test.afterEach(async () => {
await todoPage.removeAll();
});

test('should add an item', async () => {
await todoPage.addToDo('my item');
// ...
});

test('should remove an item', async () => {
await todoPage.remove('item1');
// ...
});
});
使用夹具
与前/后钩子相比,夹具具有许多优点:

Fixtures 将设置和拆卸封装在同一个地方,因此更容易编写。

夹具可以在测试文件之间重复使用 - 你可以定义它们一次并在所有测试中使用。这就是 Playwright 的内置 page 装置的工作原理。

夹具按需提供 - 你可以根据需要定义任意数量的夹具,Playwright Test 将仅设置测试所需的夹具,而不会设置其他任何夹具。

夹具是可组合的 - 它们可以相互依赖来提供复杂的行为。

夹具灵活。测试可以使用夹具的任意组合来定制所需的精确环境,而不会影响其他测试。

夹具简化了分组。你不再需要将测试封装在设置环境的 describe 中,而是可以根据测试的含义自由地对其进行分组。

Click to expand the code for the TodoPage
example.spec.ts
import { test as base } from '@playwright/test';
import { TodoPage } from './todo-page';

// Extend basic test by providing a "todoPage" fixture.
const test = base.extend<{ todoPage: TodoPage }>({
todoPage: async ({ page }, use) => {
const todoPage = new TodoPage(page);
await todoPage.goto();
await todoPage.addToDo('item1');
await todoPage.addToDo('item2');
await use(todoPage);
await todoPage.removeAll();
},
});
test('should add an item', async ({ todoPage }) => {
await todoPage.addToDo('my item');
// ...
});

test('should remove an item', async ({ todoPage }) => {
await todoPage.remove('item1');
// ...
});

创建夹具
要创建你自己的夹具,请使用 test.extend() 创建一个包含它的新 test 对象。

下面我们创建两个遵循 页面对象模型 模式的灯具 todoPage 和 settingsPage。
import { test as base } from '@playwright/test';
import { TodoPage } from './todo-page';
import { SettingsPage } from './settings-page';

// Declare the types of your fixtures.
type MyFixtures = {
todoPage: TodoPage;
settingsPage: SettingsPage;
};

// Extend base test by providing "todoPage" and "settingsPage".
// This new "test" can be used in multiple test files, and each of them will get the fixtures.
export const test = base.extend({
todoPage: async ({ page }, use) => {
// Set up the fixture.
const todoPage = new TodoPage(page);
await todoPage.goto();
await todoPage.addToDo('item1');
await todoPage.addToDo('item2');

// Use the fixture value in the test.
await use(todoPage);

// Clean up the fixture.
await todoPage.removeAll();

},

settingsPage: async ({ page }, use) => {
await use(new SettingsPage(page));
},
});
export { expect } from '@playwright/test';
使用夹具
只需在测试函数参数中提及夹具,测试运行程序就会处理它。夹具还有钩子和其他夹具。如果你使用 TypeScript,灯具将具有正确的类型。

下面我们使用上面定义的 todoPage 和 settingsPage 灯具。
import { test, expect } from './my-test';

test.beforeEach(async ({ settingsPage }) => {
await settingsPage.switchToDarkMode();
});

test('basic test', async ({ todoPage, page }) => {
await todoPage.addToDo('something nice');
await expect(page.getByTestId('todo-title')).toContainText(['something nice']);
});
压倒性的装置
除了创建自己的灯具之外,你还可以覆盖现有的灯具以满足你的需求。考虑以下示例,该示例通过自动导航到某个 baseURL 来覆盖 page 夹具:

import { test as base } from '@playwright/test';

export const test = base.extend({
page: async ({ baseURL, page }, use) => {
await page.goto(baseURL);
await use(page);
},
});

请注意,在此示例中,page 灯具能够依赖其他内置灯具,例如 testOptions.baseURL。我们现在可以在配置文件中配置 baseURL,或者在测试文件中本地配置 test.use()。

example.spec.ts

test.use({ baseURL: 'https://playwright.nodejs.cn' });

目录
相关文章
|
4月前
|
人工智能 JavaScript 算法
Playwright携手MCP:AI智能体实现自主化UI回归测试
MCP 协议使得 AI 能够通过 Playwright 操作浏览器,其中快照生成技术将页面状态转化为 LLM 可理解的文本,成为驱动自动化测试的关键。该方式适用于探索性测试和快速验证,但目前仍面临快照信息缺失、元素定位不稳定、成本高、复杂场景适应性差以及结果确定性不足等挑战。人机协同被认为是未来更可行的方向,AI 负责执行固定流程,人类则专注策略与验证。
|
3月前
|
人工智能 自然语言处理 JavaScript
Playwright MCP在UI回归测试中的实战:构建AI自主测试智能体
Playwright MCP结合AI智能体,革新UI回归测试:通过自然语言驱动浏览器操作,降低脚本编写门槛,提升测试效率与覆盖范围。借助快照解析、智能定位与Jira等工具集成,实现从需求描述到自动化执行的闭环,推动测试迈向智能化、民主化新阶段。
|
4月前
|
自然语言处理 前端开发 测试技术
使用 Playwright MCP 实现 UI 自动化测试
本文介绍如何结合Playwright与MCP协议实现智能化UI自动化测试。通过自然语言指令控制浏览器,降低技术门槛,提升效率,并涵盖环境搭建、核心功能、实战案例及最佳实践,展现对话式自动化的未来趋势。
|
5月前
|
人工智能 缓存 测试技术
Playwright进阶指南 (6) | 自动化测试实战
2025企业级测试解决方案全面解析:从单元测试到千级并发,构建高可用测试体系。结合Playwright智能工具,解决传统测试维护成本高、环境依赖强、执行效率低等痛点,提升测试成功率,内容从测试架构设计、电商系统实战框架、高级测试策略、Docker化部署、CI/CD集成及AI测试应用,助力测试工程师掌握前沿技术,打造高效稳定的测试流程。
Playwright进阶指南 (6) | 自动化测试实战
|
4月前
|
人工智能 自然语言处理 前端开发
深度解析Playwright MCP:功能、优势与挑战,AI如何提升测试效率与覆盖率
Playwright MCP通过AI与浏览器交互,实现自然语言驱动的自动化测试。它降低门槛、提升效率,助力测试工程师聚焦高价值工作,是探索性测试与快速验证的新利器。
|
4月前
|
人工智能 JavaScript 测试技术
当Playwright遇见MCP,AI智能体实现自主化UI回归测试
本文探讨如何通过Model Context Protocol(MCP)让AI智能体驱动Playwright实现端到端自动化测试。重点解析快照技术的实现原理与实战流程,同时深入剖析其在信息丢失、元素定位、成本效率及逻辑复杂性等方面的现实挑战。
|
6月前
|
JavaScript 前端开发 测试技术
Playwright自动化测试系列课(4) | 异步加载克星:自动等待 vs 智能等待策略深度解析​
本文深度解析Playwright自动化测试中的等待策略,对比自动等待(零配置防御机制)与智能等待(精准控制异步场景)的核心差异。通过实战案例讲解等待机制的选择标准、常见失效原因及调试技巧,帮助开发者有效解决页面异步加载问题,提升测试脚本的稳定性和执行效率。
|
6月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
6月前
|
JavaScript 测试技术 API
Playwright自动化测试系列(3) | 第二阶段:核心技能与调试 ​​交互操作大全
本课程为Playwright自动化测试第三阶段,深入讲解核心交互操作与调试技巧。涵盖基础到高级交互、文件上传下载、疑难问题解决及复杂场景应对,并提供稳定性优化方案,帮助开发者高效构建健壮的自动化测试脚本。
|
6月前
|
Web App开发 JavaScript 测试技术
Playwright 极速入门:1 小时搞定环境搭建与首个测试脚本
本文带你1小时快速入门Playwright,完成环境搭建并编写首个测试脚本。Playwright是微软推出的现代化Web自动化测试工具,支持Chromium、Firefox和WebKit三大浏览器引擎,具备跨平台、多语言(Python/JS/Java/C#)特性。其核心优势包括:智能自动等待机制减少失败率、内置录制工具实时生成脚本、多语言灵活选择,以及真移动端设备模拟能力,显著提升测试效率和可靠性。