Playwright vs Cypress对决 – 2026年最值得学习的自动化测试框架

引言

大家好,我是coding小虫。做前端自动化测试4年了,用过Selenium、Cypress,最近一年深度使用Playwright。今天想和大家聊聊这两个热门框架的对比,帮你决定2026年该学哪个。

先说结论:两个都值得学,但推荐先学Playwright

为什么?往下看。

一、框架背景对比

Cypress

Playwright

对比项 Cypress Playwright
发布时间 2017 2020
维护方 商业公司 Microsoft
开源 部分开源 完全开源
语言支持 JS/TS 多语言
浏览器 Chrome系列 Chromium/Firefox/WebKit
运行方式 客户端 CDP协议

二、核心技术差异

1. 运行架构

这是两个框架最本质的区别。

Cypress架构:


浏览器 Cypress运行时 测试代码
(同一个进程内)

Cypress运行在浏览器内部,可以直接访问:

Playwright架构:


浏览器 CDP协议 Playwright 测试代码
(独立进程)

Playwright通过Chrome DevTools Protocol控制浏览器,类似WebDriver但更底层。

2. 各有优劣

Cypress的优势:

javascript
// Cypress可以直接访问应用内部状态
cy.window().then((win) =

{

// 直接调用应用的方法
win.app.login(‘user’, ‘pass’);
});

// 实时看到DOM变化
cy.get(‘.loading’).should(‘not.exist’);

Cypress的劣势:

javascript
// Cypress不能跨域访问
// 不能同时测试多个标签页
// 不能直接测试非JS应用(如纯HTML页面)

Playwright的优势:

javascript
// Playwright支持多页面
const page1 = await browser.newPage();
const page2 = await browser.newPage();

// 支持跨域
await page1.goto(‘https://site-a.com’);
await page2.goto(‘https://site-b.com’);

// 可以测试任何网站
await page.goto(‘https://any-site.com’);

三、API设计对比

元素定位

Cypress:

javascript
// Cypress使用jQuery风格的定位器
cy.get(‘#username’).type(‘user’);
cy.get(‘.btn-primary’).click();
cy.contains(‘登录’).click(); // 文本定位

// 链式调用
cy.get(‘.form’)
.find(‘input’)
.first()
.type(‘hello’);

Playwright:

javascript
// Playwright使用CSS/XPath/Text定位器
await page.locator(‘#username’).fill(‘user’);
await page.locator(‘.btn-primary’).click();
await page.getByText(‘登录’).click(); // 文本定位

// 链式调用
await page.locator(‘.form’)
.locator(‘input’)
.first()
.fill(‘hello’);

等待机制

Cypress:

javascript
// Cypress自动重试,不需要手动等待
cy.get(‘.result’).should(‘contain’, ‘success’);
// 会自动等待直到元素出现或超时(默认4秒)

Playwright:

javascript
// Playwright也自动等待
await page.locator(‘.result’).textContent();
// 默认等待30秒

// 也可以自定义等待
await page.waitForSelector(‘.result’, { timeout: 5000 });
await page.waitForFunction(() =

document.querySelector(‘.result’).textContent === ‘success’);

断言方式

Cypress:

javascript
// Cypress使用Chai断言库
cy.get(‘.price’).should(‘have.text’, ‘$100’);
cy.get(‘.item’).should(‘have.length’, 3);
cy.get(‘.error’).should(‘not.be.visible’);

// 自定义断言
cy.get(‘.data’).should(($el) =

{

expect($el.text()).to.match(/pattern/);
});

Playwright:

javascript
// Playwright使用内置断言
await expect(page.locator(‘.price’)).toHaveText(‘$100’);
await expect(page.locator(‘.item’)).toHaveCount(3);
await expect(page.locator(‘.error’)).not.toBeVisible();

// 自定义断言
await expect(page.locator(‘.data’)).toMatch(/w+/);

四、实际功能对比

1. 多浏览器支持

Cypress:

javascript
// Cypress配置支持Chrome、Edge、Firefox(实验性)
{
“browsers”: [
{ “name”: “chrome”, “family”: “chromium” },
{ “name”: “firefox”, “family”: “firefox” }
]
}

// Firefox支持有限,WebKit不支持

Playwright:

javascript
// Playwright原生支持三大引擎
const browser = await chromium.launch(); // Chromium
const browser = await firefox.launch(); // Firefox
const browser = await webkit.launch(); // Safari风格

// 或者使用项目配置
const projects = [
{ name: ‘chromium’, use: { browserName: ‘chromium’ } },
{ name: ‘firefox’, use: { browserName: ‘firefox’ } },
{ name: ‘webkit’, use: { browserName: ‘webkit’ } },
];

2. 并行测试

Cypress:

bash

Cypress Dashboard付费版支持并行

cypress run –parallel

#免费版需要自己配置,比较麻烦

Playwright:

bash

Playwright原生支持并行

npx playwright test –workers=4

配置文件

export default defineConfig({
workers: process.env.CI ? 4 : 1,
});

3. 测试报告

Cypress:

bash

内置Mocha报告

cypress run –reporter mochawesome

Dashboard付费版有更丰富的报告

Playwright:

bash

多种报告格式

npx playwright test –reporter=html
npx playwright test –reporter=junit

HTML报告很美观,包含视频截图

4. 网络Mock

Cypress:

javascript
// Cypress Mock网络请求
cy.intercept(‘GET’, ‘/api/users’, {
body: [{ name: ‘test’ }]
});

cy.intercept(‘POST’, ‘/api/login’, (req) =

{

req.reply({ status: 200, body: { token: ‘mock-token’ } });
});

Playwright:

javascript
// Playwright Mock网络请求
await page.route(‘**/api/users’, route =

{

route.fulfill({ body: JSON.stringify([{ name: ‘test’ }]) });
});

await page.route(‘**/api/login’, route =

{

route.fulfill({ status: 200, body: ‘{ “token”: “mock-token” }’ });
});

五、性能对比

我做了一个简单的性能测试:

javascript
// 测试用例:登录 –

导航 -> 5个页面操作 -> 验证

// 环境:M1 MacBook Pro,Chrome浏览器

// Cypress
// 10次平均:12.3秒

// Playwright
// 10次平均:8.7秒

Playwright更快的原因:

1. CDP协议比WebDriver更高效
2. 自动等待算法更智能
3. 并行执行更成熟

六、代码示例对比

登录测试

Cypress版:

javascript
// cypress/e2e/login.cy.js
describe(‘登录测试’, () =

{

beforeEach(() =

{

cy.visit(‘/login’);
});

it(‘成功登录’, () =

{

cy.get(‘#username’).type(‘testuser’);
cy.get(‘#password’).type(‘password123’);
cy.get(‘button[type=”submit”]’).click();

cy.url().should(‘include’, ‘/dashboard’);
cy.get(‘.welcome’).should(‘contain’, ‘欢迎’);
});

it(‘登录失败’, () =

{

cy.get(‘#username’).type(‘wronguser’);
cy.get(‘#password’).type(‘wrongpass’);
cy.get(‘button[type=”submit”]’).click();

cy.get(‘.error’).should(‘be.visible’);
cy.get(‘.error’).should(‘contain’, ‘用户名或密码错误’);
});
});

Playwright版:

javascript
// tests/login.spec.js
import { test, expect } from ‘@playwright/test’;

test.describe(‘登录测试’, () =

{

test.beforeEach(async ({ page }) =

{

await page.goto(‘/login’);
});

test(‘成功登录’, async ({ page }) =

{

await page.locator(‘#username’).fill(‘testuser’);
await page.locator(‘#password’).fill(‘password123’);
await page.locator(‘button[type=”submit”]’).click();

await expect(page).toHaveURL(/.*dashboard/);
await expect(page.locator(‘.welcome’)).toContainText(‘欢迎’);
});

test(‘登录失败’, async ({ page }) =

{

await page.locator(‘#username’).fill(‘wronguser’);
await page.locator(‘#password’).fill(‘wrongpass’);
await page.locator(‘button[type=”submit”]’).click();

await expect(page.locator(‘.error’)).toBeVisible();
await expect(page.locator(‘.error’)).toContainText(‘用户名或密码错误’);
});
});

API测试

Cypress版:

javascript
// Cypress做API测试
describe(‘API测试’, () =

{

it(‘获取用户列表’, () =

{

cy.request(‘GET’, ‘/api/users’)
.its(‘status’)
.should(‘eq’, 200);

cy.request(‘GET’, ‘/api/users’)
.its(‘body’)
.should(‘have.length’, 10);
});
});

Playwright版:

javascript
// Playwright做API测试
import { test, expect } from ‘@playwright/test’;

test(‘获取用户列表’, async ({ request }) =

{

const response = await request.get(‘/api/users’);
expect(response.status()).toBe(200);

const body = await response.json();
expect(body.length).toBe(10);
});

七、选型建议

选Cypress的场景

选Playwright的场景

我的建议

2026年推荐学Playwright

理由:
1. 多语言支持,适合各种团队
2. Microsoft维护,长期保障
3. 完全开源免费
4. 性能更好
5. 功能更全面

但Cypress依然值得学习,特别是前端团队。

八、学习路径

Cypress学习路径

1. 官方文档:https://docs.cypress.io/
2. 安装:npm install cypress
3. 第一个测试:npx cypress open
4. 学习API定位、断言、Mock
5. 集成CI/CD

Playwright学习路径

1. 官方文档:https://playwright.dev/
2. 安装:npm init playwright@latest
3. 第一个测试:npx playwright test
4. 学习Locator、Assertions、Page Object
5. 配置多浏览器、并行、报告
6. 集成CI/CD

总结

Playwright和Cypress都是优秀的E2E测试框架,各有优势:

场景 推荐
前端团队、纯JS项目 Cypress
多语言团队、复杂场景 Playwright
需要测试Safari Playwright
快速上手、实时调试 Cypress
CI/CD集成、并行测试 Playwright

2026年,我的排序:Playwright

Cypress > Selenium(Web自动化)。

参考资料

下期预告:Pytest高级用法全攻略 – 参数化、钩子函数与插件开发实战

分享到:

探索 RunnerGo 全栈测试平台

RunnerGo 是一款面向企业的全栈测试平台,集接口测试、自动化测试、性能测试、UI测试于一体,助力企业提升研发效能。

接口测试
性能测试
自动化测试
免费体验 RunnerGo