context.close() は、ベストプラクティスとして明示的に呼ぶことが推奨されています。 page.close() は自動的に呼ばれるのでわざわざ呼ばなくてもOKです
// 省略していい await page.close();
await context.close();
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('/foo/bar');
await page.waitForTimeout(20000);
Reactなどで非同期に描画されるボタンは、タイミングによってクリックに失敗することがあります。
そんなときは expect().toPass() が便利です。
await expect(async () => {
await page.getByRole("button", { name: "保存" }).click();
}).toPass();
toPass() は、コールバック内の処理が成功するまで一定時間(1回目:100sec, 2回目:250sec, 3回目:500sec, 4回目以降:1000sec 間隔)リトライしてくれます。
そのため、
といったケースで、waitForTimeout() を書かずに安定したテストを書けます。
const h1 = page.locator('h1');
console.log(await h1.evaluate(el => el.outerHTML));
| Device | Orientation | Viewport | Scale | Mobile | Touch | Browser |
|---|---|---|---|---|---|---|
| Blackberry PlayBook | Portrait | 600 × 1024 | 1 | ✅ | ✅ | WebKit |
| Blackberry PlayBook | Landscape | 1024 × 600 | 1 | ✅ | ✅ | WebKit |
| BlackBerry Z30 | Portrait | 360 × 640 | 2 | ✅ | ✅ | WebKit |
| BlackBerry Z30 | Landscape | 640 × 360 | 2 | ✅ | ✅ | WebKit |
| Galaxy Note 3 | Portrait | 360 × 640 | 3 | ✅ | ✅ | WebKit |
| Galaxy Note 3 | Landscape | 640 × 360 | 3 | ✅ | ✅ | WebKit |
| Galaxy Note II | Portrait | 360 × 640 | 2 | ✅ | ✅ | WebKit |
| Galaxy Note II | Landscape | 640 × 360 | 2 | ✅ | ✅ | WebKit |
| Galaxy S III | Portrait | 360 × 640 | 2 | ✅ | ✅ | WebKit |
| Galaxy S III | Landscape | 640 × 360 | 2 | ✅ | ✅ | WebKit |
| Galaxy S5 | Portrait | 360 × 640 | 3 | ✅ | ✅ | Chromium |
| Galaxy S5 | Landscape | 640 × 360 | 3 | ✅ | ✅ | Chromium |
| Galaxy S8 | Portrait | 360 × 740 | 3 | ✅ | ✅ | Chromium |
| Galaxy S8 | Landscape | 740 × 360 | 3 | ✅ | ✅ | Chromium |
| Galaxy S9+ | Portrait | 320 × 658 | 4.5 | ✅ | ✅ | Chromium |
| Galaxy S9+ | Landscape | 658 × 320 | 4.5 | ✅ | ✅ | Chromium |
| Galaxy S24 | Portrait | 360 × 780 | 3 | ✅ | ✅ | Chromium |
| Galaxy S24 | Landscape | 780 × 360 | 3 | ✅ | ✅ | Chromium |
| Galaxy A55 | Portrait | 480 × 1040 | 2.25 | ✅ | ✅ | Chromium |
| Galaxy A55 | Landscape | 1040 × 480 | 2.25 | ✅ | ✅ | Chromium |
| Galaxy Tab S4 | Portrait | 712 × 1138 | 2.25 | ✅ | ✅ | Chromium |
| Galaxy Tab S4 | Landscape | 1138 × 712 | 2.25 | ✅ | ✅ | Chromium |
| Galaxy Tab S9 | Portrait | 640 × 1024 | 2.5 | ✅ | ✅ | Chromium |
| Galaxy Tab S9 | Landscape | 1024 × 640 | 2.5 | ✅ | ✅ | Chromium |
| Galaxy Z Fold 6 | Portrait | 928 × 1004 | 2 | ✅ | ✅ | Chromium |
| Galaxy Z Fold 6 Cover | Portrait | 484 × 1112 | 2 | ✅ | ✅ | Chromium |
| Galaxy Z Fold 7 | Portrait | 984 × 1016 | 2 | ✅ | ✅ | Chromium |
| Galaxy Z Fold 7 Cover | Portrait | 360 × 764 | 3 | ✅ | ✅ | Chromium |
| Galaxy Z Flip 6 | Portrait | 360 × 804 | 3 | ✅ | ✅ | Chromium |
| Galaxy Z Flip 6 Cover | Portrait | 360 × 298 | 2 | ✅ | ✅ | Chromium |
| Galaxy Z Flip 7 | Portrait | 360 × 764 | 3 | ✅ | ✅ | Chromium |
| Galaxy Z Flip 7 Cover | Portrait | 474 × 448 | 2 | ✅ | ✅ | Chromium |
| iPad (gen 5) | Portrait | 768 × 1024 | 2 | ✅ | ✅ | WebKit |
| iPad (gen 6) | Portrait | 768 × 1024 | 2 | ✅ | ✅ | WebKit |
| iPad (gen 7) | Portrait | 810 × 1080 | 2 | ✅ | ✅ | WebKit |
| iPad (gen 11) | Portrait | 656 × 944 | 2.5 | ✅ | ✅ | WebKit |
| iPad Mini | Portrait | 768 × 1024 | 2 | ✅ | ✅ | WebKit |
| iPad Pro 11 | Portrait | 834 × 1194 | 2 | ✅ | ✅ | WebKit |
| iPhone SE | Portrait | 320 × 568 | 2 | ✅ | ✅ | WebKit |
| iPhone SE (3rd gen) | Portrait | 375 × 667 | 2 | ✅ | ✅ | WebKit |
| iPhone 6 | Portrait | 375 × 667 | 2 | ✅ | ✅ | WebKit |
| iPhone 6 Plus | Portrait | 414 × 736 | 3 | ✅ | ✅ | WebKit |
| iPhone 7 | Portrait | 375 × 667 | 2 | ✅ | ✅ | WebKit |
| iPhone 7 Plus | Portrait | 414 × 736 | 3 | ✅ | ✅ | WebKit |
| iPhone 8 | Portrait | 375 × 667 | 2 | ✅ | ✅ | WebKit |
| iPhone 8 Plus | Portrait | 414 × 736 | 3 | ✅ | ✅ | WebKit |
| iPhone X | Portrait | 375 × 812 | 3 | ✅ | ✅ | WebKit |
| iPhone XR | Portrait | 414 × 896 | 3 | ✅ | ✅ | WebKit |
| iPhone 11 | Portrait | 414 × 715 | 2 | ✅ | ✅ | WebKit |
| iPhone 11 Pro | Portrait | 375 × 635 | 3 | ✅ | ✅ | WebKit |
| iPhone 11 Pro Max | Portrait | 414 × 715 | 3 | ✅ | ✅ | WebKit |
| iPhone 12 | Portrait | 390 × 664 | 3 | ✅ | ✅ | WebKit |
| iPhone 12 Mini | Portrait | 375 × 629 | 3 | ✅ | ✅ | WebKit |
| iPhone 12 Pro | Portrait | 390 × 664 | 3 | ✅ | ✅ | WebKit |
| iPhone 12 Pro Max | Portrait | 428 × 746 | 3 | ✅ | ✅ | WebKit |
| iPhone 13 | Portrait | 390 × 664 | 3 | ✅ | ✅ | WebKit |
| iPhone 13 Mini | Portrait | 375 × 629 | 3 | ✅ | ✅ | WebKit |
| iPhone 13 Pro | Portrait | 390 × 664 | 3 | ✅ | ✅ | WebKit |
| iPhone 13 Pro Max | Portrait | 428 × 746 | 3 | ✅ | ✅ | WebKit |
| iPhone 14 | Portrait | 390 × 664 | 3 | ✅ | ✅ | WebKit |
| iPhone 14 Plus | Portrait | 428 × 746 | 3 | ✅ | ✅ | WebKit |
| iPhone 14 Pro | Portrait | 393 × 660 | 3 | ✅ | ✅ | WebKit |
| iPhone 14 Pro Max | Portrait | 430 × 740 | 3 | ✅ | ✅ | WebKit |
| iPhone 15 | Portrait | 393 × 659 | 3 | ✅ | ✅ | WebKit |
| iPhone 15 Plus | Portrait | 430 × 739 | 3 | ✅ | ✅ | WebKit |
| iPhone 15 Pro | Portrait | 393 × 659 | 3 | ✅ | ✅ | WebKit |
| iPhone 15 Pro Max | Portrait | 430 × 739 | 3 | ✅ | ✅ | WebKit |
| iPhone 16 | Portrait | 393 × 659 | 3 | ✅ | ✅ | WebKit |
| iPhone 16 Plus | Portrait | 430 × 739 | 3 | ✅ | ✅ | WebKit |
| iPhone 16 Pro | Portrait | 402 × 681 | 3 | ✅ | ✅ | WebKit |
| iPhone 16 Pro Max | Portrait | 440 × 763 | 3 | ✅ | ✅ | WebKit |
| iPhone 16e | Portrait | 390 × 651 | 3 | ✅ | ✅ | WebKit |
| iPhone 17 | Portrait | 402 × 681 | 3 | ✅ | ✅ | WebKit |