- Published on
Playwright 기초
- Authors
- Name
- Justart
NOTE
1. 시작
playwright.config.ts
파일의 projects에서 테스트 할 브라우저를 설정할 수 있다.
Playwright VSCode
라고 마이크로소프트에서 만든 익스텐션이 있다. 설치를 하면 유용하게 디버깅을 할 수 있다. 꼭 설치하자.
2. 기초 예제
2-1. 네비게이션 테스트
import { test, expect } from '@playwright/test'
test('홈 화면에서 MyPicks 메뉴 클릭 하면, myPicks 페이지 이동하고, 이동 된 페이지의 제목이 "추천 링크 모음" 이 된다.', async ({
page,
}) => {
const startUrl = 'http://localhost:3000'
const headingText = '추천 링크 모음'
const title = /추천 링크 모음/
await page.goto(startUrl)
await page.getByRole('link', { name: 'MyPicks' }).click()
await expect(page).toHaveURL(`${startUrl}/myPicks`)
await expect(page.getByRole('heading', { name: headingText, level: 1 })).toBeVisible()
await expect(page).toHaveTitle(title)
})
TIP
name에 aria-label
을 사용해도 된다.
getByRole
에서 heading
과 level
의 조합으로 h1
태그를 찾는 것이다.
만약 h2
를 타겟팅 하려면, level: 2
로 설정하면 된다.
2-2. 버튼 테스트
test('다크 모드 테마로 전환 이후에도 계속 테마가 유지되어야 한다.', async ({ page }) => {
const startUrl = 'http://localhost:3000'
// 1. 홈페이지 접속
await test.step('1. 홈페이지에 접속합니다', async () => {
await page.goto(startUrl)
await expect(page).toHaveURL(startUrl)
})
// 2. 다크 모드 버튼 찾기
await test.step('2. 다크 모드 전환 버튼을 찾습니다', async () => {
const themeButton = page.getByRole('button', { name: 'Theme switcher' })
await expect(themeButton).toBeVisible()
// 테마 전환 버튼 클릭
await themeButton.click()
})
// 3. 다크 모드 옵션 선택
await test.step('3. 다크 모드 옵션을 선택합니다', async () => {
// 다크 모드 옵션 버튼 찾기 (aria-label이나 텍스트로 찾기)
const darkModeOption = page.getByRole('menuitem', { name: /dark/i })
await expect(darkModeOption).toBeVisible()
// 다크 모드 클릭
await darkModeOption.click()
// 테마 전환 애니메이션 대기
await page.waitForTimeout(500)
})
// 4. 다크 모드 적용 확인
await test.step('4. 다크 모드가 적용되었는지 확인합니다', async () => {
const isDarkMode = await page.evaluate(() =>
document.documentElement.classList.contains('dark')
)
console.log(`현재 테마: ${isDarkMode ? '다크 모드' : '라이트 모드'}`)
expect(isDarkMode).toBeTruthy()
})
// 5. 페이지 새로고침 후 테마 유지 확인
await test.step('5. 페이지를 새로고침하여 다크 모드가 유지되는지 확인합니다', async () => {
await page.reload()
const isDarkMode = await page.evaluate(() =>
document.documentElement.classList.contains('dark')
)
expect(isDarkMode).toBeTruthy()
})
})
step
을 사용하면 테스트 가독성을 향상 시킬 수 있고, 디버깅을 용이하게 할 수 있다.
또한, Playwright
의 HTML 보고서(show-report)에서 step
의 사용은 단계별로 계층 구조가 명확하게 표시되어 한눈에 파악할 수 있다.
2-3. 제출 양식 테스트
현제 사이트에서는 form 양식이 없으므로, 네이버 로그인 폼으로 테스트 코드를 작성해 보았다.
test('로그인 필드가 모두 채워졌을 때, 로그인 버튼이 활성화 된다.', async ({ page }) => {
const startUrl = 'https://nid.naver.com/nidlogin.login?mode=form&url=https://www.naver.com/'
const loginButton = page.locator('[id="log.login"]')
await page.goto(startUrl)
await expect(loginButton).toHaveClass(/off/)
await page.locator('input#id').fill('testId')
await page.locator('input#pw').fill('testPassword')
await expect(loginButton).not.toHaveClass(/off/)
})
Playwright
는 locator
를 사용하여 DOM 요소를 찾을 수 있다.
네이버는 특이하게 disabled
속성을 사용하지 않고, 클래스로 on/off를 하고 있어서 toBeEnabled()
를 사용할 수 없었다.
getByRole
을 사용하여 테스트 코드를 작성하고자 하였으나, 은근 힘이 들어서 다른 방법을 찾아보았다.
그러는 도중 locator
를 사용하여 테스트 코드를 작성할 수 있었다. 그래서 아래에 대한 내용을 좀 정리 해보았다.
locator()
와 getByRole()
는 언제 사용 해야 할까?
🎯 Playwright에서 메서드 | 설명 | 사용 예 |
---|---|---|
locator() | 범용 요소 선택기 (CSS/XPath 기반) | 구조 기반 선택: .card , nth , attribute |
getByRole() | 접근성 역할(role)을 기준으로 요소 선택 | 의미 기반 선택: button , heading , link 등 |
Playwright에서 요소를 조작하려면 Locator 객체가 필요합니다.
locator
locator()
는 원하는 요소를 선택하고, 클릭하거나 입력하거나 확인하는 데 사용되는 기본 메서드입니다.
const loginButton = page.locator('button.login')
await loginButton.click()
이건 마치 CSS 선택자 기반 DOM 선택처럼 동작합니다.
getByRole
getByRole()
은 화면 상에서 의미 있는 역할(Role)을 기준으로 요소를 선택합니다.
접근성(A11y)에 기반한 방식으로, 사람이 보는 UI 의미와 코드가 연결되도록 도와줍니다.
await page.getByRole('button', { name: '로그인' }).click()
이런 방식은 테스트의 가독성과 안정성, 유지보수성을 훨씬 높여줍니다.
다만, 가능하다면 getByRole()
같은 의미 기반 접근을 먼저 고려하는 것이 좋습니다.
두 가지 모두 상황에 맞게 병행하는 것이 Playwright를 잘 쓰는 방법입니다.
3. Codegen
NOTE
Test generator : Playwright Codegen
이제는 Playwright
의 codegen
을 사용하여 테스트 코드를 고생하지 않고 작성할 수 있다.
아까 설치한 익스텐션에서 Pick locator
를 사용하면 필요한 locator 객체를 가져올 수 있어서 테스트 코드를 쉽게 작성할 수 있다.
또한, Record
기능을 사용하면 딸칵으로 테스트 코드가 작성되기 까지 한다.
마치며
이번 포스팅을 통해 Playwright를 사용한 E2E 테스트 작성의 기초를 살펴보았습니다.
테스트 코드 작성은 처음에는 다소 번거로울 수 있지만, 장기적으로 봤을 때 개발 생산성과 안정성을 크게 향상시켜주는 중요한 작업입니다.
특히 Playwright의 codegen
과 같은 도구를 활용하면 테스트 코드 작성을 훨씬 수월하게 할 수 있습니다.
Happy Testing! 🚀