先给个通俗比喻,快速定调
把这三个工具比作「网页测试司机」:
- Selenium:老资历的「全能司机」—— 啥车(浏览器 / 语言)都能开,啥路况(平台)都能走,但操作繁琐(要调座椅、调后视镜、手动挂挡),开得慢;
- Cypress:只开「跑车(前端 JS/TS)」的专属司机 —— 不用调任何设置,踩油门就飞(速度快),还能实时看路况(调试爽),但只能开跑车,不能开货车 / 摩托车(不支持多语言 / 移动端);
- Playwright:新一代「智能全能司机」—— 既像 Selenium 能开各种车,又像 Cypress 不用手动调太多,开得快,还能兼顾跑车、货车、摩托车(多语言 / 全浏览器 / 移动端)。
下面用「环境搭建→写用例→运行调试」的完整流程,结合百度搜索的简单例子,一步步讲透每个工具的用法和特点。
一、Selenium:老牌全能手(适合多语言 / 全场景,但麻烦)
核心特点(大白话)
- 支持 Python/Java/JS/C# 等所有主流语言,适合团队里有前端、后端、测试多角色的场景;
- 要手动装「浏览器驱动」(列如 Chrome 要装 ChromeDriver),不然连不上浏览器;
- 运行时是「远程控制」浏览器(和网页不在一个程序里),所以慢,还要手动等网页加载。
【使用步骤 + 实例】(以 Python 为例,最易上手)
步骤 1:搭建环境(3 步)
- 装 Python(官网下载,一路下一步);
- 装 Selenium 库:打开命令行,输入 pip install selenium;
- 装浏览器驱动(关键坑!):看自己 Chrome 的版本(列如 120 版),去「ChromeDriver 官网」下载对应版本的驱动;把驱动文件(列如 chromedriver.exe)放到 Python 安装目录,或系统环境变量里(不然代码找不到)。
步骤 2:写测试用例(打开百度,搜「测试」,验证标题)
新建文件 selenium_test.py,复制下面代码(每行都标了注释,一看就懂):
# 1. 导入Selenium的核心包
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 2. 启动Chrome浏览器(如果驱动没配环境变量,要写驱动路径:webdriver.Chrome(executable_path="chromedriver.exe"))
driver = webdriver.Chrome()
try:
# 3. 打开百度首页
driver.get("https://www.baidu.com")
# 4. 手动等待搜索框加载(Selenium不会自动等,不写这行可能报错)
search_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "kw")) # 定位搜索框(ID是kw)
)
# 5. 在搜索框输入「测试」
search_box.send_keys("测试")
# 6. 点击搜索按钮(定位按钮:ID是su)
driver.find_element(By.ID, "su").click()
# 7. 等待页面加载,验证标题是否包含「测试_百度搜索」
WebDriverWait(driver, 10).until(
EC.title_contains("测试_百度搜索")
)
print("测试成功!页面标题:", driver.title)
finally:
# 8. 关闭浏览器
driver.quit()
步骤 3:运行 & 调试
- 命令行输入 python selenium_test.py,会看到 Chrome 自动打开、搜素、关闭;
- 调试痛点:如果报错(列如驱动版本不对、没等加载),只能看文字日志,没法回看操作过程,得一点点改等待时间 / 定位方式。
【优缺点(通俗版)】
✅ 优点:
- 啥都能测:PC 端所有浏览器、甚至结合 Appium 测手机 APP;
- 团队里不管是写 Python 的后端,还是写 Java 的测试,都能上手;
- 网上搜「Selenium 报错」,10 个问题 9 个有答案(社区太老了)。
❌ 缺点:
- 配置麻烦:驱动版本不对、路径没配,第一步就卡半天;
- 写代码累:要手动加各种「等待」,不然网页没加载完就操作会报错;
- 运行慢:打开浏览器、操作元素都有延迟,测 10 个用例要等半天。
二、Cypress:前端专属快枪手(开箱即用,调试爽)
核心特点(大白话)
- 只认 JS/TS,纯前端团队用着爽,后端 / 测试如果不会 JS 就别碰;
- 不用装驱动、不用配环境,一键启动;
- 和网页「跑在一个程序里」,操作快,还能自动等页面加载(不用写等待代码);
- 调试时能「时间旅行」—— 每一步操作都能回看,像看监控录像。
【使用步骤 + 实例】
步骤 1:搭建环境(2 步,前提是装了 Node.js,前端都懂)
- 新建一个空文件夹(列如 cypress_demo),打开命令行进入该文件夹;
- 初始化项目 + 装 Cypress:
- bash
- 运行
- npm init -y # 初始化npm项目(生成package.json) npm install cypress –save-dev # 装Cypress
步骤 2:启动 Cypress(可视化界面)
- 命令行输入 npx cypress open,第一次运行会自动装依赖,然后弹出 Cypress 的可视化界面;
- 界面里点「E2E Testing」→ 选 Chrome → 点「Start E2E Testing in Chrome」,会自动生成示例测试文件。
步骤 3:写测试用例(百度搜索)
在 Cypress 界面的「Specs」里,新建文件 baidu_test.cy.js,复制下面代码:
// Cypress的用例写法:describe是测试套件,it是测试用例
describe('百度搜索测试', () => {
// 每个用例执行前,先打开百度(不用重复写)
beforeEach(() => {
cy.visit('https://www.baidu.com') // 打开百度
})
it('搜索「测试」,验证标题正确', () => {
// 1. 定位搜索框,输入「测试」(Cypress自动等搜索框加载,不用写等待)
cy.get('#kw').type('测试') // #kw是CSS选择器,定位搜索框
// 2. 点击搜索按钮
cy.get('#su').click()
// 3. 验证页面标题包含「测试_百度搜索」
cy.title().should('include', '测试_百度搜索')
// 4. 还能截图(自动的,报错也会截)
cy.screenshot()
})
})
步骤 4:运行 & 调试
- 在 Cypress 界面点击 baidu_test.cy.js,会自动打开 Chrome,左边能看到每一步操作(列如「访问百度」「输入测试」),点哪一步就能回看当时的页面状态(时间旅行);
- 改代码后不用重启,保存后 Cypress 会自动重新运行,实时看结果。
【优缺点(通俗版)】
✅ 优点:
- 零配置:装完就能用,前端开发者不用学新东西(全是 JS/CSS);
- 调试爽到爆:每一步都能回看,报错了直接看当时的页面,不用猜;
- 写代码省事儿:不用写等待、不用处理异步,代码比 Selenium 短一半。
❌ 缺点:
- 语言锁死:只能用 JS/TS,团队里有 Python/Java 开发者的话,没法共用;
- 浏览器支持差:原生不支持 Safari(苹果浏览器),想测 Safari 得绕弯;
- 搞不定多标签:列如点链接开新标签,Cypress 没法操作新标签,只能 hack(改代码)。
三、Playwright:全能新贵(平衡 Selenium 和 Cypress 的痛点)
核心特点(大白话)
- 支持 JS/TS/Python/Java/C#,兼顾多语言团队;
- 不用手动装驱动,一行命令装完所有浏览器(Chrome/Firefox/Safari);
- 运行速度和 Cypress 差不多,还能自动等加载,支持多标签 / 多窗口 / 手机模拟器;
- 微软出品,文档全,踩坑少。
【使用步骤 + 实例】(以 JS 为例,前端易理解)
步骤 1:搭建环境(2 步)
- 新建空文件夹(playwright_demo),命令行进入,初始化项目:
- bash
- 运行
- npm init -y npm install playwright –save-dev
- 安装浏览器(Playwright 自带,一行搞定):
- bash
- 运行
- npx playwright install # 自动装Chrome/Firefox/Safari
步骤 2:写测试用例(百度搜索 + 多标签演示,体现优势)
新建文件 playwright_test.js,复制下面代码:
// 1. 导入Playwright的核心包
const { test, expect } = require('@playwright/test');
// 2. 测试用例:百度搜索+打开新标签
test('百度搜索+多标签测试', async ({ page, context }) => {
// 3. 打开百度首页
await page.goto('https://www.baidu.com');
// 4. 定位搜索框,输入「测试」(自动等待加载)
await page.locator('#kw').fill('测试');
// 5. 点击搜索按钮
await page.locator('#su').click();
// 6. 验证标题正确
await expect(page).toHaveTitle(/测试_百度搜索/);
console.log("搜索测试成功!");
// --- 演示Playwright的多标签优势(Cypress做不到,Selenium要写许多代码) ---
// 7. 新建一个标签页
const newPage = await context.newPage();
// 8. 新标签页打开百度图片
await newPage.goto('https://image.baidu.com');
// 9. 验证新标签页标题
await expect(newPage).toHaveTitle(/百度图片/);
console.log("多标签测试成功!");
});
步骤 3:运行 & 调试
- 命令行运行(可选无头模式 / 可视化模式):
- bash
- 运行
- # 可视化运行(能看到浏览器操作) npx playwright test playwright_test.js –headed # 生成测试报告(带截图/录屏) npx playwright show-report
- 调试:Playwright 有内置调试器,命令行输入 npx playwright test –debug,能一步步执行代码,看每一步的页面状态。
【优缺点(通俗版)】
✅ 优点:
- 全能:支持所有浏览器(包括 Safari)、多语言、多标签、手机模拟器(列如模拟 iPhone 打开百度);
- 省心:不用装驱动,自动等待,代码比 Selenium 简洁,比 Cypress 稍复杂但功能全;
- 报告友善:自动生成带截图 / 录屏的报告,报错了直接看视频。
❌ 缺点:
- 社区比 Selenium 小:有些冷门问题(列如测老旧 IE 浏览器),网上答案少;
- 学习曲线比 Cypress 高:多了些「上下文」「页面」的概念,前端新手要学 1 小时;
- 相对年轻:2020 年才出,比 Selenium(2004 年)、Cypress(2015 年)新,极少数边缘场景可能有小坑。
四、通俗对比总结(表格版)
|
对比维度 |
Selenium(老全能) |
Cypress(前端专属) |
Playwright(新全能) |
|
上手难度 |
难(要配驱动、写等待) |
易(开箱即用,前端一看就会) |
中(比 Selenium 易,比 Cypress 稍难) |
|
运行速度 |
慢(远程控制浏览器) |
极快(和网页同进程) |
快(接近 Cypress) |
|
支持语言 |
所有(Python/Java/JS 等) |
仅 JS/TS |
所有(Python/Java/JS/C# 等) |
|
多标签 / 移动端 |
支持(但代码复杂) |
基本不支持 |
原生支持(代码简单) |
|
调试体验 |
差(只能看日志) |
极好(时间旅行) |
优秀(调试器 + 录屏) |
|
浏览器支持 |
全(但 Safari 配置麻烦) |
少(无原生 Safari) |
全(一键装所有浏览器) |
五、选型提议(大白话)
- 纯前端小团队(列如就 3-5 个前端,只测网页):选 Cypress,上手快、调试爽,不用折腾;
- 多语言大团队(前端写 JS、后端写 Python、测试写 Java):选 Playwright,所有人都能写,功能全还快;
- 维护老系统 / 要测手机 APP:选 Selenium(结合 Appium 测 APP),老问题都有解决方案;
- 要测 Safari / 多标签:直接选 Playwright,Cypress 搞不定,Selenium 太麻烦;
- 新手入门:先试 Cypress(最快出成果),再学 Playwright(拓展能力),Selenium 除非工作要求,否则不用先学。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...