
Playwright 在 2024 年中期的每週 npm 下載量上超越了 Cypress,而到了 2026 年初,這一差距已擴大至約 3,000 萬次對 650 萬次的每週下載量。這種轉變並非偶然。Google 搜尋結果首頁上的其他比較文章大多由 QA 工具供應商或測試 SaaS 公司撰寫。而這篇文章則來自一個建構生產環境 Web 應用程式並為實際專案挑選測試自動化框架的團隊,而非為了推廣特定產品。
以下是 Selenium 的定位:它仍然是全球部署最廣泛的 E2E 框架,特別是在 Java 和 Python 團隊中。它不會消失。但對於 2026 年的新 JavaScript/TypeScript 專案來說,真正的問題在於 Playwright 與 Cypress 之間的選擇,而 Selenium 則作為舊系統的備案。
快速概覽總結
選擇 Playwright,如果你想要 2026 年整體最佳的測試框架:最快的執行速度、免費的平行化測試、多語言支援以及優秀的 TypeScript 開發者體驗 (DX)。選擇 Cypress,如果你的團隊將互動式除錯和元件測試置於一切之上。選擇 Selenium,如果你身處擁有現有 Selenium 基礎設施的 Java/Python 企業環境中。
| 功能 | Playwright | Cypress | Selenium |
|---|---|---|---|
| 開發者 | Microsoft | Cypress.io | Selenium 社群 |
| 首次發布 | 2020 | 2014 | 2004 |
| 架構 | WebSocket (CDP) | 瀏覽器內執行 | WebDriver 協定 |
| 支援語言 | JS/TS, Python, Java, C# | 僅限 JS/TS | JS, Python, Java, C#, Ruby, PHP, Kotlin |
| 瀏覽器支援 | Chromium, Firefox, WebKit | Chrome, Firefox, Edge, Electron, WebKit (實驗性) | Chrome, Firefox, Safari, Edge, IE |
| 執行速度 | 最快 (~4.5秒) | 中等 (~9.4秒) | 最慢 (~14.5秒) |
| 平行化測試 | 內建且免費 (分片) | 付費 (Cypress Cloud) 或社群工具 | Selenium Grid (自託管) |
| 雲端/儀表板成本 | $0 | $67-$267/月 (年繳) | $0 (+ 基礎設施成本) |
| TypeScript DX | 一流支援 | 良好 (有些小問題) | 社群努力成果 |
| 元件測試 | 實驗性 | 成熟 (一流支援) | 無 |
| 學習曲線 | 中等 | 低 (針對 JS 開發者) | 陡峭 |
| 最適合 | 大多數新專案 | 重視互動式 DX 的前端團隊 | 企業級 Java/Python 團隊 |
以上是總結。本文剩餘部分將透過程式碼、基準測試和誠實的觀點,解釋每一行背後的證據。
架構:各工具如何與瀏覽器溝通
架構幾乎是本次比較中所有差異的根本原因。可以這樣想:Playwright 就像舞台導演直接向演員低語指令。Cypress 則與演員同在舞台上,在同一個房間內運作。Selenium 則是透過站在走廊的中間人發送指令。
<!-- IMAGE: Architecture comparison showing Playwright WebSocket connection, Cypress in-browser execution, and Selenium WebDriver intermediary layer -->Playwright:透過 WebSocket 直接控制瀏覽器
Playwright 使用 WebSocket 連線與瀏覽器通訊,針對 Chromium 使用 Chrome DevTools Protocol (CDP),針對 Firefox 和 WebKit 則使用等效協定。沒有中間層,你的測試程式碼直接向瀏覽器引擎發送命令。這意味著更低的延遲、更多的功能(多分頁、多來源、網路攔截),以及更少可能出錯的移動部件。
Cypress:瀏覽器內執行
Cypress 採取了根本不同的方法。它將自身注入瀏覽器內部,並在你的應用程式相同的 JavaScript 事件迴圈中執行測試程式碼。這就是為什麼 Cypress 在簡單測試中感覺如此快速的原因,因為測試與應用程式之間沒有網路開銷。但這種架構也解釋了 Cypress 的限制:不支援多分頁、跨來源測試受限,且僅限 JavaScript/TypeScript(因為測試必須在瀏覽器環境中執行)。
Selenium:WebDriver 中間層
Selenium 使用 WebDriver 協定。你的測試程式碼向瀏覽器驅動程式二進位檔(chromedriver, geckodriver)發送 HTTP 請求,這些驅動程式再將請求轉換為瀏覽器命令。每個命令都是一個往返過程:從測試到驅動程式再到瀏覽器,然後返回。這種間接性增加了延遲並創造了更多的失敗點。Selenium 正逐步採用 BiDi protocol 以減少此開銷,但尚未完全到位。
結論:Playwright 在架構上勝出。 直接的 WebSocket 通訊意味著更快的執行速度、更多的功能以及更少不穩定的失敗。Cypress 的瀏覽器內模型對於簡單的單一來源測試確實聰明,但它造成了 Playwright 所沒有的硬性上限。Selenium 的架構顯露出其老態。
語言與瀏覽器支援
這通常是第一個篩選條件。如果你的團隊不編寫 JavaScript,Cypress 立即出局。
| 類別 | Playwright | Cypress | Selenium |
|---|---|---|---|
| JavaScript / TypeScript | 是 | 是 | 是 |
| Python | 是 (官方) | 否 | 是 (官方) |
| Java | 是 (官方) | 否 | 是 (官方) |
| C# / .NET | 是 (官方) | 否 | 是 (官方) |
| Ruby | 否 | 否 | 是 (官方) |
| PHP | 否 | 否 | 是 (社群) |
| Kotlin | 否 | 否 | 是 (社群) |
| Chromium / Chrome | 是 (內建) | 是 | 是 (透過 chromedriver) |
| Firefox | 是 (內建) | 是 | 是 (透過 geckodriver) |
| WebKit / Safari | 是 (內建,跨平台) | 實驗性 | 是 (僅限 macOS,透過 SafariDriver) |
| Edge | 是 (基於 Chromium) | 是 | 是 |
| IE | 否 | 否 | 是 |
這在實務上意味著什麼?如果你是一家擁有 20 名 QA 工程師的 Java 公司,Cypress 根本不是選項,絕對不行。如果跨瀏覽器測試包含 Safari 很重要(確實重要,Safari 佔全球瀏覽器市佔率約 18%),Playwright 可在任何作業系統上開箱即用處理此事,而 Cypress 仍將 WebKit 支援標記為「實驗性」。
Selenium 在廣度上獲勝。它支援比任何其他替代方案更多的語言和瀏覽器。但對於 2026 年最重要的語言和瀏覽器——JavaScript/TypeScript、Python 以及 Chromium/Firefox/WebKit 組合,Playwright 以零設定和內建瀏覽器二進位檔涵蓋了一切。
結論:Selenium 在廣度上獲勝(最多語言、最多瀏覽器,包括 IE)。Playwright 在實用覆蓋面上獲勝,涵蓋 2026 年重要的瀏覽器和語言,且內建並零設定。Cypress 是選項最窄的一個。
編寫測試:並排程式碼比較
理論夠多了。以下是用三個框架編寫的相同測試。在這裡你能感受到開發者體驗 (DX) 的差異。
登入流程測試
標準的登入測試:導航至頁面、填寫憑證、提交,並驗證重定向。
// Playwright
import { test, expect } from '@playwright/test';
test('user can log in', async ({ page }) => {
await page.goto('/login');
await page.locator('#email').fill('[email protected]');
await page.locator('#password').fill('s3cureP@ss');
await page.locator('button[type="submit"]').click();
await expect(page).toHaveURL('/dashboard');
await expect(page.locator('h1')).toContainText('Welcome');
});// Cypress
describe('Login', () => {
it('user can log in', () => {
cy.visit('/login');
cy.get('#email').type('[email protected]');
cy.get('#password').type('s3cureP@ss');
cy.get('button[type="submit"]').click();
cy.url().should('include', '/dashboard');
cy.get('h1').should('contain', 'Welcome');
});
});// Selenium (with WebDriver)
const { Builder, By, until } = require('selenium-webdriver');
describe('Login', function () {
let driver;
before(async () => {
driver = await new Builder().forBrowser('chrome').build();
});
after(async () => {
await driver.quit();
});
it('user can log in', async () => {
await driver.get('http://localhost:3000/login');
await driver.findElement(By.id('email')).sendKeys('[email protected]');
await driver.findElement(By.id('password')).sendKeys('s3cureP@ss');
await driver.findElement(By.css('button[type="submit"]')).click();
await driver.wait(until.urlContains('/dashboard'), 5000);
const heading = await driver.findElement(By.css('h1')).getText();
expect(heading).to.include('Welcome');
});
});注意其中的差異。Playwright 的 async/await 搭配 page.locator() 讀起來清晰,並在互動前自動等待元素可操作。Cypress 的鏈式 API (cy.get().type().click()) 簡潔且對於簡單流程確實令人愉悅。Selenium 需要明確等待 (driver.wait(until.urlContains(...)))、手動管理瀏覽器生命週期,以及更多的樣板程式碼。
API 模擬與網路攔截
這個情境揭示了更大的差距。攔截 API 呼叫、返回模擬資料,並驗證 UI 正確渲染。
// Playwright -- native network interception
test('shows mocked user list', async ({ page }) => {
await page.route('**/api/users', (route) => {
route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify([{ id: 1, name: 'Alice' }]),
});
});
await page.goto('/users');
await expect(page.locator('.user-card')).toHaveCount(1);
await expect(page.locator('.user-card')).toContainText('Alice');
});// Cypress -- native network interception
it('shows mocked user list', () => {
cy.intercept('GET', '/api/users', {
statusCode: 200,
body: [{ id: 1, name: 'Alice' }],
}).as('getUsers');
cy.visit('/users');
cy.wait('@getUsers');
cy.get('.user-card').should('have.length', 1);
cy.get('.user-card').should('contain', 'Alice');
});// Selenium -- no native network interception
// You need a separate proxy tool like BrowserMob Proxy
// or mock your API server directly. There is no built-in
// equivalent to page.route() or cy.intercept().
// Typical workaround: start a mock server before the test
const mockServer = require('./helpers/mock-server');
before(async () => {
await mockServer.start({ port: 4000 });
mockServer.stub('GET', '/api/users', [{ id: 1, name: 'Alice' }]);
});
it('shows mocked user list', async () => {
await driver.get('http://localhost:3000/users');
// ... assert using findElement
});這很重要。API 模擬對於可靠的 E2E 測試至關重要,Playwright 和 Cypress 都原生支援。Selenium 需要單獨的模擬伺服器或代理工具,意味著更多的基礎設施、更多的複雜性以及更多可能出錯的地方。
結論:Playwright 在程式碼清晰度和功能上獲勝。 其 async/await 語法在複雜情境下比 Cypress 的鏈式呼叫更清晰,且原生處理 API 模擬、多分頁和多來源。Cypress 在簡單的單頁流程上勝在簡潔,鏈式 API 確實令人愉悅。Selenium 最為冗長且需要最多的樣板程式碼。
Playwright vs Cypress vs Selenium:速度基準測試
「哪個更快?」是此比較中最常被搜尋的問題之一。以下是來自 Checkly 基準測試研究 和 BetterStack 測量數據 的實際數字,並經過交叉比對以確保一致性。
"Test Suite Execution Time (seconds)"
資料表
| "Framework" | "Execution Time" |
|---|---|
| "Playwright" | 4.5 |
| "Cypress" | 9.4 |
| "Selenium" | 14.5 |
Playwright 完成等效測試套件大約只需 4.5 秒,相比之下 Cypress 為 9.4 秒,Selenium 為 14.5 秒。這不是微小的差異,而是 2 倍和 3 倍的差距。
為什麼 Playwright 更快?有三個原因:WebSocket 通訊消除了 Selenium 所攜帶的 HTTP 開銷。Playwright 的瀏覽器上下文 (browser context) 模型無需啟動整個瀏覽器程序即可建立隔離的測試環境。而且其平行執行發生在框架層級,你不需要外部工具。
隨著測試套件變大,速度差距會擴大。Playwright 的瀏覽器上下文能有效擴展,因為它們共享單個瀏覽器程序。Selenium 為每個平行工作單元產生新的瀏覽器實例。Cypress 在其開源版本中序列運行測試,因此除非你付費使用 Cypress Cloud,否則不斷增長的套件意味著線性增長的執行時間。
一項遷移案例研究提供了具體數字:BigBinary 報告稱從 Cypress 切換到 Playwright 後測試執行時間減少了 89%,他們使用 Playwright 的分片功能將完整套件從 2 小時 27 分鐘降至 16 分鐘。
結論:Playwright 在速度上決定性獲勝。 它運行測試套件的速度比 Cypress 快 2 倍,比 Selenium 快 3 倍。由於 Playwright 的瀏覽器上下文模型比產生新瀏覽器實例更具擴展性,這一差距在大型套件中會擴大。
除錯與開發者體驗
這裡的情況變得微妙。Playwright 在技術上更優越,但 Cypress 擁有讓團隊保持忠誠的真正 DX 優勢。
互動式除錯
Cypress Test Runner 仍然是互動式除錯的黃金標準。你可以在真實瀏覽器中即時看到測試執行過程,具備時間旅行除錯功能,點擊命令日誌中的任何步驟即可查看該時刻的確切 DOM 狀態。對於除錯視覺回歸或佈局問題的前端開發人員來說,這很難被擊敗。老實說,這是 Cypress 整個工具包中單一最好的功能。
Playwright Trace Viewer 採取了不同的方法。它在測試運行期間記錄追蹤資訊,包括每一步的螢幕截圖、DOM 快照、網路請求和控制台日誌。事後你在基於瀏覽器的檢視器中打開這些追蹤資訊。對於 CI 除錯(找出為何測試在无頭管道中失敗),Trace Viewer 實際上比 Cypress 的互動式運行器更有用,因為你無需在本機重現即可獲得完整上下文。
Playwright 的 --ui 模式在最近版本中添加了更接近 Cypress Test Runner 的互動體驗,但尚未那麼精緻。它是實用的,而非令人愉悅的。
Selenium IDE 存在但功能有限。大多數 Selenium 除錯依賴 console.log 和螢幕截圖。它可行,但感覺像回到 2012 年。
TypeScript 優先開發
Playwright 是 TypeScript 優先。它隨附自動生成的類型,其設定檔預設為 playwright.config.ts,且 VS Code 自動補全運作完美。當你輸入 page. 並觸發自動補全時,你會獲得帶有完整類型簽名的每個方法。
Cypress 支援 TypeScript,但存在一些摩擦點。自訂命令需要手動類型宣告(擴展 Cypress.Chainable 介面),且鏈式 API 有時會混淆 TypeScript 推論。cypress.config.ts 檔案可行,但 DX 並不那麼順暢。
與 Playwright 的原生體驗相比,Selenium 的 TypeScript 支援是社群努力成果,感覺像是後來加上去的。
結論:Cypress 在互動式 DX 上獲勝,其 Test Runner 對於除錯視覺測試的前端開發人員來說確實令人愉悅。Playwright 在 CI 除錯和 TypeScript 上獲勝,Trace Viewer 專為診斷无頭 CI 環境中的失敗而設計,且其 TypeScript 支援是同類中最佳的。Selenium 的除錯體驗最弱。
CI/CD 整合與平行化
這是見真章的地方。你的測試套件每天在 CI 中運行數百次,而不是在你的筆記型電腦上。以下是每個框架的 GitHub Actions 設定範例,你可以直接複製貼上,這是 Google 首頁競爭對手所未提供的。
GitHub Actions 設定
# Playwright -- built-in parallelization, zero cost
name: Playwright Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
shard: [1/4, 2/4, 3/4, 4/4]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test --shard=${{ matrix.shard }}
- uses: actions/upload-artifact@v4
if: failure()
with:
name: playwright-report-${{ matrix.shard }}
path: playwright-report/# Cypress -- parallel requires Cypress Cloud (paid)
name: Cypress Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
containers: [1, 2, 3, 4]
steps:
- uses: actions/checkout@v4
- uses: cypress-io/github-action@v6
with:
record: true
parallel: true
group: 'CI'
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}# Selenium -- requires browser service container
name: Selenium Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
selenium:
image: selenium/standalone-chrome:latest
ports:
- 4444:4444
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- run: npm ci
- run: npm test
env:
SELENIUM_REMOTE_URL: http://localhost:4444/wd/hub平行化:免費 vs 付費
上述 Playwright 設定使用 --shard=1/4 將測試套件分割到 4 個平行分片中。10 分鐘的套件可在 2.5 分鐘內完成。零成本。无需雲端服務。
Cypress 的免費 Starter 方案現在包含平行化,但每月限制 500 次測試結果,大多數團隊在一兩天的積極開發中就會耗盡。對於嚴肅的 CI 使用,你需要 Cypress Cloud(團隊方案年繳起始價為 $67/月,每年 12 萬次結果)或社群替代方案如 sorry-cypress。上述 YAML 中的 record: true 和 parallel: true 標誌需要連接 Cypress Cloud。
Selenium 平行化需要 Selenium Grid(自託管,運維開銷)或 BrowserStack 等雲端供應商。這是三者中最複雜的設定。
結論:Playwright 在 CI/CD 上獲勝。 免費、無限的平行化且零基礎設施是很難擊敗的。Cypress 的免費層級包含平行化但限制每月 500 次結果,真正團隊需要付費方案。Selenium 需要最多的運維工作。
成本與定價分析
這是整個 SERP 中針對此關鍵字最大的內容缺口。每個競爭對手都跳過它,但成本很重要,特別是在規模化時。
授權與定價層級
| 功能 | Playwright | Cypress (免費) | Cypress Cloud Team | Cypress Cloud Business | Selenium + Grid |
|---|---|---|---|---|---|
| 授權 | MIT (免費) | MIT (免費) | $67/月 (年繳) | $267/月 (年繳) | Apache 2.0 (免費) |
| 平行執行 | 內建 | 是 (每月限制 500 次結果) | 是 (每年 12 萬次結果) | 是 (無限) | 自託管 Grid |
| 測試結果儀表板 | HTML 報告器 (免費) | 無 | 是 (每年 12 萬次結果) | 是 (無限) | 第三方工具 |
| 不穩定檢測 | 內建重試 | 基本重試 | 是 | 是 | 無 |
| 測試分析 | 內建報告 | 無 | 有限 | 完整 | 第三方工具 |
| 規格優先級 | 無 | 無 | 無 | 是 | 無 |
按團隊規模劃分的實際成本
| 團隊規模 | Playwright | Cypress (含 Cloud Team) | Selenium (含 BrowserStack) |
|---|---|---|---|
| 獨立開發者 | $0 | $0 (免費層級) | $0 (本機) |
| 5 人團隊 | $0 | $67/月 ($804/年) | ~$150/月 ($1,800/年) |
| 20 人 QA 團隊 | $0 | $267/月 ($3,204/年) | ~$600/月 ($7,200/年) |
| 企業 (50+) | $0 | 客製化 (Enterprise) | 客製化 (BrowserStack/Sauce Labs) |
Playwright 對 Cypress 收費的所有功能都是免費的。 平行化、透過 HTML 報告器的測試分析、用於除錯的追蹤檢視器、用於測試 scaffolding 的程式碼生成,全部包含在零成本中。Playwright 唯一不提供的是具有團隊協作功能的託管雲端儀表板,而對於許多團隊來說,內建的 HTML 報告和 CI 工件已經足夠。
Selenium 也是免費的,但大規模運行 Selenium Grid 的基礎設施成本不容小覷。你的團隊中必須有人維護這些 Grid 節點、處理瀏覽器版本更新,並除錯基礎設施故障。
結論:Playwright 在成本上獲勝,這甚至沒有懸念。 Cypress 透過付費牆鎖定的每個功能(平行化、測試分析、不穩定檢測),Playwright 都免費提供。Selenium 在工具層級是免費的,但基礎設施帳單會累積。
元件測試
元件測試 允許你孤立地掛載單個 React、Vue 或 Angular 元件並進行測試,而無需啟動完整的應用程式。Cypress 開創了這種方法,這是今天選擇 Cypress 的最強理由之一。
Cypress 擁有針對 React (18-19)、Vue 3、Angular (18-21) 和 Svelte 5 的一流元件測試。你使用與 E2E 測試中相同的 cy.mount() API 和相同的 Test Runner。文件成熟,生態系統穩固,且運作可靠。對於希望使用單一工具進行元件和 E2E 測試的團隊來說,Cypress 的元件測試是一個真正的差異化因素。
Playwright 在最近版本中添加了實驗性元件測試,支援 React、Vue 和 Svelte。它是實用的,但不如 Cypress 的實現精緻。如果元件測試是第一天的優先事項,Cypress 具有優勢。但 Playwright 的快速發布節奏(每月)意味著這一差距正在縮小。
Selenium 沒有元件測試支援。它在瀏覽器層級運作,而非元件層級。如果你需要在 Selenium E2E 測試旁邊進行元件測試,你將使用單獨的工具如 React Testing Library 或 Vitest。
結論:Cypress 在元件測試上獲勝,它開創了這種方法,擁有最成熟的實現,並涵蓋最廣泛的框架範圍。Playwright 是強有力的第二名。Selenium 在此不是競爭者。
社群、生態系統與採用趨勢
數字講述了一個故事。Playwright 在 2024 年中期左右在 npm 下載量上超越了 Cypress,而到了 2026 年 2 月,差距相當大:Playwright 每週下載量大約為 3,000 萬次,而 Cypress 為 650 萬次,Selenium WebDriver 為 180 萬次。
"Weekly npm Downloads (thousands)"
資料表
| "Quarter" | "Playwright" | "Cypress" | "Selenium WebDriver" |
|---|---|---|---|
| "Q1 2024" | 8000 | 6500 | 2200 |
| "Q3 2024" | 14000 | 6600 | 2100 |
| "Q1 2025" | 19000 | 6500 | 2000 |
| "Q3 2025" | 25000 | 6400 | 1900 |
| "Q1 2026" | 30000 | 6500 | 1800 |
GitHub 星星數遵循類似模式:截至 2026 年 2 月,Playwright 約為 82,800,Cypress 為 49,461,Selenium 為 33,769。State of JavaScript 調查 始終將 Playwright 排在開發者滿意度和興趣的最高位。
但 npm 僅講述 JavaScript 的故事。Selenium 的真正安裝基礎跨越 Java、Python、C# 和 Ruby 生態系統,npm 下載量不適用。在 Java 企業世界中,Selenium 仍然是佔絕對優勢的框架。
為什麼 Playwright 增長如此之快?Microsoft 的支持使其擁有穩定的每月發布和長期穩定性。TypeScript 優先設計符合前端開發的發展方向。免費平行化消除了 Cypress Cloud 定價造成的摩擦。多語言支援意味著 Python 和 Java 團隊可以從 Selenium 遷移而無需切換語言。
Cypress 在絕對意義上並未衰退,下載量 plateau 在每週 6-700 萬次左右。但隨著 Playwright 吸收新專案以及 Cypress/Selenium 遷移,其相對份額正在縮小。
結論:Playwright 在勢頭上獲勝。 它擁有最快的增長、最高的開發者滿意度和最強的軌跡。Selenium 在安裝基礎上獲勝。Cypress 保留了一個忠實的社群,但其增長已趨於平緩。
遷移指南:切換框架
如果你考慮切換,以下是實用的翻譯指南。
Cypress 到 Playwright:API 翻譯
// BEFORE: Cypress login test
describe('Login', () => {
it('logs in successfully', () => {
cy.visit('/login');
cy.get('#email').type('[email protected]');
cy.get('#password').type('password123');
cy.get('form').submit();
cy.url().should('include', '/dashboard');
});
});// AFTER: Same test in Playwright
import { test, expect } from '@playwright/test';
test('logs in successfully', async ({ page }) => {
await page.goto('/login');
await page.locator('#email').fill('[email protected]');
await page.locator('#password').fill('password123');
await page.locator('form').evaluate(form => form.submit());
await expect(page).toHaveURL(/dashboard/);
});關鍵翻譯:cy.visit() 變為 page.goto()。cy.get() 變為 page.locator()。cy.intercept() 變為 page.route()。cy.wait('@alias') 變為 page.waitForResponse()。Cypress 的隱式鏈式變為顯式的 async/await。
Selenium 到 Playwright:API 翻譯
// BEFORE: Selenium login test
const { Builder, By, until } = require('selenium-webdriver');
async function loginTest() {
const driver = await new Builder().forBrowser('chrome').build();
try {
await driver.get('http://localhost:3000/login');
await driver.findElement(By.id('email')).sendKeys('[email protected]');
await driver.findElement(By.id('password')).sendKeys('password123');
await driver.findElement(By.css('form')).submit();
await driver.wait(until.urlContains('/dashboard'), 10000);
} finally {
await driver.quit();
}
}// AFTER: Same test in Playwright
import { test, expect } from '@playwright/test';
test('logs in successfully', async ({ page }) => {
await page.goto('/login');
await page.locator('#email').fill('[email protected]');
await page.locator('#password').fill('password123');
await page.locator('form').evaluate(form => form.submit());
await expect(page).toHaveURL(/dashboard/);
});最大的區別?Playwright 為你處理瀏覽器生命週期和自動等待。不再需要在 finally 區塊中使用 driver.quit()。不再需要 driver.wait(until.urlContains(...), 10000),Playwright 會自動等待導航。移除所有隱式和顯式等待;Playwright 的自動等待取代了它們。
遷移檢查清單
- 審核現有測試套件,計算測試數量,識別自訂命令 (Cypress) 或複雜等待邏輯 (Selenium)
- 在當前框架旁邊安裝 Playwright,在過渡期間在 CI 中同時運行兩者
- 逐步翻譯測試,從最簡單、最高價值的測試開始
- 用頁面對象或 fixtures 替換自訂命令,Cypress 自訂命令沒有 1:1 的 Playwright 等效項
- 更新 CI 設定,添加 Playwright 的分片設定,如果適用則移除 Cypress Cloud 金鑰
- 平行運行兩個框架 1-2 個衝刺以捕捉回歸
- 棄用舊框架,一旦所有測試遷移完成且穩定
典型的 200 個測試的 Cypress 套件可以由一名工程師在 1-2 個衝刺內遷移。 Selenium 到 Playwright 的遷移花費稍長時間,因為 Selenium 測試往往具有需要重新思考的更複雜等待邏輯。如果你正在遷移,Playwright 是 2026 年 90% 團隊選擇的目標。 遷移本身很直接,最困難的部分通常是自訂 Cypress 命令或複雜的 Selenium 等待邏輯。
特定技術棧建議:React、Next.js 及更多
通用的「視情況而定」建議是無用的。以下是基於使用這些框架构建生產應用程式經驗,針對特定技術棧的選擇建議。
| 技術棧 | 最佳選擇 | 第二名 | 原因 |
|---|---|---|---|
| React / Next.js | Playwright | Cypress | Next.js 擁有 官方 Playwright 整合。API 路由測試、伺服器元件測試和免費平行化使 Playwright 成為明顯的選擇。 |
| Vue / Nuxt | Playwright 或 Cypress | , | 真正的平手。Cypress 擁有成熟的 Vue 元件測試。Playwright 在 E2E 方面表現出色。沒有錯誤的選擇。 |
| Angular | Playwright | Selenium | Angular 的官方建議現在包括 Playwright 作為 Protractor 棄用後的現代替代方案之一。 |
| Java / Python 後端 | Playwright 或 Selenium | , | 如果團隊擁有 Selenium 專業知識,請保留它。否則,Playwright 的多語言綁定使其成為自然的替代方案。 |
| 傳統企業 (IE 支援) | Selenium | , | 唯一的選項。Playwright 放棄了 IE。Cypress 從未支援過。 |
如果你的團隊正在使用 Next.js 構建並評估框架,我們的 Next.js vs Remix 比較 涵蓋了框架架構如何影響你的測試策略。Playwright 原生測試 API 路由和伺服器元件的能力使其在 Next.js 生態系統中特別強大。
2026 年的 AI 輔助測試
AI 輔助測試 不再是假設,GitHub Copilot、Cursor 和 Claude Code 等工具每天為數千名開發人員生成測試程式碼。框架選擇影響這些工具的運作效果。
Playwright 擁有最佳的 AI 相容性。其 TypeScript 優先 API 具有強大的類型定義,意味著 AI 助手生成更準確的測試程式碼。結構化的 async/await 模式比 Cypress 的鏈式更容易讓 LLM 推理。而且 Playwright 自己的 npx playwright codegen 工具記錄瀏覽器互動並生成完整的測試文件,具有智能定位器選擇,無需 AI 訂閱。
Cypress 與 AI 工具配合 reasonably well。其聲明式鏈式 API 簡潔且在訓練數據中得到充分代表。但 cy. 命名空間和自訂命令模式可能會絆倒程式碼生成,產生看起來正確但因 Cypress 特定怪癖而失敗的測試。
Selenium 是 AI 輔助測試的最弱匹配。冗長的樣板程式碼、具有不同 API 的多種語言綁定,以及 Java/Python/JS 之間不一致的模式,意味著 AI 生成的 Selenium 程式碼需要最多的手動清理。
不要誇大 AI 在此的作用,它是生產力倍增器,而非測試設計的替代品。但如果你的團隊使用 AI 編碼助手(2026 年大多數團隊都使用),Playwright 產生最可靠的生成測試。
結論:Playwright 在 AI 輔助測試生成上獲勝。 其類型化 API 和結構化模式與現代 AI 編碼助手配合產生最佳結果。
決策框架:你應該選擇哪個工具?
這是你來這裡尋找的部分。具體情境,具體建議。
| 如果你的專案需要... | 選擇 | 原因 | 替代方案 |
|---|---|---|---|
| 最佳整體 E2E 框架 | Playwright | 最快、功能最強大、免費、強大的社群 | Cypress (如果 DX 至關重要) |
| 前端互動式除錯 | Cypress | Test Runner 的時間旅行除錯無與倫比 | Playwright (UI 模式正在改進) |
| 多語言團隊 (Java/Python/C#) | Playwright | 4 種語言的官方綁定 | Selenium (最廣泛的語言支援) |
| 預算敏感團隊 | Playwright | 一切皆為 $0,包括平行化 | Selenium (免費但基礎設施成本) |
| 元件測試優先 | Cypress | 最成熟的元件測試實現 | Playwright (實驗性) |
| 企業級 Java/Python 商店 | Selenium 或 Playwright | 現有投資很重要;如果遷移則選 Playwright | , |
| 獨立前端開發者 | Cypress 或 Playwright | Cypress 上手最快;Playwright 功能更強大 | , |
| 需要 Safari/WebKit 測試 | Playwright | 一流的 WebKit 支援,跨平台 | Selenium (僅限 macOS 的 Safari) |
| 需要傳統 IE 支援 | Selenium | 唯一的選項 | , |
| 最快的 CI/CD 管道 | Playwright | 免費分片,最快執行 | , |
| 從 Selenium 遷移的團隊 | Playwright | 最容易的遷移路徑,大多數團隊的目標 | , |
| 20+ 人 QA 團隊 | Playwright | 無需付費服務即可擴展 | Selenium (如果已投資) |
何時不使用每個工具
- 不要選擇 Playwright,如果你的整個團隊深入了解 Cypress,擁有廣泛的自訂命令,且沒有痛點。遷移成本存在,「更新」並不意味著「更适合你的情況」。
- 不要選擇 Cypress,如果你需要多語言支援、多分頁測試或大規模免費平行執行。這些是架構限制,而非路線圖上的功能。
- 不要為新的 JavaScript/TypeScript 專案選擇 Selenium。Playwright 和 Cypress 為 JS 團隊提供顯著更好的 DX、速度和可靠性。
Techsy 如何進行測試自動化
在 Techsy,我們已在數十個生產環境 Web 應用程式上實施 E2E 測試。這是我們的實際流程:
-
新專案預設使用 Playwright。其速度、免費平行化和 TypeScript 優先 DX 與我們的 Next.js/React 技術棧相符。我們與功能一起編寫 E2E 測試,不是在衝刺結束後,也不是「當我們有時間時」,而是作為完成定義的一部分。
-
當客戶團隊擁有現有 Cypress 基礎設施且遷移不合理時使用 Cypress。我們不會為了遷移而推動團隊遷移。如果 Cypress 運作良好且團隊富有生產力,我們幫助他們充分利用它。
-
當維護負擔超過遷移成本時幫助團隊從 Selenium 遷移,這發生的頻率比你想像的要高。Selenium 套件往往會在多年間累積複雜的等待邏輯和脆弱的選擇器。
我們典型的測試技術棧:Playwright 用於 E2E,React Testing Library 用於元件級測試,GitHub Actions 用於 CI。這種組合以最小的工具複雜性覆蓋了完整的測試金字塔。
需要幫助為你的 Web 應用程式設置自動化測試嗎?我們的團隊在 React、Next.js 和 Node.js 專案中實施 Playwright 和 Cypress 測試。獲取免費測試諮詢。
最終結論
| 類別 | 獲勝者 | 備註 |
|---|---|---|
| 速度 | Playwright | 比 Cypress 快 2 倍,比 Selenium 快 3 倍 |
| 瀏覽器支援 | Playwright | 跨平台內建 Chromium、Firefox 和 WebKit |
| 語言支援 | Selenium | 最多語言(6+ 官方綁定) |
| DX / 除錯 | Cypress | 互動式 Test Runner 仍然是最佳的除錯體驗 |
| CI/CD 整合 | Playwright | 透過分片免費平行化,零基礎設施 |
| 成本 | Playwright | 一切皆為 $0。Cypress Cloud 起始價 $67/月 |
| 元件測試 | Cypress | 對 React、Vue、Angular、Svelte 的一流支援 |
| 社群增長 | Playwright | 每週約 3,000 萬次 npm 下載,約 82.8K GitHub 星星 |
| TypeScript DX | Playwright | TypeScript 優先設計,最佳自動補全和類型安全 |
| 遷移目標 | Playwright | 2026 年 90% 遷移團隊的選擇 |
| AI 相容性 | Playwright | 類型化 API 產生最可靠的 AI 生成測試 |
| 整體 (2026) | Playwright | 速度、功能、成本和社群的最佳平衡 |
對於 2026 年開始新專案的大多數團隊,Playwright 是預設選擇。 它是最快、功能最強大且完全免費的。它在上述表格的 12 個類別中贏得了 9 個。
但預設並非普遍適用。Cypress 仍然是重視互動式除錯和元件測試,且能忍受其架構限制的前端團隊的正確選擇。Selenium 對於擁有現有測試基礎設施的 Java/Python 企業環境以及日益罕見的 IE 支援需求案例仍然至關重要。
最糟糕的決定是分析癱瘓。評估你的團隊語言、瀏覽器需求、CI 預算和除錯偏好。選擇一個。開始編寫測試。你以後總是可以在遷移,正如我們上面所示,遷移路徑已有詳細記錄。
來源
- Playwright 文件
- Cypress Cloud 定價
- npm Trends, Playwright vs Cypress vs Selenium
- Checkly, 速度比較基準測試
- Next.js, 使用 Playwright 測試
- State of JavaScript 2024 -- 測試庫
- BigBinary, 為什麼我們從 Cypress 切換到 Playwright
Playwright vs Cypress vs Selenium:常見問題
Playwright 比 Cypress 更好嗎?
對於 2026 年的大多數團隊,是的。Playwright 更快(基準測試中快 2 倍),支援更多瀏覽器和語言,擁有免費平行化,以及更好的 TypeScript 支援。Cypress 在互動式除錯 DX 和元件測試成熟度上獲勝。如果這兩件事是你的首要任務,Cypress 仍然是一個強有力的選擇。
Playwright 正在取代 Selenium 嗎?
在 JavaScript/TypeScript 生態系統中,很大程度上是的。Playwright 的 npm 下載量大約是 Cypress 的 4.5 倍,Selenium WebDriver 的 17 倍。但 Selenium 在 Java 和 Python 企業環境中仍然佔主導地位,那裡的多語言支援和數十年的生態系統工具至關重要。Selenium 沒有死,它正在縮小到其利基市場。
哪個更快,Playwright 還是 Cypress?
Playwright 運行測試套件的速度大約快 2 倍,在可比基準測試中為 4.5 秒 對 9.4 秒。隨著套件變大,差距會擴大,因為 Playwright 的瀏覽器上下文模型比 Cypress 的程序模型更有效率。一個團隊報告稱遷移後總 CI 時間減少了 89%。
Cypress 支援 Safari 嗎?
Cypress 擁有實驗性 WebKit 支援,但不被認為是生產就緒的。Playwright 將 WebKit(Safari 的渲染引擎)作為一流的、完全支援的瀏覽器包含在內,可在任何作業系統上運行。如果 Safari 測試對你的用戶至關重要,Playwright 是更安全的选择。
Selenium 在 2026 年死了吗?
沒有。Selenium 仍然是全球部署最廣泛的 E2E 框架,特別是在 Java 和 Python 生態系統中。它是 IE/傳統瀏覽器測試的唯一選項。但對於新的 JavaScript/TypeScript 專案,Playwright 和 Cypress 在每個實用指標上都是更好的選擇。
Playwright 可以測試移動應用程式嗎?
Playwright 可以模擬移動瀏覽器(Android 的 Chrome,透過 WebKit 的 iOS Safari),具有準確的視口、觸控和用戶代理模擬。它無法自動化原生移動應用程式。對於原生應用程式測試,你需要 Appium(使用 Selenium 的 WebDriver 協定)或專門的移動測試框架如 Detox。
我應該先學習 Playwright 還是 Cypress?
如果你是 2026 年 E2E 測試的新手,從 Playwright 開始。它擁有最強的增長軌跡、最全面的功能集,且技能可轉移到任何 JavaScript/TypeScript 專案。如果你的團隊已經使用 Cypress 或者互動式除錯是你的主要關注點,Cypress 值得學習。
Playwright 的缺點是什麼?
Playwright 的互動式除錯體驗不如 Cypress 的 Test Runner 精緻(儘管 Playwright UI 模式正在縮小差距)。其元件測試不如 Cypress 成熟。而且其快速的每月發布節奏意味著 API 表面經常變化,你需要跟上更新。
Cypress Cloud 的成本是多少?
Cypress Cloud 的團隊方案起始價為 $67/月(年繳),每年 120,000 次測試結果,商業方案無限結果則為 $267/月。企業定價為客製化。Playwright 免費提供等效功能,包括平行化、透過 HTML 報告器的測試分析,以及透過重試的不穩定檢測。
哪個 E2E 框架與 GitHub Actions 配合最好?
三者都與 GitHub Actions 配合,但 Playwright 需要的設定最少。Playwright 的官方 Docker 映像和內建分片 (--shard=1/4) 使 CI 設定成為單個 YAML 文件。Cypress 需要其官方 GitHub Action 和 Cypress Cloud 訂閱以進行平行化。Selenium 需要瀏覽器驅動程式的服務容器。
Playwright 適用於 Java 或 Python 嗎?
是的。Playwright 擁有由 Microsoft 維護的官方 Java、Python、C# 和 JavaScript/TypeScript 綁定。Cypress 僅限 JavaScript/TypeScript。這使得 Playwright 成為希望擁有現代工具而不切換語言的非 JS 團隊引人注目的 Selenium 替代方案。
如何從 Selenium 遷移到 Playwright?
首先在安装 Playwright 的同時保留 Selenium。逐步翻譯測試:page.locator() 替換 driver.findElement(),page.goto() 替換 driver.get(),並且你可以移除所有顯式等待,因為 Playwright 會自動等待。更新你的 CI 設定,在過渡期間平行運行兩個框架,然後在所有測試通過後棄用 Selenium。典型的 200 個測試套件需要一名工程師 1-2 個衝刺。