파이썬으로 브라우저 자동화하기: Playwright, Selenium 및 기타 도구
파이썬 브라우저 자동화와 E2E 테스트 비교.
Python에서 사용할 브라우저 자동화 스택을 선택하는 것은 속도, 안정성, 유지보수에 영향을 미칩니다.
이 개요는
Playwright vs Selenium vs Puppeteer vs LambdaTest vs ZenRows vs Gauge -
Python에 초점을 맞추며, Node.js 또는 다른 언어가 어디에 적합한지 주목합니다.
여기에는 Playwright trace viewer의 스크린샷이 있습니다.
언제 어떤 것을 사용하는가
Playwright (Python)
Playwright는 Microsoft에서 제공하는 오픈소스 브라우저 자동화 라이브러리입니다. Chromium, Firefox, WebKit을 Chrome DevTools Protocol (CDP) 또는 WebSocket을 통해 연결하므로, 세 엔진 모두에 대해 동일한 API를 사용할 수 있습니다. 자동 대기 기능이 포함되어 있으며, 모든 액션(클릭, 입력 등) 전에 요소가 보이게 되고 안정적이며 실행 가능한 상태가 될 때까지 기다리므로 불안정성과 수동 sleep 또는 WebDriverWait의 필요성을 줄입니다. 설정은 최소(pip install playwright 다음 playwright install)이며, Python API는 동기 및 비동기 모두 지원합니다. 새로운 E2E 테스트 스위트, 스크립팅, 자동화(예: Python에서 MCP 서버 구축로 브라우저를 제어하는 경우 사용하세요. Python, JavaScript, TypeScript 예제와 함께 완전한 튜토리얼을 원하신다면 Playwright: 웹 스크래핑 및 테스트를 참조하세요. Python에서 단위 테스트를 사용하여 앱의 나머지 부분을 테스트하고, Playwright는 브라우저 레이어에만 사용하세요. 단점: Selenium보다 새로 출시되었으므로 제3자 통합 및 구식 자료가 적고, 매우 오래된 브라우저에 대한 공식 지원이 없습니다.
Selenium (Python)
Selenium은 브라우저 자동화의 오랜 표준입니다. Selenium 프로젝트(오픈소스, OpenJS Foundation 후원)는 WebDriver API를 제공합니다: 브라우저별 드라이버(ChromeDriver, GeckoDriver 등)에 명령을 보내고, 실제 브라우저와 통신합니다. Selenium은 Python, Java, C#, JavaScript 등 여러 언어를 지원하며, 구식 브라우저까지 포함한 가장 넓은 범위의 브라우저를 지원합니다. Selenium 4+에는 Selenium Manager가 포함되어 있으므로, 더 이상 수동으로 드라이버 이진 파일을 다운로드하거나 경로를 설정할 필요가 없습니다-클라이언트가 맞는 드라이버를 자동으로 다운로드합니다. API는 자동 대기를 제공하지 않으며, 일반적으로 WebDriverWait 및 예상 조건을 사용하여 불안정한 테스트를 피합니다. 기존 WebDriver 스위트를 유지하거나, 가장 넓은 생태계 및 언어 지원이 필요한 경우 또는 구식 브라우저를 지원해야 하는 경우 Selenium을 사용하세요. Python의 청소 아키텍처를 위한 디자인 패턴에 적합하게 드라이버를 작은 어댑터 뒤에 감싸면 됩니다. 단점: Playwright보다 주의 깊은 대기 전략 없이는 일반적으로 느리고 더 취약하며, 더 많은 부가 코드가 필요합니다.
Puppeteer
Puppeteer는 Google의 Node.js 라이브러리로, 헤드리스 Chrome/Chromium(Chromium 기반 Edge 포함)을 제어합니다. Chrome DevTools Protocol을 직접 사용하며, JavaScript/TypeScript 팀이 Chrome만 자동화하거나 PDF 생성, 스크래핑을 수행할 때의 de facto 선택입니다. 공식적인 Python 바인딩은 없으며, API는 Node.js에만 제공됩니다. 스택이 Python이라면, Playwright(동일한 “CDP 제어” 아이디어, Python 전용) 또는 Selenium을 사용하세요. Node.js에서 사용하고 Chrome만 필요하다면 Puppeteer는 잘 문서화된 강력한 선택입니다. 단점: Chrome/Chromium만 지원하며, Firefox 또는 WebKit, Python은 지원하지 않습니다.
LambdaTest
LambdaTest는 상용 클라우드 테스트 플랫폼입니다. 로컬에서 Selenium 또는 Playwright(또는 Cypress 등) 스크립트를 작성하되, 로컬 브라우저 대신 LambdaTest의 그리드에 연결합니다. 그들은 클라우드에서 실제 브라우저와 실제 장치(모바일 포함)를 제공하므로, 자체 실험실을 유지하지 않고도 많은 OS/브라우저/버전 조합에서 테스트를 병렬로 실행할 수 있습니다. 결과, 비디오, 로그를 위한 대시보드를 얻을 수 있습니다. 복수 브라우저 커버리지, 대규모 병렬 실행, 모바일 에뮬레이션을 필요로 하며 인프라를 호스팅하고 싶지 않을 때 사용하세요. 또한 Gauge를 지원합니다: LambdaTest의 Selenium 그리드에서 Gauge 스펙을 실행합니다. 단점: 유료(무료 계층 포함); 테스트는 네트워크를 통해 실행되므로 지연 및 가용성은 그들의 서비스에 의존합니다.
ZenRows
ZenRows는 상용 웹 스크래핑 및 반탐지 서비스입니다. 스크래핑 브라우저는 Playwright(또는 다른 CDP 호환 도구)를 통해 제어하는 클라우드 브라우저입니다: 스크립트를 WebSocket 엔드포인트에 연결하고, 브라우저는 ZenRows 측에서 주거용 프록시, IP 회전, 반봇 우회(예: Cloudflare, DataDome), 선택적 CAPTCHA 처리와 함께 실행됩니다. Playwright 로직을 변경하지 않고 브라우저 엔드포인트만 변경하면 됩니다. 스크래핑을 목표로 하고 블록 또는 속도 제한에 직면할 때 사용하세요. 자체 앱에서 단순한 E2E 테스트를 수행할 경우, 로컬 Playwright 또는 Selenium이 일반적으로 충분합니다. 단점: 유료; 스크래핑에 초점을 맞추고 있으며, LambdaTest와 같은 일반 목적의 테스트 그리드가 아닙니다.
Gauge
Gauge는 Thoughtworks에서 제공하는 오픈소스 테스트 프레임워크입니다. 규격 및 보고에 초점을 맞추며, Markdown(또는 다른 형식)의 규격과 시나리오 및 단계를 작성하고, Python(또는 Java, JavaScript 등)을 사용하여 Selenium 또는 다른 드라이버를 사용하여 브라우저를 제어하는 단계를 구현합니다. Gauge는 Selenium 또는 Playwright를 대체하지 않으며, 그 위에 구조, 재사용, 가독성 있는 보고를 추가합니다. 기존 Selenium(또는 유사한) 설정 위에 BDD 스타일의 규격, 살아있는 문서, 명확한 테스트 보고를 원할 때 사용하세요. LambdaTest는 그들의 그리드에서 Gauge 테스트를 실행하는 것을 지원합니다. 단점: 학습 및 유지보수에 추가적인 층이 필요하며, 여전히 브라우저 자동화 드라이버(예: Selenium)를 선택하고 구성해야 합니다.
어디서 실행되는가
- Playwright: 로컬 또는 CI; Python 3.8+; Windows, macOS, Linux. 클라우드/원격 브라우저(예: ZenRows, LambdaTest)와 WebSocket 또는 CDP 엔드포인트에 연결하여 작동합니다.
- Selenium: 로컬 또는 CI; WebDriver 클라이언트가 있는 모든 언어; Selenium Grid 또는 LambdaTest와 같은 제공업체를 사용하여 확장합니다.
- Puppeteer: Node.js만; 일반적으로 머신 또는 Docker에서 Chrome/Chromium을 실행합니다.
- LambdaTest: 클라우드만; Selenium/Playwright(또는 Selenium 위의 Gauge)를 그들의 그리드에 대비합니다.
- ZenRows: 클라우드 스크래핑 브라우저; Python(예: Playwright) 또는 다른 CDP 호환 도구를 사용하여 제어합니다.
- Gauge: 자신의 머신 또는 CI에서 실행되며, Selenium(또는 다른 드라이버)를 사용합니다. LambdaTest의 그리드를 대상으로 할 수 있습니다.
Python 생태계의 추세를 빠르게 확인하려면 GitHub에서 인기 있는 Python 프로젝트를 참조하세요. 많은 자동화 및 테스트 도구가 그곳에 나타납니다.
Python에서 사용 방법
Playwright (Python)
Playwright의 Python 패키지는 동기 및 비동기 API 모두 제공합니다. 브라우저는 별도로 설치되므로 라이브러리가 작게 유지되고 필요한 엔진(Chromium, Firefox, WebKit)만 선택할 수 있습니다. 설치 및 브라우저 설치:
pip install playwright
playwright install
동기 예제(이동, 클릭, 텍스트 읽기 - Playwright는 요소를 위한 자동 대기 기능이 포함됨):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
# 링크 클릭 후 헤딩 확인 (내장 자동 대기)
page.get_by_role("link", name="More information...").click()
heading = page.get_by_role("heading", name="Example Domain").text_content()
print(heading)
browser.close()
병렬 처리에 적합하고 LLM-구조화된 출력 워크플로우 또는 브라우저가 실행되는 동안 I/O를 수행하는 스크립트에 추천됩니다:
from playwright.async_api import async_playwright
import asyncio
async def main():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
await page.goto("https://example.com")
print(await page.title())
await browser.close()
asyncio.run(main())
Python 참고서 및 문법 참조를 위해 로컬 문서를 유지하는 것이 좋습니다.
Selenium (Python)
Python 클라이언트는 W3C WebDriver 프로토콜을 사용합니다. Selenium 4+는 Selenium Manager를 사용하여 ChromeDriver, GeckoDriver 등 올바른 드라이버를 자동으로 다운로드 및 관리하므로, 수동으로 드라이버를 다운로드할 필요가 없습니다:
pip install selenium
명시적 대기 사용 예제(Selenium은 자동 대기하지 않음; WebDriverWait 또는 예상 조건 사용):
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
# body가 존재할 때까지 대기, затем 제목 얻기
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
print(driver.title)
driver.quit()
클릭 및 텍스트 읽기:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
link = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.LINK_TEXT, "More information. .."))
)
link.click()
heading = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "h1"))
)
print(heading.text)
driver.quit()
Puppeteer (Node.js; 공식 Python 없음)
Puppeteer는 JavaScript/Node.js만 지원하며, Google은 Python API를 제공하지 않습니다. Python에서 Puppeteer와 유사한 경험을 원한다면 Playwright를 사용하세요(동일한 “Chrome을 CDP로 제어” 아이디어, Python 전용 및 자동 대기 기능 포함). 비공식 포트인 pyppeteer가 있지만, 활발히 유지보수가 되지 않으며, 새 Python 작업에는 Playwright가 더 나은 선택입니다. 아래는 Node.js 예제로 API를 비교할 수 있습니다:
npm init -y && npm install puppeteer
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.title());
await page.click("a[href='https://www.iana.org/domains/example']");
const text = await page.$eval("h1", (el) => el.textContent);
console.log(text);
await browser.close();
})();
LambdaTest (Python: Selenium)
동일한 Selenium API를 사용하며, 변경 사항은 로컬 드라이버 대신 LambdaTest의 원격 WebDriver 허브에 연결하는 것입니다. 브라우저, OS, 빌드 이름 등 capability를 설정하고, LambdaTest 대시보드에서 사용자 이름 및 액세스 키를 입력하세요:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.browser_version = "latest"
options.platform_name = "Windows 11"
lt_caps = {
"lt:options": {
"username": "YOUR_LT_USERNAME",
"accessKey": "YOUR_LT_ACCESS_KEY",
"build": "Playwright-Selenium-Compare",
"name": "Selenium on LambdaTest",
}
}
options.set_capability("lt:options", lt_caps["lt:options"])
driver = webdriver.Remote(
command_executor="https://YOUR_LT_USERNAME:YOUR_LT_ACCESS_KEY@hub.lambdatest.com/wd/hub",
options=options,
)
driver.get("https://example.com")
print(driver.title)
driver.quit()
LambdaTest (Python: Playwright)
Playwright는 CDP(Chrome DevTools Protocol)를 통해 원격 브라우저에 연결할 수 있습니다. LambdaTest는 각 테스트 실행에 대해 CDP 엔드포인트를 제공하며, 로컬 브라우저 대신 해당 엔드포인트에 연결합니다. LambdaTest의 문서에서 정확한 CDP URL 형식 및 인증 방법을 참조하세요:
from playwright.sync_api import sync_playwright
# LambdaTest는 각 실행에 대해 CDP 엔드포인트를 제공합니다; 그들의 문서에서 이를 얻을 수 있습니다
CDP_URL = "wss://cdp.lambdatest.com/playwright?capabilities=..." # LT 대시보드에서
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(CDP_URL)
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
ZenRows + Playwright (Python)
ZenRows의 스크래핑 브라우저는 CDP 호환 가능하므로, Playwright의 connect_over_cdp()를 사용하여 WebSocket URL을 사용합니다. 브라우저는 ZenRows 클라우드에서 실행되며, 그들의 프록시 및 반봇 처리가 적용됩니다. 스크립트는 연결 방식만 변경하고 나머지는 동일합니다. 오직 런칭 단계만 변경됩니다:
from playwright.sync_api import sync_playwright
ZENROWS_WS = "wss://browser.zenrows.com?apikey=YOUR_ZENROWS_API_KEY"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(ZENROWS_WS)
page = browser.new_page()
page.goto("https://example.com")
html = page.content()
print(html[:500])
browser.close()
그러면 결과된 HTML을 자신의 파서에 전달하거나, 예를 들어 Python으로 HTML을 Markdown으로 변환을 사용하여 후속 처리에 사용할 수 있습니다.
Gauge + Selenium (Python)
Gauge는 Markdown(또는 다른 형식)의 규격과 Python에서의 단계 구현을 사용합니다. 각 단계는 Selenium(또는 다른 드라이버)을 사용하여 브라우저를 열고, 이동하고, 주장할 수 있습니다. 예제 레이아웃:
규격 specs/example.spec:
# 예시 규격
## 사이트 열기 및 제목 확인
* 브라우저 열기 및 "https://example.com" 이동
* 페이지 제목이 "Example Domain"이어야 함
단계 step_impl/example.py:
from getgauge.python import step, before_scenario
from selenium import webdriver
driver = None
@before_scenario()
def init_driver():
global driver
driver = webdriver.Chrome()
@step("브라우저 열기 및 <url> 이동")
def open_url(url):
driver.get(url)
@step("페이지 제목이 <title>이어야 함")
def check_title(title):
assert driver.title == title, f"예상 {title}, 받은 {driver.title}"
Gauge, Python 실행자 및 Selenium 플러그인을 설치하고 gauge run specs/로 실행하세요. LambdaTest에서 실행하려면 before_scenario 훅에서 Selenium 드라이버를 LambdaTest의 원격 URL 및 capability로 설정하고 webdriver.Chrome() 대신 사용하세요.
요약
| 도구 | Python | 역할 | 최적의 사용 사례 |
|---|---|---|---|
| Playwright | 예 | 브라우저 자동화 | 새로운 E2E 테스트, 스크래핑, 다중 브라우저, 속도 |
| Selenium | 예 | 브라우저 자동화 | 구형 테스트, 넓은 생태계, 많은 브라우저 |
| Puppeteer | 아니오 | 브라우저 자동화 | Node.js/Chrome 전용 프로젝트 |
| LambdaTest | N/A | 클라우드 그리드 | 병렬, 다중 브라우저, Gauge + Selenium |
| ZenRows | Playwright를 통해 예 | 스크래핑 브라우저 | 반봇, 프록시, CAPTCHA; Playwright와 함께 사용 |
| Gauge | 예 | 테스트 프레임워크 | BDD 규격 + Selenium(또는 다른 드라이버) |
새로운 Python 작업에 대해 Playwright가 기본 선택이며, 클라우드 확장 또는 스크래핑 내구성을 필요로 할 때 LambdaTest 또는 ZenRows를 추가하세요. 기존 스위트에는 Selenium을 유지하고, Gauge를 사용하여 Selenium 위에 규격 중심 테스트 설계를 원할 때 사용하세요.
유용한 링크
- Playwright: 웹 스크래핑 및 테스트
- GitHub에서 최상위 17개의 인기 있는 Python 프로젝트
- Python에서 단위 테스트
- Python의 청소 아키텍처를 위한 디자인 패턴
- Python 참고서
- LLMs 구조화된 출력: Ollama, Qwen3 및 Python 또는 Go
- Python으로 HTML을 Markdown으로 변환: 종합 가이드
- Python에서 MCP 서버 구축: 웹 검색 및 스크래핑