發行說明
版本 1.47
Network 頁籤改進
UI 模式和追蹤檢視器中的 Network 頁籤有幾個不錯的改進:
- 按資產類型和 URL 過濾
- 更好地顯示查詢字串參數
- 字體資產預覽
--tsconfig
CLI 選項
預設情況下,Playwright 將使用啟發式方法查找每個匯入文件的最近 tsconfig。您現在可以在命令列中指定一個 tsconfig 文件,Playwright 將對所有匯入文件使用它,而不僅僅是測試文件:
# Pass a specific tsconfig
npx playwright test --tsconfig tsconfig.test.json
APIRequestContext 現在接受 URLSearchParams
和 string
作為查詢參數
您現在可以將 URLSearchParams
和 string
作為查詢參數傳遞給 APIRequestContext:
test('query params', async ({ request }) => {
const searchParams = new URLSearchParams();
searchParams.set('userId', 1);
const response = await request.get(
'https://jsonplaceholder.typicode.com/posts',
{
params: searchParams // or as a string: 'userId=1'
}
);
// ...
});
雜項
mcr.microsoft.com/playwright:v1.47.0
現在提供基於 Ubuntu 24.04 Noble 的 Playwright 映像。要使用基於 22.04 jammy 的映像,請改用mcr.microsoft.com/playwright:v1.47.0-jammy
。- 在 page.removeAllListeners()、browser.removeAllListeners() 和 browserContext.removeAllListeners() 中新增了
behavior
選項,以等待正在進行的監聽器完成。 - 現在可以通過將
cert
和key
作為緩衝區傳遞,而不是文件路徑,從記憶體中傳遞 TLS 客戶端證書。 - 現在可以在 HTML 報告中的新分頁中打開
text/html
內容類型的附件。這對於在 Playwright 測試報告中包含第三方報告或其他 HTML 內容並將其分發給您的團隊非常有 用。 - locator.selectOption() 中的
noWaitAfter
已被棄用。 - 我們已經看到 Webkit 中的 WebGL 在 GitHub Actions
macos-13
上表現不正常的報告。我們建議將 GitHub Actions 升級到macos-14
。
瀏覽器版本
- Chromium 129.0.6668.29
- Mozilla Firefox 130.0
- WebKit 18.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 128
- Microsoft Edge 128
版本 1.46
TLS Client Certificates
Playwright 現在允許您提供客戶端證書,以便伺服器可以根據 TLS 客戶端驗證來驗證它們。
以下程式碼片段設定用於 https://example.com
的客戶端憑證:
import { defineConfig } from '@playwright/test';
export default defineConfig({
// ...
use: {
clientCertificates: [{
origin: 'https://example.com',
certPath: './cert.pem',
keyPath: './key.pem',
passphrase: 'mysecretpassword',
}],
},
// ...
});
你也可以將客戶端證書提供給特定的test project或作為browser.newContext()和apiRequest.newContext()的參數。
--only-changed
cli option
新的 CLI 選項 --only-changed
只會執行自上次 git 提交或特定 git "ref" 以來已更改的測試檔案。這也會執行所有匯入任何已更改檔案的測試檔案。
# Only run test files with uncommitted changes
npx playwright test --only-changed
# Only run test files changed relative to the "main" branch
npx playwright test --only-changed=main
元件測試: 新的 router
fixture
此次發佈引入了一個實驗性的 router
固定裝置,用於攔截和處理元件測試中的網路請求。有兩種使用 router 固定裝置的方法:
- 呼叫
router.route(url, handler)
,其行為類似於 page.route()。 - 呼叫
router.use(handlers)
並傳遞 MSW 函式庫 的請求處理器給它。
這裡是一個在測試中重複使用現有 MSW 處理器的範例。
import { handlers } from '@src/mocks/handlers';
test.beforeEach(async ({ router }) => {
// install common handlers before each test
await router.use(...handlers);
});
test('example test', async ({ mount }) => {
// test as usual, your handlers are active
// ...
});
此裝置僅在元件測試中可用。
UI Mode / Trace Viewer Updates
- 測試註釋現在顯示在 UI 模式中。
- 文字附件的內容現在會在附件窗格中內嵌顯示。
- 新設定可顯示/隱藏路由操作,如 route.continue()。
- 請求方法和狀態顯示在網路詳細資訊標籤中。
- 新按鈕可將來源檔案位置複製到剪貼簿。
- Metadata 窗格現在顯示
baseURL
。
雜項
- 新的
maxRetries
選項在 apiRequestContext.fetch(),當ECONNRESET
網路錯誤時會重試。 - 新選項來 封裝一個 fixture,以最小化 fixture 在測試報告和錯誤訊息中的曝光。
- 新選項來提供一個 自訂 fixture 標題,用於測試報告和錯誤訊息中。
瀏覽器版本
- Chromium 128.0.6613.18
- Mozilla Firefox 128.0
- WebKit 18.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 127
- Microsoft Edge 127
版本 1.45
時鐘
利用新的 Clock API 允許在測試中操作和控制時間,以驗證與時間相關的行為。此 API 涵蓋許多常見情境,包括:
- 使用預定義時間進行測試;
- 保持一致的時間和計時器;
- 監控不活動狀態;
- 手動計時。
// Initialize clock and let the page load naturally.
await page.clock.install({ time: new Date('2024-02-02T08:00:00') });
await page.goto('http://localhost:3333');
// Pretend that the user closed the laptop lid and opened it again at 10am,
// Pause the time once reached that point.
await page.clock.pauseAt(new Date('2024-02-02T10:00:00'));
// Assert the page state.
await expect(page.getByTestId('current-time')).toHaveText('2/2/2024, 10:00:00 AM');
// Close the laptop lid again and open it at 10:30am.
await page.clock.fastForward('30:00');
await expect(page.getByTestId('current-time')).toHaveText('2/2/2024, 10:30:00 AM');
請參閱時鐘指南以獲取更多資訊。
測試執行器
-
新的 CLI 選項
--fail-on-flaky-tests
,在任何不穩定的測試時將退出碼設置 為1
。請注意,預設情況下,當所有失敗的測試在重試後恢復時,測試運行器會以退出碼0
退出。使用此選項,在這種情況下測試運行將失敗。 -
新的環境變量
PLAYWRIGHT_FORCE_TTY
控制內建的list
、line
和dot
報告器是否假設為即時終端。例如,當您的 CI 環境無法很好地處理 ANSI 控制序列時,這可能有助於停用 tty 行為。或者,如果您計劃後處理輸出並處理控制序列,即使沒有即時終端,也可以啟用 tty 行為。# 避免輸出 ANSI 控制序列的 TTY 功能
PLAYWRIGHT_FORCE_TTY=0 npx playwright test
# 啟用 TTY 功能,假設終端寬度為 80
PLAYWRIGHT_FORCE_TTY=80 npx playwright test -
新選項 testConfig.respectGitIgnore 和 testProject.respectGitIgnore 控制在搜索測試時是否排除匹配
.gitignore
模式的文件。 -
新屬性
timeout
現在可用於自定義的 expect 匹配器。此屬性考慮playwright.config.ts
和expect.configure()
。import { expect as baseExpect } from '@playwright/test';
export const expect = baseExpect.extend({
async toHaveAmount(locator: Locator, expected: number, options?: { timeout?: number }) {
// 當未指定 timeout 選項時,使用配置的超時時間。
const timeout = options?.timeout ?? this.timeout;
// ... 實現斷言 ...
},
});
雜項
-
方法 locator.setInputFiles() 現在支援上傳目錄,適用於
<input type=file webkitdirectory>
元素。await page.getByLabel('Upload directory').setInputFiles(path.join(__dirname, 'mydir'));
-
多個方法如 locator.click() 或 locator.press() 現在支援
ControlOrMeta
修改鍵。此鍵在 macOS 上對應Meta
,在 Windows 和 Linux 上對應Control
。// 按下常用的鍵盤快捷鍵 Control+S 或 Meta+S 來觸發 "儲存" 操作。
await page.keyboard.press('ControlOrMeta+S'); -
在 apiRequest.newContext() 中新增屬性
httpCredentials.send
,允許總是發送Authorization
標頭或僅在回應401 Unauthorized
時發送。 -
在 apiRequestContext.dispose() 中新增選項
reason
,此選項將包含於因上下文釋放而中斷的進行中操作的錯誤訊息中。 -
在 browserType.launchServer() 中新增選項
host
,允許接受指定地址上的 websocket 連接,而不是未指定的0.0.0.0
。 -
Playwright 現在支援 Ubuntu 24.04 上的 Chromium、Firefox 和 WebKit。
-
v1.45 是 macOS 12 Monterey 收到 WebKit 更新的最後一個版本。請更新 macOS 以繼續使用最新的 WebKit。
瀏覽器版本
- Chromium 127.0.6533.5
- Mozilla Firefox 127.0
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 126
- Microsoft Edge 126
版本 1.44
新的 API
無障礙聲明
-
expect(locator).toHaveAccessibleName() 檢查元素是否具有指定的可存取名稱:
const locator = page.getByRole('button');
await expect(locator).toHaveAccessibleName('Submit'); -
expect(locator).toHaveAccessibleDescription() 檢查元素是否具有指定的可存取描述:
const locator = page.getByRole('button');
await expect(locator).toHaveAccessibleDescription('Upload a photo'); -
expect(locator).toHaveRole() 檢查元素是否具有指定的 ARIA 角色:
const locator = page.getByTestId('save-button');
await expect(locator).toHaveRole('button');
定位器處理程式
- 執行使用 page.addLocatorHandler() 添加的處理程式後,Playwright 現在將等待觸發處理程式的覆蓋層不再可見。你可以使用新的
noWaitAfter
選項選擇退出此行為。 - 你可以在 page.addLocatorHandler() 中使用新的
times
選項來指定處理程式應該執行的最大次數。 - page.addLocatorHandler() 中的處理程式現在接受定位器作為參數。
- 新的 page.removeLocatorHandler() 方法用於移除先前添加的定位器處理程式。
const locator = page.getByText('This interstitial covers the button');
await page.addLocatorHandler(locator, async overlay => {
await overlay.locator('#close').click();
}, { times: 3, noWaitAfter: true });
// Run your tests that can be interrupted by the overlay.
// ...
await page.removeLocatorHandler(locator);
其他選項
-
multipart
選項在apiRequestContext.fetch()
中現在接受FormData
並支援具有相同名稱的重複欄位。const formData = new FormData();
formData.append('file', new File(['let x = 2024;'], 'f1.js', { type: 'text/javascript' }));
formData.append('file', new File(['hello'], 'f2.txt', { type: 'text/plain' }));
context.request.post('https://example.com/uploadFiles', {
multipart: formData
}); -
expect(callback).toPass({ intervals })
現在可以在 testConfig.expect 中全域配置expect.toPass.intervals
選項或在 testProject.expect 中按專案配置。 -
expect(page).toHaveURL(url)
現在支援ignoreCase
選項。 -
testProject.ignoreSnapshots 允許按專案配置是否跳過截圖期望。
Reporter API
- 新方法 suite.entries() 以聲明順序返回子測試套件和測試案例。suite.type 和 testCase.type 可用於區分列表中的測試案例和套件。
- Blob 報告器現在允許使用單一選項
outputFile
覆蓋報告文件路徑。相同的選項也可以指定為PLAYWRIGHT_BLOB_OUTPUT_FILE
環境變數,這在 CI/CD 上可能更方便。 - JUnit 報告器現在支持
includeProjectInTestName
選項。
命令列
-
--last-failed
CLI 選項,用於只執行上一次失敗的測試。首先執行所有測試:
$ npx playwright test
執行 103 個測試,使用 5 個工作者
...
2 個失敗
[chromium] › my-test.spec.ts:8:5 › two ─────────────────────────────────────────────────────────
[chromium] › my-test.spec.ts:13:5 › three ──────────────────────────────────────────────────────
101 個通過 (30.0s)現在修復失敗的測試並再次使用
--last-failed
選項執行 Playwright:$ npx playwright test --last-failed
執行 2 個測試,使用 2 個工作者
2 個通過 (1.2s)
瀏覽器版本
- Chromium 125.0.6422.14
- Mozilla Firefox 125.0.1
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 124
- Microsoft Edge 124
版本 1.43
新的 API
-
方法 browserContext.clearCookies() 現在支援過濾器,只移除部分 cookies。
// 清除所有 cookies。
await context.clearCookies();
// 新增: 清除具有特定名稱的 cookies。
await context.clearCookies({ name: 'session-id' });
// 新增: 清除特定域名的 cookies。
await context.clearCookies({ domain: 'my-origin.com' }); -
新模式
retain-on-first-failure
用於 testOptions.trace。在此模式下,trace 會在每次測試的第一次執行時記錄,但不會在重試時記錄。當測試執行失敗時,trace 檔案 會被保留,否則會被移除。import { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
trace: 'retain-on-first-failure',
},
}); -
新屬性 testInfo.tags 在測試執行期間暴露測試標籤。
test('example', async ({ page }) => {
console.log(test.info().tags);
}); -
新方法 locator.contentFrame() 將 Locator 物件轉換為 FrameLocator。當你已經獲得一個 Locator 物件,並且稍後希望與框架內的內容互動時,這會很有用。
const locator = page.locator('iframe[name="embedded"]');
// ...
const frameLocator = locator.contentFrame();
await frameLocator.getByRole('button').click(); -
新方法 frameLocator.owner() 將 FrameLocator 物件轉換為 Locator。當你已經獲得一個 FrameLocator 物件,並且稍後希望與
iframe
元素互動時,這會很有用。const frameLocator = page.frameLocator('iframe[name="embedded"]');
// ...
const locator = frameLocator.owner();
await expect(locator).toBeVisible();
UI Mode Updates
- 查看測試清單中的標籤。
- 輸入
@fast
或點擊標籤本身以標籤過濾。 - 新增快捷鍵:
- "F5" 執行測試。
- "Shift F5" 停止執行測試。
- "Ctrl `" 切換測試輸出。
瀏覽器版本
- Chromium 124.0.6367.8
- Mozilla Firefox 124.0
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 123
- Microsoft Edge 123
版本 1.42
新的 API
- 新方法 page.addLocatorHandler() 註冊了一個回呼,當指定的元素變得可見時將會被呼叫並可能阻止 Playwright 操作。回呼可以去除覆蓋層。這裡有一個範例,當 cookie 對話框出現時將其關閉:
// Setup the handler.
await page.addLocatorHandler(
page.getByRole('heading', { name: 'Hej! You are in control of your cookies.' }),
async () => {
await page.getByRole('button', { name: 'Accept all' }).click();
});
// Write the test as usual.
await page.goto('https://www.ikea.com/');
await page.getByRole('link', { name: 'Collection of blue and white' }).click();
await expect(page.getByRole('heading', { name: 'Light and easy' })).toBeVisible();
expect(callback).toPass()
timeout 現在可以透過expect.toPass.timeout
選項在全域或在專案設定中配置- electronApplication.on('console') 事件在 Electron 主程序呼叫 console API 方法時觸發。
electronApp.on('console', async msg => {
const values = [];
for (const arg of msg.args())
values.push(await arg.jsonValue());
console.log(...values);
});
await electronApp.evaluate(() => console.log('hello', 5, { foo: 'bar' }));
- 新語法 用於為測試添加標籤(測試標題中的 @-符號仍然支持):
test('test customer login', {
tag: ['@fast', '@login'],
}, async ({ page }) => {
// ...
});
使用 --grep
命令列選項來僅執行具有特定標籤的測試。
npx playwright test --grep @fast
--project
命令列標 誌 現在支援 '*' 萬用字元:
npx playwright test --project='*mobile*'
- 新語法 用於測試註釋:
test('test full report', {
annotation: [
{ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/23180' },
{ type: 'docs', description: 'https://playwright.dev/docs/test-annotations#tag-tests' },
],
}, async ({ page }) => {
// ...
});
- page.pdf() 接受兩個新選項
tagged
和outline
。
公告
- ⚠️ Ubuntu 18 已不再支援。
瀏覽器版本
- Chromium 123.0.6312.4
- Mozilla Firefox 123.0
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 122
- Microsoft Edge 123
版本 1.41
新的 API
- 新方法 page.unrouteAll() 移除所有由 page.route() 和 page.routeFromHAR() 註冊的路由。可選擇等待正在進行的路由完成,或忽略來自它們的任何錯誤。
- 新方法 browserContext.unrouteAll() 移除所有由 browserContext.route() 和 browserContext.routeFromHAR() 註冊的路由。可選擇等待正在進行的路由完成,或忽略來自它們的任何錯誤。
- 新選項
style
在 page.screenshot() 和 locator.screenshot() 中,允許在截圖前向頁面添加自定義 CSS。 - 新選項
stylePath
用於方法 expect(page).toHaveScreenshot() 和 expect(locator).toHaveScreenshot(),在截圖時應用自定義樣式表。 - 新選項
fileName
用於 Blob reporter,指定要建立的報告名稱。
瀏覽器版本
- Chromium 121.0.6167.57
- Mozilla Firefox 121.0
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 120
- Microsoft Edge 120
版本 1.40
測試程式碼產生器更新
產生斷言的新工具:
- "Assert visibility" 工具生成 expect(locator).toBeVisible()。
- "Assert value" 工具生成 expect(locator).toHaveValue()。
- "Assert text" 工具生成 expect(locator).toContainText()。
這裡是一個帶有斷言的生成測試範例:
import { test, expect } from '@playwright/test';
test('test', async ({ page }) => {
await page.goto('https://playwright.dev/');
await page.getByRole('link', { name: 'Get started' }).click();
await expect(page.getByLabel('Breadcrumbs').getByRole('list')).toContainText('Installation');
await expect(page.getByLabel('Search')).toBeVisible();
await page.getByLabel('Search').click();
await page.getByPlaceholder('Search docs').fill('locator');
await expect(page.getByPlaceholder('Search docs')).toHaveValue('locator');
});
新的 API
- 選項
reason
在 page.close(), browserContext.close() 和 browser.close()。關閉原因會報告所有因關閉而中斷的操作。 - 選項
firefoxUserPrefs
在 browserType.launchPersistentContext()。
其他變更
- 方法 download.path() 和 download.createReadStream() 在下載失敗和取消時會拋出錯誤。
- Playwright docker image 現在附帶 Node.js v20。
瀏覽器版本
- Chromium 120.0.6099.28
- Mozilla Firefox 119.0
- WebKit 17.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 119
- Microsoft Edge 119
版本 1.39
將自訂匹配器添加到你的 expect
你可以透過提供自訂匹配器來擴展 Playwright 斷言。這些匹配器將可用於 expect 物件。
import { expect as baseExpect } from '@playwright/test';
export const expect = baseExpect.extend({
async toHaveAmount(locator: Locator, expected: number, options?: { timeout?: number }) {
// ... see documentation for how to write matchers.
},
});
test('pass', async ({ page }) => {
await expect(page.getByTestId('cart')).toHaveAmount(5);
});
請參閱完整範例文件。
合併測試夾具
您現在可以合併來自多個檔案或模組的測試夾具:
import { mergeTests } from '@playwright/test';
import { test as dbTest } from 'database-test-utils';
import { test as a11yTest } from 'a11y-test-utils';
export const test = mergeTests(dbTest, a11yTest);
import { test } from './fixtures';
test('passes', async ({ database, page, a11y }) => {
// use database and a11y fixtures.
});
合併自訂 expect 比對器
現在你可以合併來自多個檔案或模組的自訂 expect 比對器:
import { mergeTests, mergeExpects } from '@playwright/test';
import { test as dbTest, expect as dbExpect } from 'database-test-utils';
import { test as a11yTest, expect as a11yExpect } from 'a11y-test-utils';
export const test = mergeTests(dbTest, a11yTest);
export const expect = mergeExpects(dbExpect, a11yExpect);
import { test, expect } from './fixtures';
test('passes', async ({ page, database }) => {
await expect(database).toHaveDatabaseUser('admin');
await expect(page).toPassA11yAudit();
});
隱藏實作細節: box 測試步驟
你可以將 test.step() 標記為 "boxed",以便其中的錯誤指向步驟呼叫位置。
async function login(page) {
await test.step('login', async () => {
// ...
}, { box: true }); // Note the "box" option here.
}
Error: Timed out 5000ms waiting for expect(locator).toBeVisible()
... error details omitted ...
14 | await page.goto('https://github.com/login');
> 15 | await login(page);
| ^
16 | });
請參閱 test.step() 文件以獲取完整範例。
新的 API
瀏覽器版本
- Chromium 119.0.6045.9
- Mozilla Firefox 118.0.1
- WebKit 17.4
此 版本也針對以下穩定頻道進行了測試:
- Google Chrome 118
- Microsoft Edge 118
版本 1.38
UI Mode Updates
- 放大時間範圍。
- 網路面板重新設計。
新的 API
- browserContext.on('weberror')
- locator.pressSequentially()
- The reporter.onEnd() now reports
startTime
and total runduration
.
棄用
- 以下方法已被棄用: page.type(), frame.type(), locator.type() 和 elementHandle.type()。請改用 locator.fill(),其速度更快。僅在頁面上有特殊鍵盤處理且需要逐個按鍵時,才使用 locator.pressSequentially()。
重大變更: Playwright 不再自動下載瀏覽器
注意: 如果你正在使用
@playwright/test
套件, 這個變更不會影響你。
Playwright 建議使用 @playwright/test
套件並通過 npx playwright install
命令下載瀏覽器。如果你遵循這個建議,對你來說沒有任何改變。
然而,直到 v1.38,安裝 playwright
套件而不是 @playwright/test
確實會自動下載瀏覽器。現在情況不再如此,我們建議通過 npx playwright install
命令顯式下載瀏覽器。
v1.37 及更早版本
playwright
套件在 npm install
期間下載瀏覽器,而 @playwright/test
則沒有。
v1.38 及之後
playwright
和 @playwright/test
套件在 npm install
時不會下載瀏覽器。
推薦遷移
執行 npx playwright install
在 npm install
之後下載瀏覽器。例如,在你的 CI 配置中:
- run: npm ci
- run: npx playwright install --with-deps
替代遷移選項 - 不推薦
添加 @playwright/browser-chromium
、@playwright/browser-firefox
和 @playwright/browser-webkit
作為相依套件。這些套件會在 npm install
時下載相應的瀏覽器。請確保所有 Playwright 套件的版本保持同步:
// package.json
{
"devDependencies": {
"playwright": "1.38.0",
"@playwright/browser-chromium": "1.38.0",
"@playwright/browser-firefox": "1.38.0",
"@playwright/browser-webkit": "1.38.0"
}
}
瀏覽器版本
- Chromium 117.0.5938.62
- Mozilla Firefox 117.0
- WebKit 17.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 116
- Microsoft Edge 116
版本 1.37
新的 npx playwright merge-reports
工具
如果你在多個分片上執行測試,現在可以使用新的 merge-reports
CLI 工具將所有報告合併到單一 HTML 報告(或任何其他報告)中。
使用 merge-reports
工具需要以下步驟:
-
在 CI 上執行時,將新的 "blob" reporter 添加到 config 中:
playwright.config.tsexport default defineConfig({
testDir: './tests',
reporter: process.env.CI ? 'blob' : 'html',
});"blob" reporter 將生成包含所有測試執行資訊的 ".zip" 文件。
-
將所有 "blob" 報告複製到單一共享位置並執行
npx playwright merge-reports
:
npx playwright merge-reports --reporter html ./all-blob-reports
閱讀更多在 我們的文件。
📚 Debian 12 Bookworm 支援
Playwright 現在支援 Debian 12 Bookworm(x86_64 和 arm64)上的 Chromium、Firefox 和 WebKit。如遇到任何問題,請告訴我們!
Linux 支援看起來像這樣:
Ubuntu 20.04 | Ubuntu 22.04 | Debian 11 | Debian 12 | |
---|---|---|---|---|
Chromium | ✅ | ✅ | ✅ | ✅ |
WebKit | ✅ | ✅ | ✅ | ✅ |
Firefox | ✅ | ✅ | ✅ | ✅ |
UI Mode Updates
- UI Mode 現在會遵守專案相依性。您可以通過在專案列表中勾選/取消勾選來控制要遵守的相依性。
- 測試的控制台日誌現在顯示在控制台標籤中。
瀏覽器版本
- Chromium 116.0.5845.82
- Mozilla Firefox 115.0
- WebKit 17.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 115
- Microsoft Edge 115
版本 1.36
🏝️ 夏季維護版本發佈。
瀏覽器版本
- Chromium 115.0.5790.75
- Mozilla Firefox 115.0
- WebKit 17.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 114
- Microsoft Edge 114
版本 1.35
重點
-
UI mode is now available in VSCode Playwright extension via a new "Show trace viewer" button:
-
UI mode and trace viewer mark network requests handled with page.route() and browserContext.route() handlers, as well as those issued via the API testing:
-
New option
maskColor
for methods page.screenshot(), locator.screenshot(), expect(page).toHaveScreenshot() and expect(locator).toHaveScreenshot() to change default masking color:await page.goto('https://playwright.dev');
await expect(page).toHaveScreenshot({
mask: [page.locator('img')],
maskColor: '#00FF00', // green
}); -
New
uninstall
CLI command to uninstall browser binaries:$ npx playwright uninstall # remove browsers installed by this installation
$ npx playwright uninstall --all # remove all ever-install Playwright browsers -
Both UI mode and trace viewer now could be opened in a browser tab:
$ npx playwright test --ui-port 0 # open UI mode in a tab on a random port
$ npx playwright show-trace --port 0 # open trace viewer in tab on a random port
⚠️ 重大變更
-
playwright-core
二進位檔已從playwright
重新命名為playwright-core
。所以如果你使用playwright-core
CLI,請確保更新名稱:$ npx playwright-core install # 使用 playwright-core 時安裝瀏覽器的新方式
此變更 不會 影響
@playwright/test
和playwright
套件使用者。
瀏覽器版本
- Chromium 115.0.5790.13
- Mozilla Firefox 113.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 114
- Microsoft Edge 114
版本 1.34
重點
-
UI Mode 現在顯示步驟、fixtures 和附件:
-
新屬性 testProject.teardown 用於指定需要在此專案和所有相依專案完成後執行的專案。Teardown 用於清理此專案獲取的任何資源。
一個常見的模式是具有相應
teardown
的setup
相依性:playwright.config.tsimport { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'setup',
testMatch: /global.setup\.ts/,
teardown: 'teardown',
},
{
name: 'teardown',
testMatch: /global.teardown\.ts/,
},
{
name: 'chromium',
use: devices['Desktop Chrome'],
dependencies: ['setup'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
dependencies: ['setup'],
},
{
name: 'webkit',
use: devices['Desktop Safari'],
dependencies: ['setup'],
},
],
}); -
新方法
expect.configure
用於建立預先配置的 expect 實例,具有其自己的預設值,如timeout
和soft
。const slowExpect = expect.configure({ timeout: 10000 });
await slowExpect(locator).toHaveText('Submit');
// 總是進行軟性斷言。
const softExpect = expect.configure({ soft: true }); -
新選項
stderr
和stdout
在 testConfig.webServer 中配置輸出處理:playwright.config.tsimport { defineConfig } from '@playwright/test';
export default defineConfig({
// 在開始測試之前運行本地開發伺服器
webServer: {
command: 'npm run start',
url: 'http://127.0.0.1:3000',
reuseExistingServer: !process.env.CI,
stdout: 'pipe',
stderr: 'pipe',
},
}); -
新的 locator.and() 用於建立同時匹配兩個定位器的定位器。
const button = page.getByRole('button').and(page.getByTitle('Subscribe'));
-
新事件 browserContext.on('console') 和 browserContext.on('dialog') 用於訂閱來自給定瀏覽器上下文的任何頁面的對話框和控制台訊息。使用新方法 consoleMessage.page() 和 dialog.page() 來確定事件來源。
⚠️ 重大變更
-
npx playwright test
如果你安裝了playwright
和@playwright/test
兩者將不再有效。沒有必要同時安裝兩者,因為你可以直接從@playwright/test
導入瀏覽器自動化 API:automation.tsimport { chromium, firefox, webkit } from '@playwright/test';
/* ... */ -
Node.js 14 不再受支援,因為它在 2023 年 4 月 30 日達到生命週期終點。
瀏覽器版本
- Chromium 114.0.5735.26
- Mozilla Firefox 113.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 113
- Microsoft Edge 113
版本 1.33
定位器更新
-
使用 locator.or() 建立一個符合任一定位器的定位器。考慮一個情境,你想點擊 "New email" 按鈕,但有時會彈出安全設定對話框。在這種情況下,你可以等待 "New email" 按鈕或對話框並相應地操作:
const newEmail = page.getByRole('button', { name: 'New email' });
const dialog = page.getByText('Confirm security settings');
await expect(newEmail.or(dialog)).toBeVisible();
if (await dialog.isVisible())
await page.getByRole('button', { name: 'Dismiss' }).click();
await newEmail.click(); -
在 locator.filter() 中使用新的選項
hasNot
和hasNotText
來找到不符合某些條件的元素。const rowLocator = page.locator('tr');
await rowLocator
.filter({ hasNotText: 'text in column 1' })
.filter({ hasNot: page.getByRole('button', { name: 'column 2 button' }) })
.screenshot(); -
使用新的 web-first 斷言 expect(locator).toBeAttached() 確保元素存在於頁面的 DOM 中。不要與 expect(locator).toBeVisible() 混淆,後者確保元素既已附加又可見。
新的 API
- locator.or()
- 新選項
hasNot
在 locator.filter() - 新選項
hasNotText
在 locator.filter() - expect(locator).toBeAttached()
- 新選項
timeout
在 route.fetch() - reporter.onExit()
⚠️ 重大變更
mcr.microsoft.com/playwright:v1.33.0
現在提供基於 Ubuntu Jammy 的 Playwright 映像。要使用基於 focal 的映像,請改用mcr.microsoft.com/playwright:v1.33.0-focal
。
瀏覽器版本
- Chromium 113.0.5672.53
- Mozilla Firefox 112.0
- WebKit 16.4
此版本也針對以下穩定頻道進行 了測試:
- Google Chrome 112
- Microsoft Edge 112
版本 1.32
準備推出 UI 模式 (預覽)
新的 UI Mode 讓你可以探索、執行和除錯測試。內建監看模式。
與新標誌 --ui
互動:
npx playwright test --ui
新的 API
- 新選項
updateMode
和updateContent
在 page.routeFromHAR() 和 browserContext.routeFromHAR()。 - 鏈接現有的定位器物件,詳情請參見 定位器文件。
- 新屬性 testInfo.testId。
- 方法 tracing.startChunk() 中的新選項
name
。
⚠️ 元件測試中的重大變更
注意: 僅限元件測試, 不影響端到端測試。
@playwright/experimental-ct-react
現在僅支援 React 18。- 如果你正在使用 React 16 或 17 進行元件測試,請將
@playwright/experimental-ct-react
替換為@playwright/experimental-ct-react17
。
瀏覽器版本
- Chromium 112.0.5615.29
- Mozilla Firefox 111.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 111
- Microsoft Edge 111
版本 1.31
新的 API
-
新屬性 testProject.dependencies 用於配置專案之間的相依性。
使用相依性允許全域設定產生追蹤和其他工件,請參閱測試報告中的設定步驟等。
playwright.config.tsimport { defineConfig } from '@playwright/test';
export default defineConfig({
projects: [
{
name: 'setup',
testMatch: /global.setup\.ts/,
},
{
name: 'chromium',
use: devices['Desktop Chrome'],
dependencies: ['setup'],
},
{
name: 'firefox',
use: devices['Desktop Firefox'],
dependencies: ['setup'],
},
{
name: 'webkit',
use: devices['Desktop Safari'],
dependencies: ['setup'],
},
],
}); -
新的斷言 expect(locator).toBeInViewport() 確保定位器指向與視口相交的元素,根據 intersection observer API。
const button = page.getByRole('button');
// 確保元素的至少一部分與視口相交。
await expect(button).toBeInViewport();
// 確保元素完全在視口外。
await expect(button).not.toBeInViewport();
// 確保元素至少有一半與視口相交。
await expect(button).toBeInViewport({ ratio: 0.5 });
雜項
- 現在可以在單獨的視窗中打開追蹤檢視器中的 DOM 快照。
- 新方法
defineConfig
用於playwright.config
。 - 方法 route.fetch() 的新選項
Route.fetch.maxRedirects
。 - Playwright 現在支援 Debian 11 arm64。
- 官方 docker images 現在包含 Node 18 而 不是 Node 16。
⚠️ 元件測試中的重大變更
注意: 僅限元件測試, 不影響端到端測試。
playwright-ct.config
設定檔案用於component testing 現在需要呼叫 defineConfig
。
// Before
import { type PlaywrightTestConfig, devices } from '@playwright/experimental-ct-react';
const config: PlaywrightTestConfig = {
// ... config goes here ...
};
export default config;
將 config
變數定義替換為 defineConfig
呼叫:
// After
import { defineConfig, devices } from '@playwright/experimental-ct-react';
export default defineConfig({
// ... config goes here ...
});
瀏覽器版本
- Chromium 111.0.5563.19
- Mozilla Firefox 109.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 110
- Microsoft Edge 110
版本 1.30
瀏覽器版本
- Chromium 110.0.5481.38
- Mozilla Firefox 108.0.2
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 109
- Microsoft Edge 109
版本 1.29
新的 API
-
新方法 route.fetch() 和 route.fulfill() 的新選項
json
:await page.route('**/api/settings', async route => {
// 獲取原始設定。
const response = await route.fetch();
// 強制設定主題為預定義值。
const json = await response.json();
json.theme = 'Solorized';
// 使用修改後的資料完成。
await route.fulfill({ json });
}); -
新方法 locator.all() 用於遍歷所有匹配的元素:
// 檢查所有的複選框!
const checkboxes = page.getByRole('checkbox');
for (const checkbox of await checkboxes.all())
await checkbox.check(); -
locator.selectOption() 現在可以通過值或標籤匹配:
<select multiple>
<option value="red">Red</div>
<option value="green">Green</div>
<option value="blue">Blue</div>
</select>await element.selectOption('Red');
-
重試程式碼塊直到所有斷言通過:
await expect(async () => {
const response = await page.request.get('https://api.example.com');
await expect(response).toBeOK();
}).toPass();在 我們的文件 中閱讀更多資訊。
-
測試失敗時自動捕獲全頁截圖:
playwright.config.tsimport { defineConfig } from '@playwright/test';
export default defineConfig({
use: {
screenshot: {
mode: 'only-on-failure',
fullPage: true,
}
}
});
雜項
- Playwright Test 現在遵循
jsconfig.json
。 - 新選項
args
和proxy
用於 androidDevice.launchBrowser()。 - 方法中的選項
postData
route.continue() 現在支援 Serializable 值。
瀏覽器版本
- Chromium 109.0.5414.46
- Mozilla Firefox 107.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 108
- Microsoft Edge 108
版本 1.28
Playwright 工具
- 在 VSCode 中於游標處記錄。 你可以執行測試,將游標定位在測試結束處並繼續生成測試。
- VSCode 中的即時定位器。 你可以在 VSCode 中懸停並編輯定位器,以在打開的瀏覽器中高亮顯示它們。
- CodeGen 中的即時定位器。 使用 "Explore" 工具為頁面上的任何元素生成定位器。
- 程式碼產生器和 Trace Viewer 深色主題。 自動從作業系統設定中獲取。
測試執行器
-
配置重試次數和測試超時時間,使用 test.describe.configure() 為文件或測試設定。
// 文件中的每個測試將重試兩次,並有 20 秒的超時時間。
test.describe.configure({ retries: 2, timeout: 20_000 });
test('runs first', async ({ page }) => {});
test('runs second', async ({ page }) => {}); -
使用 testProject.snapshotPathTemplate 和 testConfig.snapshotPathTemplate 來配置控制由 expect(page).toHaveScreenshot() 和 expect(value).toMatchSnapshot() 生成的快照位置的模板。
playwright.config.tsimport { defineConfig } from '@playwright/test';
export default defineConfig({
testDir: './tests',
snapshotPathTemplate: '{testDir}/__screenshots__/{testFilePath}/{arg}{ext}',
});
新的 API
瀏覽器版本
- Chromium 108.0.5359.29
- Mozilla Firefox 106.0
- WebKit 16.4
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 107
- Microsoft Edge 107
版本 1.27
定位器
使用這些新的 API,寫定位器是一種樂趣:
- page.getByText() 根據文本內容定位。
- page.getByRole() 根據 ARIA role、ARIA attributes 和 accessible name 定位。
- page.getByLabel() 根據關 聯標籤的文本定位表單控制項。
- page.getByTestId() 根據
data-testid
屬性(其他屬性可配置)定位元素。 - page.getByPlaceholder() 根據佔位符定位輸入框。
- page.getByAltText() 根據文本替代內容(通常是圖像)定位元素。
- page.getByTitle() 根據標題定位元素。
await page.getByLabel('User Name').fill('John');
await page.getByLabel('Password').fill('secret-password');
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.getByText('Welcome, John!')).toBeVisible();
所有相同的方法也可在 Locator、FrameLocator 和 Frame 類別上使用。
其他亮點
-
workers
選項在playwright.config.ts
中現在接受百分比字串來使用部分可用的 CPU。你也可以在命令列中傳遞它:npx playwright test --workers=20%
-
html reporter 的新選項
host
和port
。import { defineConfig } from '@playwright/test';
export default defineConfig({
reporter: [['html', { host: 'localhost', port: '9223' }]],
}); -
新欄位
FullConfig.configFile
可供測試 reporter 使用,指定 config 檔案的路徑(如果有的話)。 -
如 v1.25 中所宣布,Ubuntu 18 將於 2022 年 12 月起不再支援。除此之外,從下一個 Playwright 版本開始,Ubuntu 18 上將不再有 WebKit 更新。
行為變更
-
expect(locator).toHaveAttribute() with an empty value does not match missing attribute anymore. 例如, 當
button
沒有disabled
屬性時,以下程式碼 片段將會成功。await expect(page.getByRole('button')).toHaveAttribute('disabled', '');
-
命令列選項
--grep
和--grep-invert
先前錯誤地忽略了在配置中指定的grep
和grepInvert
選項。現在它們會一起應用。
瀏覽器版本
- Chromium 107.0.5304.18
- Mozilla Firefox 105.0.1
- WebKit 16.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 106
- Microsoft Edge 106
版本 1.26
斷言
- 新選項
enabled
用於 expect(locator).toBeEnabled。 - expect(locator).toHaveText 現在可以穿透開放的 shadow roots。
- 新選項
editable
用於 expect(locator).toBeEditable。 - 新選項
visible
用於 expect(locator).toBeVisible。
其他亮點
- 新選項
maxRedirects
用於 apiRequestContext.get() 和其他函式以限制重定向次數。 - 新的命令列標誌
--pass-with-no-tests
允許在未找到檔案時測試套件通過。 - 新的命令列標誌
--ignore-snapshots
用於跳過快照期望,例如expect(value).toMatchSnapshot()
和expect(page).toHaveScreenshot()
。
行為變更
一堆 Playwright API 已經支援 waitUntil: 'domcontentloaded'
選項。例如:
await page.goto('https://playwright.dev', {
waitUntil: 'domcontentloaded',
});
在 1.26 之前,這會等待所有 iframes 觸發 DOMContentLoaded
事件。
為了符合網頁規範,'domcontentloaded'
值僅等待目標框架觸發 'DOMContentLoaded'
事件。使用 waitUntil: 'load'
來等待所有的 iframes。
瀏覽器版本
- Chromium 106.0.5249.30
- Mozilla Firefox 104.0
- WebKit 16.0
此版本也針對以下穩定頻道進行了測試:
- Google Chrome 105
- Microsoft Edge 105
版本 1.25
VSCode Extension
- 觀看你的測試即時執行 & 保持開發工具開啟。
- 選擇選擇器。
- 從當前頁面狀態記錄新測試。