1.1 Browser, Context, Page
Playwright의 실행 모델은 browser process, browser context, page 계층으로 나뉩니다.
- Browser: Chromium, Firefox, WebKit process와 연결
- BrowserContext: cookie, local storage, permission이 격리된 profile
- Page: context 안의 tab 또는 popup
Playwright Test의 기본 page fixture는 test마다 새 context와 page를 제공합니다. Browser process를 매번 다시 시작하지 않으면서 incognito와 비슷한 격리를 얻습니다.
import { test, expect } from '@playwright/test';
test('isolated page', async ({ page, context }) => {
await page.goto('/');
await expect(page).toHaveTitle(/Todo Lab/);
expect(page.context()).toBe(context);
});
여러 사용자 표현
한 test에서 admin과 user를 동시에 표현하려면 context를 두 개 만듭니다.
test('two users', async ({ browser }) => {
const admin = await browser.newContext();
const user = await browser.newContext();
const adminPage = await admin.newPage();
const userPage = await user.newPage();
// 서로 다른 cookie와 session을 사용합니다.
await admin.close();
await user.close();
});
Context는 가볍지만 무제한으로 만들면 browser memory와 file descriptor를 사용합니다. 직접 생성한 context는 finally 또는 fixture teardown에서 닫습니다.
참고: Test Isolation
초급 요약
Browser는 engine process, BrowserContext는 격리된 사용자 session, Page는 tab입니다. Test fixture의 page는 test마다 새 context 안에서 제공되므로 대부분 직접 browser를 launch할 필요가 없습니다.
Context를 두 개 만드는 실전 사례
test('admin과 user가 같은 문서를 본다', async ({ browser }) => {
const admin = await browser.newContext();
const user = await browser.newContext();
const adminPage = await admin.newPage();
const userPage = await user.newPage();
await Promise.all([adminPage.goto('/'), userPage.goto('/')]);
await admin.close();
await user.close();
});
같은 context 안에서 page만 두 개 만들면 동일 사용자에게 tab이 두 개인 것입니다. Multi-user test는 context가 두 개여야 합니다.
연습 문제
- Test 두 개에서 local storage key를 각각 설정하고 누출되지 않는지 확인합니다.
- 한 context에 page 두 개를 열어 storage가 공유되는지 확인합니다.
- Context 두 개에 서로 다른 locale과 timezone을 설정합니다.
- 직접 만든 context를 닫지 않았을 때 resource와 artifact에 어떤 영향이 있는지 기록합니다.
심화 체크
- Browser-level launch option과 context-level emulation option을 구분하는가?
- Parallel worker마다 browser process와 context 수가 어떻게 늘어나는지 추정했는가?
- Context 종료가 download, video, trace 저장 시점에 영향을 주는지 이해했는가?