AICosmus

Where tech meets the everyday — AI, fintech, swimming, and cars.
Playwright 브라우저 자동화 작업 환경

Playwright 사용법 총정리 — 웹 브라우저 자동화 입문

매일 반복하는 브라우저 작업, 코드 한 줄이면 됩니다

회사 인트라넷에 매일 아침 로그인해서 출근 체크를 하고, 특정 쇼핑몰의 가격 변동을 수시로 확인하고, 여러 페이지를 돌아다니며 필요한 데이터를 복사해서 엑셀에 붙여넣고… 이런 반복적인 브라우저 작업에 하루 30분 이상을 쓰고 계신가요? 지금부터 소개할 도구가 그 시간을 거의 0으로 만들어줄 수 있습니다.

Playwright는 Microsoft가 만든 오픈소스 브라우저 자동화 프레임워크입니다. 쉽게 말해, 사람이 브라우저에서 하는 모든 행동 — 페이지 열기, 버튼 클릭, 텍스트 입력, 스크롤, 스크린샷 촬영 — 을 코드 몇 줄로 대신해주는 도구입니다. Python, JavaScript, C#, Java 등 다양한 언어를 지원하지만, 이 글에서는 진입장벽이 가장 낮은 Python을 기준으로 설명합니다.

Selenium을 써본 분이라면 “세상 좋아졌다”고 느낄 것이고, 브라우저 자동화를 처음 접하는 분이라면 “이게 이렇게 쉬웠어?”라고 놀랄 겁니다. 이 글에서는 설치부터 실전 예제, 그리고 마우스 클릭만으로 코드를 자동 생성해주는 Codegen 기능까지 한 번에 정리합니다.

Playwright란 무엇인가 — 그리고 왜 지금 Playwright인가

브라우저 자동화 도구의 역사를 짧게 훑어보면 Playwright가 왜 2026년 현재 사실상의 표준이 됐는지 이해하기 쉽습니다.

브라우저 자동화 도구의 세대 교체

2004년에 등장한 Selenium은 20년 넘게 브라우저 자동화의 대명사였습니다. 하지만 느린 실행 속도, 불안정한 대기(wait) 처리, 브라우저 드라이버 버전 관리의 번거로움이 늘 발목을 잡았습니다. 2017년에 Google이 만든 Puppeteer는 크롬(Chromium) 전용이라는 한계가 있었지만 속도와 안정성에서 큰 진보를 보여줬습니다.

2020년, Puppeteer 팀의 핵심 개발자들이 Microsoft로 이적하면서 만든 것이 바로 Playwright입니다. Puppeteer의 장점을 그대로 가져오면서 크롬뿐 아니라 Firefox, Safari(WebKit)까지 하나의 API로 제어할 수 있게 만들었습니다. 그 결과 2024년을 기점으로 GitHub 스타 수와 npm 다운로드 수 모두 Selenium과 Puppeteer를 추월했고, 2026년 현재 신규 프로젝트에서 브라우저 자동화를 구현할 때 Playwright가 첫 번째 선택지가 된 상태입니다.

Playwright Selenium Puppeteer 비교표

Playwright의 핵심 강점 5가지

  • 멀티 브라우저 지원: Chromium, Firefox, WebKit 세 엔진을 하나의 코드로 제어합니다. 크로스 브라우저 테스트도 코드 한 줄 차이입니다.
  • 자동 대기(Auto-wait): 요소가 화면에 나타나고 클릭 가능해질 때까지 자동으로 기다려줍니다. Selenium에서 악명 높았던 time.sleep(3) 남발이 필요 없습니다.
  • 브라우저 드라이버 내장: 설치 명령어 한 줄이면 브라우저 바이너리가 자동으로 다운로드됩니다. ChromeDriver 버전 맞추느라 고생할 일이 없습니다.
  • Codegen(코드 생성기): 브라우저에서 마우스로 작업하면 해당 동작이 실시간으로 Python 코드로 변환됩니다. 코딩을 잘 모르는 분도 자동화 스크립트를 만들 수 있습니다.
  • 네트워크 가로채기: API 요청을 중간에서 수정하거나 모킹(mocking)할 수 있어, 단순 자동화를 넘어 고급 테스트까지 가능합니다.

설치부터 첫 실행까지 — 5분 환경 세팅

Playwright Python 설치는 놀라울 정도로 간단합니다. Python 3.8 이상이 설치되어 있다면 명령어 두 줄이면 끝납니다.

1단계: 패키지 설치

터미널(Windows라면 PowerShell, Mac/Linux라면 터미널)을 열고 다음 명령어를 입력합니다.

pip install playwright

패키지 설치가 끝나면 브라우저 바이너리를 다운로드합니다. 이 과정에서 Chromium, Firefox, WebKit 세 브라우저가 자동으로 설치됩니다.

playwright install

전체 과정이 보통 1~2분이면 끝납니다. 별도의 브라우저 드라이버를 다운로드하거나 환경변수를 설정할 필요가 전혀 없습니다.

2단계: 첫 번째 스크립트 작성

설치 확인 겸 아주 간단한 스크립트를 만들어봅시다. first_test.py라는 파일을 만들고 다음 코드를 입력합니다.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=False)
    page = browser.new_page()
    page.goto("https://example.com")
    print(f"페이지 제목: {page.title()}")
    page.screenshot(path="first_screenshot.png")
    print("스크린샷 저장 완료!")
    browser.close()

실행해봅시다.

python first_test.py

크롬 브라우저가 자동으로 열리고, example.com에 접속한 뒤, 스크린샷을 찍고 종료됩니다. 터미널에는 페이지 제목이 출력됩니다. 축하합니다 — 첫 브라우저 자동화 스크립트가 완성됐습니다!

핵심 코드 구조 이해하기

위 코드의 구조를 하나씩 뜯어보겠습니다.

  • sync_playwright(): Playwright 엔진을 초기화합니다. with 문으로 감싸면 스크립트가 끝날 때 자동으로 리소스가 정리됩니다.
  • p.chromium.launch(): 크롬 브라우저를 실행합니다. headless=False로 설정하면 브라우저 창이 실제로 화면에 나타나서 동작을 눈으로 확인할 수 있습니다. 생략하거나 True로 두면 화면 없이 백그라운드에서 실행됩니다.
  • browser.new_page(): 새 탭(페이지)을 엽니다.
  • page.goto(url): 해당 URL로 이동합니다.
  • page.screenshot(): 현재 화면을 이미지로 저장합니다.
  • browser.close(): 브라우저를 종료합니다.

p.chromium 대신 p.firefoxp.webkit을 쓰면 다른 브라우저에서 같은 작업을 수행합니다. 코드 나머지 부분은 전혀 바꿀 필요가 없습니다.

Playwright 스크립트 실행 흐름도

핵심 API 마스터하기 — 이것만 알면 웬만한 자동화는 다 됩니다

Playwright의 API는 직관적이어서 이름만 봐도 무슨 동작인지 짐작이 됩니다. 실무에서 가장 많이 쓰는 기능들을 하나씩 살펴보겠습니다.

요소 찾기 — Locator

웹 페이지에서 특정 버튼, 입력창, 텍스트를 찾으려면 Locator를 사용합니다. Playwright는 CSS 셀렉터, 텍스트, 역할(role) 등 다양한 방식을 지원합니다.

# CSS 셀렉터로 찾기
page.locator("#login-button")           # id가 login-button인 요소
page.locator(".price-tag")               # class가 price-tag인 요소
page.locator("input[name='email']")      # name 속성이 email인 input

# 텍스트로 찾기
page.locator("text=로그인")              # '로그인'이라는 텍스트를 가진 요소
page.get_by_text("장바구니에 담기")       # 더 명시적인 텍스트 검색

# 역할(Role)로 찾기 — 접근성 기반, 가장 권장되는 방식
page.get_by_role("button", name="제출")
page.get_by_role("link", name="회원가입")
page.get_by_role("textbox", name="이메일")

# placeholder로 찾기
page.get_by_placeholder("검색어를 입력하세요")

# label로 찾기
page.get_by_label("비밀번호")

Playwright 공식 문서에서도 get_by_role()을 가장 먼저 권장합니다. HTML 구조가 바뀌어도 역할(role)은 유지되는 경우가 많아서 스크립트가 오래 살아남습니다.

클릭, 입력, 선택

# 버튼 클릭
page.get_by_role("button", name="로그인").click()

# 텍스트 입력 — fill()은 기존 내용을 지우고 새로 입력
page.get_by_label("이메일").fill("[email protected]")
page.get_by_label("비밀번호").fill("my_password")

# 드롭다운 선택
page.get_by_label("지역").select_option("서울")

# 체크박스 체크/해제
page.get_by_label("약관에 동의합니다").check()

# 파일 업로드
page.get_by_label("프로필 사진").set_input_files("photo.jpg")

대기(Wait) — Playwright의 가장 큰 강점

Selenium을 쓰면서 가장 스트레스 받는 부분이 ‘대기’입니다. 페이지 로딩이 완료되기 전에 요소를 클릭하려고 하면 에러가 나고, 그렇다고 time.sleep(5)를 남발하면 스크립트가 느려집니다.

Playwright는 이 문제를 자동 대기(auto-wait)로 해결합니다. click()이나 fill() 같은 액션을 호출하면, 해당 요소가 화면에 나타나고(visible), 활성화되고(enabled), 안정적인(stable) 상태가 될 때까지 자동으로 기다려줍니다. 대부분의 경우 별도의 wait 코드가 필요 없습니다.

그래도 명시적으로 기다려야 할 때는 다음 메서드를 씁니다.

# 특정 요소가 나타날 때까지 대기
page.locator(".loading-spinner").wait_for(state="hidden")

# 특정 URL로 이동할 때까지 대기
page.wait_for_url("**/dashboard")

# 네트워크 요청이 완료될 때까지 대기
with page.expect_response("**/api/data") as response_info:
    page.get_by_role("button", name="조회").click()
response = response_info.value
print(response.json())

데이터 추출

# 텍스트 가져오기
title = page.locator("h1").inner_text()
print(f"제목: {title}")

# 속성 가져오기
href = page.locator("a.main-link").get_attribute("href")
print(f"링크: {href}")

# 여러 요소의 텍스트를 한 번에 가져오기
items = page.locator(".product-name").all_inner_texts()
for item in items:
    print(item)

# HTML 전체 가져오기
html = page.content()

스크린샷과 PDF 저장

# 현재 보이는 화면만 캡처
page.screenshot(path="visible.png")

# 페이지 전체를 스크롤해서 캡처 (긴 페이지에 유용)
page.screenshot(path="full_page.png", full_page=True)

# 특정 요소만 캡처
page.locator(".chart-area").screenshot(path="chart_only.png")

# PDF로 저장 (Chromium에서만 지원)
page.pdf(path="page.pdf", format="A4")

실전 예제 3가지 — 오늘 바로 써먹는 자동화

이론은 충분합니다. 이제 실제로 유용한 자동화 스크립트 세 가지를 만들어봅시다.

예제 1: 웹사이트 자동 로그인

매일 아침 회사 그룹웨어에 로그인하는 과정을 자동화합니다. 이 패턴은 거의 모든 로그인 페이지에 응용할 수 있습니다.

from playwright.sync_api import sync_playwright
import os

def auto_login():
    # 보안을 위해 비밀번호는 환경변수에서 읽기
    username = os.environ.get("MY_USERNAME", "[email protected]")
    password = os.environ.get("MY_PASSWORD", "")
    
    if not password:
        print("환경변수 MY_PASSWORD를 설정해주세요.")
        return
    
    with sync_playwright() as p:
        # 브라우저 상태를 파일로 저장하면 쿠키/세션 유지 가능
        browser = p.chromium.launch(headless=False)
        context = browser.new_context()
        page = context.new_page()
        
        # 로그인 페이지로 이동
        page.goto("https://groupware.example.com/login")
        
        # 아이디/비밀번호 입력
        page.get_by_label("아이디").fill(username)
        page.get_by_label("비밀번호").fill(password)
        
        # 로그인 버튼 클릭
        page.get_by_role("button", name="로그인").click()
        
        # 대시보드로 이동될 때까지 대기
        page.wait_for_url("**/dashboard**")
        print("로그인 성공!")
        
        # 로그인 상태를 파일로 저장 (다음번에 재사용)
        context.storage_state(path="auth_state.json")
        browser.close()

auto_login()

핵심 팁이 하나 있습니다. context.storage_state()로 로그인 상태를 파일에 저장해두면, 다음 실행 시 browser.new_context(storage_state="auth_state.json")으로 불러와서 로그인 과정을 건너뛸 수 있습니다. 세션이 만료되기 전까지는 매번 아이디와 비밀번호를 입력할 필요가 없어집니다.

예제 2: 상품 가격 모니터링

관심 있는 상품의 가격을 주기적으로 확인하고, 변동이 있으면 기록하는 스크립트입니다.

from playwright.sync_api import sync_playwright
import csv
import datetime
from pathlib import Path

def check_prices(products):
    """상품 목록의 현재 가격을 수집하여 CSV에 기록"""
    timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
    results = []
    
    with sync_playwright() as p:
        browser = p.chromium.launch()
        page = browser.new_page()
        
        for product in products:
            try:
                page.goto(product["url"], timeout=15000)
                price_el = page.locator(product["selector"])
                price_text = price_el.inner_text(timeout=5000)
                results.append({
                    "time": timestamp,
                    "name": product["name"],
                    "price": price_text.strip(),
                })
                print(f"[OK] {product['name']}: {price_text.strip()}")
            except Exception as e:
                print(f"[FAIL] {product['name']}: {e}")
                results.append({
                    "time": timestamp,
                    "name": product["name"],
                    "price": "수집 실패",
                })
        
        browser.close()
    
    # CSV 파일에 추가 기록
    csv_path = Path("price_log.csv")
    file_exists = csv_path.exists()
    with open(csv_path, "a", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=["time", "name", "price"])
        if not file_exists:
            writer.writeheader()
        writer.writerows(results)
    
    print(f"\n총 {len(results)}개 상품 가격 기록 완료 → {csv_path}")

# 모니터링할 상품 목록 (URL과 가격 셀렉터를 지정)
my_products = [
    {
        "name": "무선 키보드 A",
        "url": "https://shop.example.com/product/12345",
        "selector": ".total-price",
    },
    {
        "name": "모니터 B",
        "url": "https://shop.example.com/product/67890",
        "selector": ".total-price",
    },
]

check_prices(my_products)

이 스크립트를 Windows 작업 스케줄러cron에 등록하면 하루에 한 번(또는 원하는 주기로) 자동 실행됩니다. 쌓인 CSV를 엑셀로 열면 가격 추이를 한눈에 확인할 수 있습니다.

Playwright Codegen 코드 자동 생성 화면

예제 3: 웹 페이지 정기 스크린샷 — 변경 감지

특정 웹 페이지의 모습을 매일 스크린샷으로 남겨두면, 디자인 변경이나 콘텐츠 업데이트를 시각적으로 추적할 수 있습니다. 경쟁사 홈페이지 모니터링이나 자사 서비스의 UI 변경 기록에 유용합니다.

from playwright.sync_api import sync_playwright
import datetime
from pathlib import Path

def daily_screenshot(urls):
    """여러 URL의 스크린샷을 날짜별 폴더에 저장"""
    today = datetime.date.today().isoformat()  # 2026-06-18
    save_dir = Path("screenshots") / today
    save_dir.mkdir(parents=True, exist_ok=True)
    
    with sync_playwright() as p:
        browser = p.chromium.launch()
        # 데스크톱과 모바일 두 가지 뷰포트로 촬영
        viewports = [
            {"name": "desktop", "width": 1920, "height": 1080},
            {"name": "mobile", "width": 390, "height": 844},
        ]
        
        for url_info in urls:
            for vp in viewports:
                page = browser.new_page(
                    viewport={"width": vp["width"], "height": vp["height"]}
                )
                page.goto(url_info["url"], wait_until="networkidle")
                
                filename = f"{url_info['label']}_{vp['name']}.png"
                page.screenshot(
                    path=str(save_dir / filename),
                    full_page=True,
                )
                print(f"저장: {save_dir / filename}")
                page.close()
        
        browser.close()
    print(f"\n스크린샷 {len(urls) * len(viewports)}장 저장 완료")

# 모니터링할 페이지 목록
targets = [
    {"label": "my-blog", "url": "https://example.com"},
    {"label": "competitor", "url": "https://example.org"},
]

daily_screenshot(targets)

이 스크립트는 데스크톱(1920×1080)과 모바일(390×844) 두 가지 화면 크기로 각각 촬영합니다. 날짜별로 폴더가 생성되므로 나중에 날짜 간 비교가 쉽습니다. wait_until="networkidle" 옵션은 모든 네트워크 요청이 완료될 때까지 기다리므로, 비동기 로딩되는 콘텐츠까지 빠짐없이 캡처합니다.

Codegen — 코딩 없이 자동화 스크립트 만들기

“코드를 직접 쓰기가 부담스러운데…”라고 생각하셨다면, Playwright의 Codegen(코드 생성기) 기능이 정확히 그 문제를 해결해줍니다. 브라우저에서 마우스로 작업하면 그 동작이 실시간으로 Python 코드로 변환됩니다.

Codegen 실행 방법

터미널에서 다음 명령어를 실행합니다.

playwright codegen https://example.com

그러면 두 개의 창이 열립니다. 하나는 브라우저 창이고, 다른 하나는 Playwright Inspector라는 코드 에디터 창입니다.

이제 브라우저 창에서 평소처럼 작업하세요. 링크를 클릭하고, 텍스트를 입력하고, 버튼을 누르면 — Inspector 창에 해당 동작의 Python 코드가 자동으로 한 줄씩 추가됩니다. 작업이 끝나면 Inspector의 코드를 복사해서 .py 파일로 저장하면 됩니다.

Codegen 유용한 옵션들

# 특정 뷰포트 크기로 녹화 (모바일 시뮬레이션)
playwright codegen --viewport-size=390,844 https://example.com

# 특정 브라우저로 녹화
playwright codegen --browser=firefox https://example.com

# 저장된 인증 상태를 불러와서 녹화 (로그인 건너뛰기)
playwright codegen --load-storage=auth_state.json https://example.com

# 생성 코드를 바로 파일로 저장
playwright codegen -o my_script.py https://example.com

Codegen으로 만든 코드, 그대로 쓸 수 있나요?

대부분의 경우 그대로 동작합니다. 다만 몇 가지 다듬으면 더 견고한 스크립트가 됩니다.

  • 하드코딩된 대기 시간 제거: Codegen이 가끔 page.wait_for_timeout(1000)을 삽입합니다. Playwright의 자동 대기가 있으므로 대부분 삭제해도 됩니다.
  • 셀렉터 단순화: 자동 생성된 셀렉터가 지나치게 구체적일 수 있습니다(예: #root > div:nth-child(3) > form > button). 가능하면 get_by_role()이나 get_by_text()처럼 의미 기반 셀렉터로 바꿔주면 페이지 구조가 조금 바뀌어도 스크립트가 깨지지 않습니다.
  • 에러 처리 추가: 자동 생성 코드에는 예외 처리가 없습니다. 네트워크 오류나 요소 미발견 상황을 대비해 try-except 블록을 추가하세요.

동기(sync) vs 비동기(async) — 어떤 걸 쓸까?

지금까지 예제에서 사용한 sync_playwright동기(sync) API입니다. 코드가 위에서 아래로 순서대로 실행되어 이해하기 쉽습니다. 스크립트를 단독으로 실행할 때는 동기 API면 충분합니다.

반면 FastAPI 같은 비동기 웹 프레임워크 안에서 Playwright를 쓰거나, 여러 페이지를 동시에 처리해야 할 때는 비동기(async) API가 유리합니다.

import asyncio
from playwright.async_api import async_playwright

async def main():
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        
        # 세 페이지를 동시에 열어서 스크린샷 촬영
        pages = await asyncio.gather(
            fetch_page(browser, "https://example.com", "site1.png"),
            fetch_page(browser, "https://example.org", "site2.png"),
            fetch_page(browser, "https://example.net", "site3.png"),
        )
        await browser.close()

async def fetch_page(browser, url, filename):
    page = await browser.new_page()
    await page.goto(url)
    await page.screenshot(path=filename)
    await page.close()

asyncio.run(main())

위 예제는 세 개의 사이트를 동시에 열어서 스크린샷을 촬영합니다. 동기 API로 순차 실행하면 3배 시간이 걸릴 작업을 비동기로 묶으면 거의 1/3 시간에 끝납니다.

결론적으로, 입문 단계에서는 동기 API로 시작하고, 성능이 필요해지면 비동기로 전환하는 것을 권장합니다. API 구조가 거의 동일해서 await를 붙이는 정도의 변경만 하면 됩니다.

실무에서 알아두면 좋은 팁과 주의사항

Headless vs Headed 모드

Headed 모드(headless=False)는 브라우저 창이 실제로 보이므로 스크립트 개발과 디버깅에 좋습니다. Headless 모드(기본값)는 화면 없이 백그라운드에서 실행되므로 서버 환경이나 정기 실행에 적합합니다.

개발할 때는 Headed로, 실제 운용할 때는 Headless로 전환하세요.

# 환경변수로 모드 전환
import os

debug = os.environ.get("DEBUG", "false").lower() == "true"
browser = p.chromium.launch(headless=not debug)

브라우저 컨텍스트로 세션 분리하기

하나의 브라우저에서 여러 계정으로 동시에 작업해야 할 때 Browser Context를 씁니다. 각 컨텍스트는 독립된 쿠키와 세션을 가집니다.

browser = p.chromium.launch()

# 계정 A용 컨텍스트
context_a = browser.new_context(storage_state="account_a.json")
page_a = context_a.new_page()

# 계정 B용 컨텍스트 — 완전히 독립
context_b = browser.new_context(storage_state="account_b.json")
page_b = context_b.new_page()

느린 네트워크 시뮬레이션

모바일 3G 환경에서 사이트가 어떻게 동작하는지 테스트하고 싶다면 네트워크 속도를 제한할 수 있습니다.

context = browser.new_context()
page = context.new_page()

# CDP 세션으로 네트워크 속도 제한 (Chromium 전용)
cdp = context.new_cdp_session(page)
cdp.send("Network.emulateNetworkConditions", {
    "offline": False,
    "downloadThroughput": 500 * 1024,   # 500 KB/s
    "uploadThroughput": 200 * 1024,     # 200 KB/s
    "latency": 200,                     # 200ms 지연
})

법적·윤리적 주의사항

브라우저 자동화는 강력한 도구이지만, 사용에 주의해야 할 부분이 있습니다.

  • 서비스 이용약관 확인: 많은 웹사이트가 자동화 접근을 이용약관으로 제한합니다. 대상 사이트의 약관과 robots.txt를 반드시 확인하세요.
  • 과도한 요청 자제: 짧은 시간에 수백 번 접속하면 서버에 부하를 줄 수 있고, IP 차단을 당할 수 있습니다. 적절한 딜레이(page.wait_for_timeout(2000) 등)를 넣어주세요.
  • 개인 용도 우선: 자신의 계정 자동화, 공개 데이터 수집, 내부 도구 테스트 등 정당한 목적에 사용하세요.
  • 인증 정보 보호: 비밀번호를 코드에 직접 쓰지 마세요. 환경변수나 시크릿 매니저를 통해 주입하는 것이 안전합니다.

Playwright vs Selenium — 마이그레이션 체크리스트

기존에 Selenium을 쓰고 있다면 Playwright로 전환할 때 참고할 대응표입니다.

  • driver.get(url)page.goto(url)
  • driver.find_element(By.CSS_SELECTOR, sel)page.locator(sel)
  • element.send_keys(text)locator.fill(text)
  • element.click()locator.click()
  • WebDriverWait(driver, 10).until(EC.presence_of_element_located(...)) → 자동 대기(별도 코드 불필요)
  • driver.save_screenshot(path)page.screenshot(path=path)

가장 체감이 큰 차이는 역시 대기 코드의 대폭 감소입니다. Selenium에서 WebDriverWait + expected_conditions 조합으로 5~6줄 쓰던 것이 Playwright에서는 그냥 사라집니다.

Playwright를 더 깊이 쓰고 싶다면

이 글에서 다룬 내용은 Playwright의 가장 기본적인 기능들입니다. 더 깊이 들어가면 다음과 같은 강력한 기능들도 사용할 수 있습니다.

  • 네트워크 요청 가로채기(Route): 특정 API 호출을 가로채서 응답을 바꿔치기. 테스트 환경에서 외부 서비스를 모킹할 때 유용합니다.
  • Trace Viewer: 스크립트 실행 과정을 녹화해서 타임라인으로 재생. 디버깅할 때 “어디서 뭐가 잘못됐지?”를 시각적으로 추적합니다.
  • Pytest 플러그인: pytest-playwright를 설치하면 Pytest의 fixture 시스템과 통합되어 브라우저 테스트를 체계적으로 관리할 수 있습니다.
  • 다국어 및 지역 설정: localetimezone_id를 지정해서 특정 국가/시간대의 사용자 환경을 시뮬레이션합니다.
# 한국 사용자 환경 시뮬레이션
context = browser.new_context(
    locale="ko-KR",
    timezone_id="Asia/Seoul",
    geolocation={"latitude": 37.5665, "longitude": 126.9780},
    permissions=["geolocation"],
)

마무리 — 반복은 기계에게, 시간은 나에게

브라우저 앞에서 매일 같은 작업을 반복하는 것은 사람이 할 일이 아닙니다. 로그인, 데이터 확인, 스크린샷, 양식 작성 — 이런 기계적인 작업은 Playwright에게 맡기고, 우리는 그 시간에 더 가치 있는 일을 하면 됩니다.

오늘 배운 내용을 정리하면 이렇습니다.

  • 설치: pip install playwright + playwright install — 2분이면 끝
  • 핵심 흐름: 브라우저 열기 → 페이지 이동 → 요소 찾기 → 클릭/입력 → 데이터 추출/스크린샷
  • Codegen: 마우스로 하면 코드가 된다. 코딩이 어려워도 자동화가 가능
  • 실전 활용: 로그인 자동화, 가격 모니터링, 정기 스크린샷 등 무궁무진

가장 좋은 시작은 지금 매일 반복하고 있는 브라우저 작업 하나를 떠올리고, Codegen으로 녹화해보는 것입니다. 5분 투자로 앞으로 매일 10분을 절약할 수 있다면, 그것만으로도 충분히 가치 있는 시작입니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.

답글 남기기

Your email address will not be published. Required fields are marked *.

Warning: Undefined array key "cookies" in /var/www/html/wp-content/themes/personal-cv-resume/class/class-post-related.php on line 212
*
*

최신 댓글