Playwright入门:环境搭建与第一个自动化测试脚本

简介: Playwright支持Chromium、Firefox、WebKit,跨浏览器测试更高效。自动等待机制提升稳定性,无需手动sleep。本文带你从环境搭建到编写首个百度搜索测试脚本,涵盖最佳实践与常见问题解决,助你快速上手自动化测试。

为什么选择Playwright?
在开始之前,你可能想知道为什么选择Playwright而不是其他测试框架。我最初接触Playwright是因为它出色的跨浏览器支持——它同时支持Chromium、Firefox和WebKit内核,这意味着你可以用一套代码测试Chrome、Firefox和Safari。更重要的是,它的自动等待机制让测试脚本更加稳定,不需要像以前那样到处添加sleep语句。

我使用Playwright已经有一年多时间,在实际项目中它确实大大减少了因页面加载时间不稳定导致的测试失败。下面我将带你从零开始搭建环境,并编写第一个真正的测试脚本。

环境搭建:一步步来

  1. 安装Node.js
    Playwright基于Node.js,所以首先需要安装Node.js环境。我建议使用Node.js 16或更高版本。

检查Node.js是否安装

node --version

如果未安装,访问Node.js官网下载安装包

https://nodejs.org/

安装完成后,我习惯创建一个专门的目录来管理测试项目:

mkdir playwright-tutorial
cd playwright-tutorial

  1. 初始化项目并安装Playwright

    初始化npm项目(一路按回车使用默认值即可)

    npm init -y

安装Playwright

npm install playwright

或者如果你想要TypeScript支持

npm install playwright @types/node @typescript-eslint/eslint-plugin --save-dev
安装过程可能需要几分钟,因为Playwright会下载它需要的浏览器二进制文件。我建议喝杯咖啡等待一下——第一次安装时它会下载三个浏览器(Chromium、Firefox和WebKit),大约需要200-300MB磁盘空间。

  1. 验证安装
    创建一个简单的验证脚本 check-installation.js:

const { chromium } = require('playwright');

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await page.goto('https://www.example.com');
console.log('页面标题:', await page.title());
awaitnewPromise(resolve => setTimeout(resolve, 3000)); // 等待3秒查看效果
await browser.close();
})();
运行这个脚本:

node check-installation.js
如果你看到一个浏览器窗口打开并显示example.com,恭喜你!环境搭建成功。

配置编辑器(可选但推荐)
我个人使用VS Code,并且推荐安装这些扩展:

Playwright Test for VSCode(官方扩展)
Code Spell Checker(避免拼写错误)
在项目根目录创建 .vscode/launch.json 文件可以方便调试:

{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "运行Playwright测试",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["--runInBand"]
}
]
}
编写第一个真正的测试脚本
现在进入有趣的部分!让我们编写一个实际的测试场景:测试百度搜索功能。

创建文件 first-test.js:

const { chromium } = require('playwright');

describe('百度搜索测试', () => {
let browser;
let page;

// 每个测试用例之前运行
beforeEach(async () => {
browser = await chromium.launch({
headless: false, // 设置为true可以在后台运行
slowMo: 500// 放慢操作速度,方便观察
});
page = await browser.newPage();
await page.goto('https://www.baidu.com');
});

// 每个测试用例之后运行
afterEach(async () => {
await browser.close();
});

it('应该能够搜索关键词并显示结果', async () => {
// 定位搜索框并输入内容
const searchInput = await page.$('#kw');
await searchInput.type('Playwright自动化测试');

// 点击搜索按钮
const searchButton = await page.$('#su');
await searchButton.click();

// 等待搜索结果加载
await page.waitForSelector('.result');

// 获取第一个结果标题
const firstResult = await page.$('.c-container h3 a');
const title = await firstResult.textContent();

console.log('第一个搜索结果:', title);

// 简单的断言
expect(title).toContain('Playwright');

});

it('应该能够处理无结果的情况', async () => {
// 输入一个不太可能存在的搜索词
const searchInput = await page.$('#kw');
await searchInput.type('asdfghjkl1234567890特殊测试词');

const searchButton = await page.$('#su');
await searchButton.click();

// 等待无结果提示出现
await page.waitForSelector('.content_none');

const noResultText = await page.textContent('.content_none');
expect(noResultText).toContain('没有找到');

});
});

// 运行测试
(async () => {
const { runTests } = require('./test-runner');
await runTests();
})();

让测试更健壮:最佳实践

  1. 使用选择器的最佳方式
    我刚开始用Playwright时,犯过过度依赖CSS选择器的错误。实际上,Playwright提供了更好的定位方式:

// 不推荐 - 过于脆弱
await page.click('#main > div > form > input.submit');

// 推荐 - 使用文本内容
await page.click('text=搜索');

// 推荐 - 使用data-testid属性(需要在开发时添加)
await page.click('[data-testid="search-button"]');

// 推荐 - 使用角色定位
await page.click('button:has-text("Submit")');

  1. 处理弹窗和导航
    实际测试中经常遇到弹窗和页面跳转:

// 处理弹窗
page.on('dialog', async dialog => {
console.log(弹窗消息: ${dialog.message()});
await dialog.accept(); // 或 dialog.dismiss()
});

// 等待新窗口打开
const [newPage] = awaitPromise.all([
page.waitForEvent('popup'),
page.click('a[target="_blank"]')
]);

// 处理iframe
const frame = page.frame({ name: 'login-frame' });
await frame.fill('#username', 'testuser');

  1. 添加截图和视频功能
    调试时截图非常有用:

it('失败时截图', async () => {
try {
// 测试代码...
} catch (error) {
// 保存截图和HTML
await page.screenshot({ path: 'error-screenshot.png', fullPage: true });
await page.content().then(html => {
require('fs').writeFileSync('error-page.html', html);
});
throw error;
}
});
常见问题解决
在我使用Playwright的过程中,遇到过这些问题:

浏览器启动失败:通常是因为杀毒软件阻止,尝试关闭杀毒软件或添加到白名单。

元素找不到:最常见的问题。使用 page.waitForSelector() 或 page.waitForFunction() 等待元素出现。

跨域问题:Playwright默认禁用Web安全,但如果仍有问题,可以尝试:

await page.goto('https://example.com', {
waitUntil: 'networkidle'
});
中文输入问题:使用 page.type() 而不是 page.fill() 来输入中文。
进阶:整合测试框架
虽然我们可以自己写测试运行逻辑,但使用成熟的测试框架更方便。我推荐Jest或Playwright Test(Playwright自带的测试运行器)。

安装Playwright Test:

npm install @playwright/test
然后创建 tests/example.spec.js:

const { test, expect } = require('@playwright/test');

test('基础测试', async ({ page }) => {
await page.goto('https://www.baidu.com');
await page.type('#kw', 'Playwright');
await page.click('#su');
await page.waitForSelector('.result');

const title = await page.title();
expect(title).toContain('Playwright');
});
运行测试:

npx playwright test
总结
到现在为止,你已经成功搭建了Playwright测试环境,并编写了第一个自动化测试脚本。我建议从简单的页面开始练习,逐步尝试更复杂的交互场景。

记住,好的自动化测试不仅仅是让脚本运行起来,还要考虑可维护性、稳定性和可读性。给选择器起有意义的名称,添加清晰的注释,处理好等待和异常——这些习惯会让你的测试代码更加健壮。

下一步,你可以尝试:

测试一个登录流程
处理文件上传下载
模拟移动设备
集成到CI/CD流程中
每个步骤都会让你对Playwright有更深的理解。开始你的自动化测试之旅吧!

相关文章
|
29天前
|
数据可视化 Java 测试技术
Coze vs 主流测试框架技术选型指南
面对测试框架选型难题,团队常陷入传统与新兴工具之争。本文系统对比JUnit等传统框架与新一代Coze在学习成本、测试类型、报告可视化、CI集成等方面的优劣,结合实战场景提出选型策略与迁移路径,助你根据项目特点做出理性选择,实现测试效率与质量的双重提升。
|
1月前
|
人工智能 开发框架 自然语言处理
解放双手:Playwright+AI如何让测试工程师“躺赢”
Playwright携手大模型,重塑自动化测试:代码精度与人类理解融合,让测试从“苦力”升级为“指挥”。MCP作AI之手眼,快照技术传关键上下文,实现自适应操作。案例涵盖公众号发布、智能表单填充,支持自然语言驱动、实时调试,维护成本降80%,覆盖率翻数倍,开启智能测试新纪元。
|
2月前
|
监控 前端开发 测试技术
Playwright为什么老是跑不稳?12个坑踩完我终于懂了!
周五下班前,测试全绿、CI顺畅,才是理想状态。若Playwright测试常慢、失败、截图冗余,说明需优化。本文12条实战建议:用例按风险分层、稳定定位、去sleep、复用登录态、API准备数据、合理mock、精准视觉回归、按需trace、控制并发、封装业务流、追踪不稳用例、标准化报告。让发版安心,告别焦虑。
|
15天前
|
人工智能 运维 安全
技术深析快手直播安全事件:为什么大量违规直播“关不掉”?
快手直播安全事件暴露了高并发下账号权限、风控与审核系统的系统性失效。对测试开发而言,需从功能验证转向系统性防控,强化极端场景测试、高负载审核链路验证及熔断机制演练,提升对复杂风险的预判与拦截能力。
|
2月前
|
敏捷开发 Devops 测试技术
测试用例生成太慢?我们用RAG+大模型,实现了分钟级全覆盖
在敏捷与DevOps时代,测试用例生成常成瓶颈。传统方法效率低、覆盖差、维护难。本文提出RAG+大模型方案,通过检索企业知识库(PRD、API文档等)为大模型提供上下文,精准生成高质量用例。实现从“小时级”到“分钟级”的跨越,提升覆盖率与知识复用,助力测试智能化升级。
|
8天前
|
人工智能 算法 数据可视化
别卷手工测试了!这6个大模型应用场景让你身价翻倍
大语言模型正重塑软件测试:从AI生成用例、智能代码审查到需求深度解析,推动测试自动化、智能化升级。测试工程师需掌握AI协同技能,聚焦高阶质量设计,实现职业跃迁。
|
2月前
|
人工智能 自然语言处理 JavaScript
使用Playwright MCP实现UI自动化测试:从环境搭建到实战案例
本文介绍如何通过Playwright与MCP协议结合,实现基于自然语言指令的UI自动化测试。从环境搭建、核心工具到实战案例,展示AI驱动的测试新范式,降低技术门槛,提升测试效率与适应性。
|
3月前
|
Web App开发 数据可视化 前端开发
当Dify遇见Selenium:可视化编排UI自动化测试,原来如此简单
Dify与Selenium融合,打造可视化UI自动化测试新范式。无需编码,通过拖拽构建复杂测试流程,降低技术门槛,提升协作效率。智能元素定位、自适应等待、视觉验证等特性显著增强测试稳定性与维护性,结合CI/CD实现高效回归,推动测试智能化演进。
|
2月前
|
敏捷开发 人工智能 数据可视化
让AI替你写用例!Dify+RAG工作流,一键生成覆盖率达90%的测试方案
本文介绍如何利用Dify.ai与RAG技术构建智能测试用例生成工作流,通过接入需求文档、API接口等知识库,实现高覆盖率(超90%)的自动化用例生成,显著提升测试效率与质量,解放测试人力,助力敏捷开发。
|
4月前
|
人工智能 JavaScript 算法
Playwright携手MCP:AI智能体实现自主化UI回归测试
MCP 协议使得 AI 能够通过 Playwright 操作浏览器,其中快照生成技术将页面状态转化为 LLM 可理解的文本,成为驱动自动化测试的关键。该方式适用于探索性测试和快速验证,但目前仍面临快照信息缺失、元素定位不稳定、成本高、复杂场景适应性差以及结果确定性不足等挑战。人机协同被认为是未来更可行的方向,AI 负责执行固定流程,人类则专注策略与验证。