
Playwright를 Docker를 통해 실행 시키는 방법에 대해 알아보려고 한다.
Docker를 조금만 써본다면 Docker를 사용하는게 많이 편리하기도 하고 모든 현업에서도 Docker는 필수다.
공식 문서 - Docker
먼저 이 방법은 ms가 제공하는 Playwright docker image를 pull 해오는 방법이다.
이미지 안에는 Python 환경과 Playwright 실행에 필요한 브라우저가 포함되어있다.
playwright
pytest
pytest-playwright
pytest-xdist
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"]
이번엔 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
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
# 자세한 테스트 로그, print 결과 확인
$ pytest -v -s
# 병렬 실행
$ pytest -n <worker 개수>
$ pytest -n auto
pytest Docker 결과이다.

저장된 스크린샷 결과

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

실제로 python slim 이미지를 사용해서인지 500MB 정도의 차이가 있다는 것을 확인할 수 있었다.
용량에 제한을 많이 받는 입장이라면 python slim을 이용하는게 나은데 이때는 playwright에 필요한 브라우저도 install을 해야하기 때문에
업무망이라던지 프록시에 좀 문제를 겪을 수 있는 상황에서는 Playwright 이미지를 사용하는게 편해보인다.
각자의 상황에 맞춰서 개발환경을 맞추는게 최고라고 본다.
이거랑 다른거 잘 섞어서 쓰면 크롤링 ETL 파이프라인 구축이 쉬울 것 같기도한데..