Published on

Playwright 기초

Authors
  • avatar
    Name
    Justart
    Twitter

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에서 headinglevel의 조합으로 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/)
})

Playwrightlocator를 사용하여 DOM 요소를 찾을 수 있다.

네이버는 특이하게 disabled 속성을 사용하지 않고, 클래스로 on/off를 하고 있어서 toBeEnabled()를 사용할 수 없었다.

getByRole을 사용하여 테스트 코드를 작성하고자 하였으나, 은근 힘이 들어서 다른 방법을 찾아보았다.

그러는 도중 locator를 사용하여 테스트 코드를 작성할 수 있었다. 그래서 아래에 대한 내용을 좀 정리 해보았다.


🎯 Playwright에서 locator()getByRole() 는 언제 사용 해야 할까?

메서드설명사용 예
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

이제는 Playwrightcodegen을 사용하여 테스트 코드를 고생하지 않고 작성할 수 있다.

아까 설치한 익스텐션에서 Pick locator를 사용하면 필요한 locator 객체를 가져올 수 있어서 테스트 코드를 쉽게 작성할 수 있다.

또한, Record 기능을 사용하면 딸칵으로 테스트 코드가 작성되기 까지 한다.

마치며

이번 포스팅을 통해 Playwright를 사용한 E2E 테스트 작성의 기초를 살펴보았습니다.

테스트 코드 작성은 처음에는 다소 번거로울 수 있지만, 장기적으로 봤을 때 개발 생산성과 안정성을 크게 향상시켜주는 중요한 작업입니다.

특히 Playwright의 codegen과 같은 도구를 활용하면 테스트 코드 작성을 훨씬 수월하게 할 수 있습니다.

Happy Testing! 🚀