Playwright를 활용한 자동화 테스트 가이드

설치 및 초기 설정

Playwright는 크로스 브라우저 자동화 테스트를 위한 강력한 오픈소스 프레임워크입니다. 파이썬과 함께 사용하면 간결한 문법으로 효율적인 테스트 스크립트를 작성할 수 있습니다.

pip install playwright
playwright install

브라우저 세션 생성

다음은 크롬 브라우저를 시작하고 새로운 컨텍스트, 페이지를 생성하는 예제입니다.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

페이지 이동 및 요소 조작

웹사이트에 접속하고, 특정 요소를 선택하여 작업을 수행할 수 있습니다.

# 페이지 이동
page.goto("https://example.com")

# iframe 내부 요소 접근
iframe = page.query_selector('iframe#content-frame').content_frame()
iframe.fill('input[name="email"]', 'test@example.com')
iframe.click('button[type="submit"]')

스크린샷 및 PDF 생성

현재 페이지나 특정 요소의 스크린샷을 저장하거나, 웹 문서를 PDF로 변환할 수 있습니다.

# 요소 스크린샷
element = page.query_selector('#header')
element.screenshot(path='header.png')

# 전체 페이지를 PDF로 저장
page.pdf(path='document.pdf')

쿠키 상태 관리

로그인 상태를 유지하기 위해 쿠키를 저장하고 재사용할 수 있습니다.

# 상태 저장
state = context.storage_state()
with open("auth_state.json", "w") as f:
    f.write(json.dumps(state))

# 상태 복원
with open("auth_state.json") as f:
    saved_state = json.loads(f.read())
new_context = browser.new_context(storage_state=saved_state)

요소 선택 전략

여러 가지 방법으로 웹 요소를 정확하게 선택할 수 있습니다.

  • CSS 선택자: page.query_selector('#login-btn')
  • 텍스트 기반 선택: page.query_selector('text="로그인")
  • XPath 사용: page.query_selector('//button[@data-role="confirm"]')
  • 속성 기반 선택: page.query_selector('[aria-label="닫기"]')
  • 피아노 클래스 및 필터링: page.query_selector('div:has-text("결제 완료")')

상호작용 명령어

요소와의 상호작용은 다양한 방식으로 수행됩니다.

# 클릭
page.click('button#submit')

# 입력
page.fill('input#username', 'admin')

# 키보드 입력
page.press('input#password', 'Enter')

# 드래그 앤 드롭
page.drag_and_drop('#drag-item', '#drop-zone')

# 스크롤
page.evaluate('window.scrollTo(0, document.body.scrollHeight)')

# 마우스 오버
page.hover('a.dropdown-trigger')

# 파일 업로드
page.set_input_files('input[type="file"]', 'upload.zip')

대기 및 검증

비동기 작업에 대응하기 위해 자동 대기 기능이 제공되며, 결과를 검증할 수 있습니다.

# 요소 존재 대기
page.wait_for_selector('#success-message')

# 특정 상태 확인
assert page.inner_text('#status') == '완료됨'

# 지정된 시간 대기
page.wait_for_timeout(2000)

실제 사례: 로그인 시나리오

간단한 로그인 테스트를 구현하는 예제입니다.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    page.goto("https://demo.example.com/login")
    page.fill('input[name="user"]', 'testuser')
    page.fill('input[name="pass"]', 'secret123')
    page.click('button[type="submit"]')

    page.wait_for_selector('text="환영합니다"')
    assert page.query_selector('div.welcome') is not None

    browser.close()

실제 사례: 온라인 쇼핑 절차 자동화

상품 검색, 장바구니 추가, 결제 완료까지의 전체 흐름을 자동화합니다.

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    context = browser.new_context()
    page = context.new_page()

    page.goto("https://shop.example.com")
    page.fill('input#search-input', '스마트폰')
    page.click('button.search-btn')

    page.click('article.product:first-child button.add-to-cart')
    page.click('a.cart-link')

    page.click('button.checkout-btn')
    page.fill('input#address', '서울시 강남구')
    page.click('button.confirm-order')

    page.wait_for_selector('text="주문 완료"')
    assert page.inner_text('div.status') == '주문이 성공적으로 처리되었습니다.'

    browser.close()

태그: Playwright python Web Automation Browser Testing Selenium Alternative

7월 7일 18:30에 게시됨