Playwright 기술조사2 - python

Won Joon Kim·2025년 2월 1일

기술조사

목록 보기
2/5


1. 개요

Playwright를 Docker를 통해 실행 시키는 방법에 대해 알아보려고 한다.
Docker를 조금만 써본다면 Docker를 사용하는게 많이 편리하기도 하고 모든 현업에서도 Docker는 필수다.


2. 방법

1) MS의 Playwright Docker image 사용

공식 문서 - Docker
먼저 이 방법은 ms가 제공하는 Playwright docker image를 pull 해오는 방법이다.
이미지 안에는 Python 환경과 Playwright 실행에 필요한 브라우저가 포함되어있다.

requirements.txt

playwright
pytest
pytest-playwright
pytest-xdist

Dockerfile 코드

FROM mcr.microsoft.com/playwright/python:v1.49.1-jammy

# 작업 디렉토리 설정
WORKDIR /app

# 로컬 파일 전부 복사
COPY . .

# 필요한 Python 패키지 설치
RUN pip install -r requirements.txt

# 필요한 의존성 설치 (X 서버 관련)
# headless mode 관련 xvfb 사용하지 않으면 headless 사용 불가능
RUN apt-get update && apt-get install -y \
    libnss3 \
    libnspr4 \
    libasound2 \
    libx11-xcb1 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    x11-utils \
    dbus-x11 \
    xvfb

# 기본 명령어(스크립트 실행 등)
# CMD ["python", "test1.py"]
# headless 사용을 위한 실행 방법
#CMD xvfb-run -a python test1.py
# pytest를 통한 실행방법
CMD ["pytest", "-v", "-n", "4"]

2) python 이미지를 사용해서 Playwright install

이번엔 Python image를 사용하는데 playwright 이미지를 사용할 때와의 큰 차이점은 브라우저를 install 해야한다는 차이와 apt-get할 패키지가 늘어난 정도이다.
requirements.txt 내용은 동일하다.

FROM python:3.11.9-slim

# 작업 디렉토리 설정
WORKDIR /app

# 로컬 파일 전부 복사
COPY . .

# 필요한 Python 패키지 설치
RUN pip install -r requirements.txt

# Playwright 브라우저 설치
RUN python -m playwright install

# 필요한 의존성 설치 (X 서버 관련)
# headless mode 관련 xvfb 사용하지 않으면 headless 사용 불가능
RUN apt-get update && apt-get install -y \
    libnss3 \
    libnspr4 \
    libasound2 \
    libx11-xcb1 \
    libxcomposite1 \
    libxdamage1 \
    libxrandr2 \
    x11-utils \
    dbus-x11 \
    xvfb \ 
    # 아래는 python image로 변경하면서 추가된 install 패키지들들
    libglib2.0-0 \
    libatk-bridge2.0-0 \
    libcups2 \
    libgbm1 \
    libxkbcommon0 \
    libpango-1.0-0 \
    libcairo2 \
    libatspi2.0-0

# 기본 명령어(스크립트 실행 등)
# CMD ["python", "test1.py"]
# headless 사용을 위한 실행 방법
CMD xvfb-run -a python test1.py
# pytest를 통한 실행방법
# TBD

3. Pytest

Pytest를 사용해서 Playwright의 장점인 병렬 실행을 사용할 수 있다.

pytest 규칙
1. test를 원하는 위치는 __init__.py 가 필수
2. test 파일의 이름은 test_*.py or *_test.py
3. test class는 class Test*
4. test def는 def test_*

폴더 구조

.
├── Dockerfile
├── requirements.txt
├── screenshot
├── test1.py
└── tests
    ├── __init__.py
    ├── scre # 스크린샷 폴더
    │   ├── pytest_naver1.png
    │   └── pytest_velog1.png
    ├── test_naver.py # 테스트 코드 - 네이버
    └── test_velog.py # 테스트 코드 - velog

test_naver.py

from playwright.sync_api import sync_playwright

def test_naver_search():
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)  # UI 없이 실행
        page = browser.new_page()
        
        page.goto("https://www.naver.com") # 네이버 이동
        page.fill("#query", "카리나") # 카리나 검색창 추가
        page.keyboard.press("Enter") # 검색

        page.click('a[role="tab"]:has-text("이미지")') # 이미지 탭 이동

        # 페이지 요청 대기
        page.wait_for_load_state("networkidle")

        page.screenshot(path="./tests/scre/pytest_naver1.png") # 저장

        browser.close()

pytest 실행 코드

# 그냥 실행
$ pytest
# 자세한 테스트 로그, print 결과 확인
$ pytest -v -s
# 병렬 실행
$ pytest -n <worker 개수>
$ pytest -n auto

pytest Docker 결과이다.
pytest Docker
저장된 스크린샷 결과


4. 결론

둘다 결국 환경은 비슷한데 브라우저 install의 필요성과 python 용량 크기 조절 정도의 차이가 있는 것 같다.

실제로 python slim 이미지를 사용해서인지 500MB 정도의 차이가 있다는 것을 확인할 수 있었다.
용량에 제한을 많이 받는 입장이라면 python slim을 이용하는게 나은데 이때는 playwright에 필요한 브라우저도 install을 해야하기 때문에
업무망이라던지 프록시에 좀 문제를 겪을 수 있는 상황에서는 Playwright 이미지를 사용하는게 편해보인다.

각자의 상황에 맞춰서 개발환경을 맞추는게 최고라고 본다.

이거랑 다른거 잘 섞어서 쓰면 크롤링 ETL 파이프라인 구축이 쉬울 것 같기도한데..

profile
데이터 엔지니어

0개의 댓글