1. 도입부: 왜 Playwright와 Selenium 비교가 필요한가
웹 자동화 도구를 고를 때 많은 개발자가 먼저 고민하는 질문은 이렇습니다.
“Selenium을 계속 써도 될까, 아니면 Playwright로 갈아타야 할까?”
이 질문이 중요한 이유는 Playwright와 Selenium이 겉으로는 모두 브라우저를 띄우고 클릭하고 데이터를 가져오는 도구처럼 보이지만, 실제 사용 목적에 따라 적합성이 꽤 다르기 때문입니다.
예를 들어 정적 HTML에서 상품명과 가격만 가져오는 작업이라면 Playwright나 Selenium보다 requests + BeautifulSoup이 더 단순할 수 있습니다. 반면 React, Vue, Next.js로 만든 SPA에서 버튼을 누른 뒤 렌더링되는 데이터를 수집하거나, 로그인 후 마이페이지 화면을 검증하거나, 회원가입 흐름을 E2E 테스트로 검증해야 한다면 브라우저 자동화 도구가 필요합니다.
Playwright는 현대 웹앱 테스트와 자동화에 강한 도구이고, Selenium은 WebDriver 표준과 오랜 생태계, 다양한 언어 바인딩, Selenium Grid 기반 인프라에서 강점이 있습니다. Playwright 공식 문서는 Chromium, Firefox, WebKit을 하나의 API로 자동화할 수 있고, 테스트 러너·assertion·격리·병렬화·풍부한 도구를 함께 제공한다고 설명합니다. Selenium 공식 문서는 WebDriver가 브라우저를 로컬 또는 원격 머신에서 실제 사용자처럼 제어하며, W3C Recommendation이라는 점을 강조합니다.
이 글은 Playwright Selenium 비교, Playwright vs Selenium, 크롤링 자동화 도구, E2E 테스트 도구, Python 크롤링 자동화, Node.js 크롤링 자동화를 고민하는 개발자를 위한 실전 선택 가이드입니다.
2. 5줄 요약
Playwright는 현대적인 SPA, 동적 페이지 크롤링, 자동 대기, locator, 디버깅, E2E 테스트 작성 경험에서 강합니다.
Selenium은 레거시 프로젝트, 다양한 언어 바인딩, WebDriver 표준, Grid, 기존 테스트 인프라에서 여전히 강합니다.
정적 HTML 크롤링은 Playwright나 Selenium보다 requests, BeautifulSoup, Scrapy가 더 적합할 수 있습니다.
크롤링 자동화와 E2E 테스트 자동화는 목적이 다르므로, 데이터 수집인지 사용자 흐름 검증인지 먼저 구분해야 합니다.
robots.txt, 서비스 약관, 요청 빈도 제한, 개인정보 수집 제한을 지키지 않으면 기술적으로 가능해도 운영·법적 리스크가 생길 수 있습니다.
3. Playwright와 Selenium 한눈에 비교
| 대표 성격 | 현대 웹앱 자동화·E2E 테스트 프레임워크 | WebDriver 기반 브라우저 자동화 표준 생태계 |
| 주 사용 목적 | E2E 테스트, 동적 페이지 자동화, SPA 테스트, 스크립트 자동화 | 브라우저 테스트, 레거시 자동화, Grid 기반 대규모 테스트 |
| 크롤링 자동화 적합성 | JavaScript 렌더링 크롤링, 무한 스크롤, 모달 처리에 강함 | 기존 Selenium 크롤링 코드가 많고 브라우저 호환 범위가 넓음 |
| E2E 테스트 적합성 | 테스트 러너, auto-waiting, trace, parallel 기본 제공 | 별도 테스트 프레임워크와 조합하는 경우가 많음 |
| Python 지원 | 공식 지원, pytest 플러그인 권장 | 공식 Python 바인딩 지원 |
| Node.js 지원 | 가장 자연스러움. 자체 test runner 제공 | JavaScript 바인딩 지원 |
| 브라우저 지원 | Chromium, Firefox, WebKit | Chrome, Edge, Firefox, Safari, IE 관련 기능 문서 제공 |
| 대기 전략 | locator 기반 자동 대기와 actionability checks | explicit wait, implicit wait 등 명시적 대기 전략 중심 |
| selector 전략 | role, text, test id locator 권장. CSS/XPath도 지원 | CSS selector, XPath, id, name 등 WebDriver locator 전략 |
| 병렬 실행 | Playwright Test에서 workers, sharding 지원 | Selenium Grid, 테스트 프레임워크, 클라우드 테스트 서비스와 조합 |
| Docker/CI | 공식 Docker 이미지와 CI 가이드 제공 | Selenium Grid Docker 이미지와 원격 실행 인프라 강점 |
| 추천 사용자 | 신규 프로젝트, SPA, 빠른 E2E 테스트 작성 | 기존 Selenium 자산, 다양한 브라우저/언어/원격 실행 필요 팀 |
Playwright는 공식 문서에서 Playwright Test가 test runner, assertions, isolation, parallelization, rich tooling을 제공한다고 설명하고, Node.js에서는 자체 test runner, Python에서는 pytest 플러그인을 권장합니다. Selenium은 WebDriver와 Grid를 중심으로 로컬·원격 브라우저 실행, 여러 머신·브라우저 버전·플랫폼 테스트를 지원하는 구조입니다.
4. Playwright란?
Playwright는 Microsoft가 주도하는 브라우저 자동화 도구로, Chromium, Firefox, WebKit을 하나의 API로 다룰 수 있습니다. 공식 사이트는 Playwright를 테스트, 스크립트, 에이전트 워크플로에서 Chromium, Firefox, WebKit을 구동하는 웹 자동화 프레임워크로 소개합니다.
Playwright의 장점
| 자동 대기 기능이 강함 | 클릭, 입력, assertion 전에 요소가 보이고 안정적이며 클릭 가능한지 확인 |
| locator 중심 API | DOM 구조가 조금 바뀌어도 role, text, test id 기반으로 테스트를 안정화하기 좋음 |
| E2E 테스트 도구로 완성도 높음 | test runner, assertion, 병렬 실행, trace, HTML report 등을 함께 사용 가능 |
| SPA와 동적 페이지에 강함 | React, Vue, Next.js처럼 렌더링 타이밍이 중요한 앱에서 코드가 간결해짐 |
| Docker/CI 문서가 잘 정리됨 | 공식 Docker 이미지와 CI 가이드가 있어 서버 환경 실행이 비교적 단순함 |
| Node.js 경험이 특히 좋음 | Playwright Test Runner가 Node.js/TypeScript 프로젝트와 자연스럽게 맞음 |
Playwright는 클릭 같은 액션을 수행하기 전에 요소가 단일 요소로 확인되는지, visible인지, stable인지, 이벤트를 받을 수 있는지, enabled인지 등을 자동으로 확인합니다. 공식 문서에서는 이 기능을 auto-waiting과 actionability checks로 설명합니다.
Playwright의 단점
| Selenium보다 생태계 역사가 짧음 | 회사에 이미 Selenium Grid, Java 테스트 프레임워크, 레거시 코드가 많다면 전환 비용 발생 |
| WebDriver 표준 기반이 아님 | 조직 표준이 W3C WebDriver 또는 Selenium Grid라면 검토 필요 |
| 모든 언어 경험이 동일하지 않음 | 핵심 기능은 여러 언어에서 지원되지만, Node.js 생태계 경험이 가장 풍부한 편 |
| 브라우저 지원 범위가 Selenium과 다름 | IE, 특수 브라우저, 오래된 사내 환경 테스트는 Selenium 쪽 문서 확인 필요 |
| 크롤링용으로 남용하면 리소스 비용 증가 | 단순 HTML 수집에는 브라우저 실행이 과할 수 있음 |
5. Selenium이란?
Selenium은 오래된 도구라서 나쁜 것이 아니라, 오랫동안 브라우저 자동화의 표준 역할을 해온 도구입니다. Selenium 공식 사이트는 “브라우저를 자동화한다”는 점을 명확히 말하며, 주 목적은 웹 애플리케이션 테스트 자동화지만 웹 기반 관리 작업 자동화에도 사용할 수 있다고 설명합니다.
Selenium의 장점
| WebDriver 표준 기반 | 여러 브라우저와 드라이버, 원격 실행 인프라와 호환성이 좋음 |
| 다양한 언어 바인딩 | Java, Python, C#, Ruby, JavaScript 등 여러 언어 기반 프로젝트에서 사용 가능 |
| Selenium Grid | 여러 머신과 브라우저 버전에서 병렬 실행하는 테스트 인프라에 강함 |
| 기존 레퍼런스 풍부 | 오래된 프로젝트, 사내 QA 문서, 튜토리얼, 예제가 많음 |
| 레거시 시스템 대응 | 오래된 테스트 자산과 브라우저 조합을 유지해야 할 때 유리 |
Selenium 다운로드 문서는 핵심 언어 바인딩으로 .NET/C#, Ruby, Java, Python, JavaScript 등을 제공하고, Selenium Server는 Grid 구성을 위해 필요하다고 안내합니다. Selenium Grid는 WebDriver 스크립트를 원격 브라우저 인스턴스로 라우팅해 여러 머신에서 병렬 테스트를 실행할 수 있도록 설계되었습니다.
Selenium의 단점
| 대기 코드가 길어지기 쉬움 | 동적 페이지에서는 explicit wait를 적절히 설계하지 않으면 flaky해질 수 있음 |
| 드라이버·브라우저 호환성 고려 | Selenium Manager로 많이 쉬워졌지만, 특수 환경에서는 직접 드라이버를 관리해야 할 수 있음 |
| E2E 테스트 러너는 별도 조합 | pytest, JUnit, TestNG, Mocha 등과 함께 테스트 구조를 설계해야 함 |
| SPA 테스트 코드가 장황해질 수 있음 | 버튼 클릭 후 렌더링 완료, 모달 표시, Ajax 응답 대기를 직접 명시하는 경우가 많음 |
| Docker/Grid 구성은 강력하지만 복잡할 수 있음 | 대규모 테스트에는 좋지만 개인 프로젝트에는 설정 부담이 될 수 있음 |
Selenium Python API 문서는 현대 Selenium이 Selenium Manager를 통해 브라우저와 드라이버 설치 관리를 처리하며, 필요하면 직접 브라우저와 드라이버를 지정할 수 있다고 설명합니다.
6. 두 도구의 핵심 차이
핵심 차이는 “자동 대기와 테스트 경험”이다
Playwright와 Selenium의 가장 큰 차이는 “브라우저를 제어할 수 있느냐”가 아니라, 동적 웹앱에서 기다림을 어떻게 다루느냐입니다.
| 기본 철학 | 현대 웹앱 테스트를 빠르고 안정적으로 작성 | 표준 WebDriver 기반으로 브라우저를 폭넓게 자동화 |
| 대기 방식 | locator 액션과 assertion에 자동 대기 내장 | explicit wait로 조건을 명시하는 패턴이 중요 |
| 테스트 러너 | Playwright Test 기본 제공 | 언어별 테스트 프레임워크와 조합 |
| 디버깅 | Trace Viewer, Inspector, Codegen, HTML Report 활용 | 브라우저 DevTools, 로그, 스크린샷, Grid 관측 기능, 테스트 프레임워크 활용 |
| 대규모 인프라 | sharding, workers, CI guide | Selenium Grid, Docker Selenium, 클라우드 테스트 서비스 |
Selenium의 explicit wait는 특정 조건이 참이 될 때까지 반복적으로 확인하는 구조이고, 조건이 timeout 안에 충족되지 않으면 timeout error를 냅니다. Playwright는 locator 기반 actionability checks와 auto-waiting을 기본 흐름으로 제공합니다.
7. 크롤링 자동화 관점 비교
크롤링 자동화에서는 먼저 질문을 바꿔야 합니다.
“Playwright와 Selenium 중 무엇이 좋을까?”보다 먼저,
“브라우저를 꼭 띄워야 하는 페이지인가?”를 확인해야 합니다.
정적 HTML 크롤링
정적 HTML 페이지에서 상품명과 가격을 가져오는 정도라면 브라우저 자동화 도구는 과합니다. 이 경우 Python에서는 requests로 HTML을 가져오고 BeautifulSoup으로 파싱하는 방식이 더 단순합니다. Requests 공식 문서는 HTTP 요청을 쉽게 보낼 수 있는 라이브러리라고 설명하고, Beautiful Soup 공식 문서는 HTML/XML에서 데이터를 추출하기 위한 Python 라이브러리라고 설명합니다.
| HTML에 데이터가 이미 있음 | requests + BeautifulSoup |
| 여러 페이지를 체계적으로 크롤링 | Scrapy |
| JavaScript 실행 후 데이터가 나타남 | Playwright 또는 Selenium |
| 클릭, 스크롤, 모달, 로그인 후 화면 확인 | Playwright 또는 Selenium |
| 테스트 리포트와 CI가 중요 | Playwright 또는 Selenium + 테스트 프레임워크 |
Scrapy 공식 문서는 Scrapy를 구조화된 데이터를 추출하기 위한 고수준 웹 크롤링·스크래핑 프레임워크라고 설명하고, 동적 콘텐츠 문서에서는 브라우저에서 보이는 데이터가 Scrapy selector로 접근되지 않는 경우 먼저 데이터 소스를 찾고, 그래도 DOM 접근이 필요하면 headless browser를 고려하라고 안내합니다.
동적 페이지 크롤링
동적 페이지 크롤링에서는 Playwright가 초보자에게 조금 더 편한 경우가 많습니다. 이유는 locator와 자동 대기 덕분에 “클릭 후 기다리기”, “모달이 나타날 때까지 기다리기”, “목록 아이템이 늘어날 때까지 기다리기” 같은 코드가 간결해지는 편이기 때문입니다.
Selenium도 충분히 가능합니다. 다만 Selenium 크롤링에서는 explicit wait, expected conditions, selector 안정성, 브라우저/드라이버 환경을 더 명확히 설계해야 유지보수가 편합니다.
8. 테스트 자동화 관점 비교
E2E 테스트 자동화에서는 Playwright가 신규 프로젝트에 유리한 경우가 많습니다. Playwright Test는 설치 과정에서 TypeScript/JavaScript 선택, 테스트 폴더, GitHub Actions workflow 추가, 브라우저 설치 여부를 안내하고, 공식 CI 문서는 Docker 이미지 또는 CLI로 브라우저 의존성을 설치한 뒤 테스트를 실행하는 흐름을 제공합니다.
| 신규 E2E 프로젝트 | 매우 적합 | 가능하지만 테스트 러너 설계 필요 |
| 기존 QA 인프라 | 새로 구축해야 할 수 있음 | Selenium Grid, JUnit, TestNG, pytest 등 기존 자산 활용 |
| 리포트와 trace | 기본 도구가 강함 | 별도 리포터, 스크린샷, 로그, Grid 관측과 조합 |
| 병렬 실행 | workers, fullyParallel, sharding 제공 | Grid와 테스트 프레임워크 병렬 실행 조합 |
| 팀 표준화 | Playwright 설정 파일 중심 | 언어·프레임워크·Grid 구성에 따라 다양 |
Playwright의 Trace Viewer는 테스트 실행 후 기록된 trace를 탐색하는 GUI 도구이며, CI에서 실패한 테스트를 디버깅하는 데 유용하다고 공식 문서가 설명합니다.
9. 동적 페이지와 무한 스크롤 처리 비교
SPA, React, Vue, Next.js 페이지 자동화 비교
React, Vue, Next.js 같은 SPA에서는 초기 HTML에 데이터가 없고, JavaScript 실행 후 API 응답을 받아 화면이 완성되는 경우가 많습니다. 이런 페이지에서는 “페이지 로드 완료”만 기다려서는 부족합니다.
| 버튼 클릭 후 UI 변경 | locator.click 후 결과 locator를 기다림 | click 후 WebDriverWait로 결과 요소 조건 대기 |
| API 후 렌더링 | DOM 상태, 특정 텍스트, 응답 완료 조건을 기다림 | expected conditions 또는 JS 실행 결과 확인 |
| 모달 처리 | getByRole, getByText, locator 조합 | CSS/XPath + explicit wait |
| SPA 라우팅 | URL, heading, 특정 component 표시를 기준으로 대기 | URL 조건, 요소 존재/표시 조건 대기 |
| hydration 지연 | 요소가 actionable해질 때까지 기다림 | 클릭 가능 조건을 직접 대기 |
Playwright 문서는 현대 페이지가 load 이벤트 이후에도 lazy loading, 데이터 fetch, UI populate 등을 수행할 수 있어 “언제 loaded인가”는 페이지와 프레임워크에 따라 다르며, Playwright는 대상 요소가 actionable해질 때까지 자동으로 기다린다고 설명합니다.
무한 스크롤 페이지 처리 방식 비교
무한 스크롤 크롤링은 단순히 while True로 계속 내리면 안 됩니다. 수집 대상이 허용된 페이지인지 확인하고, 최대 스크롤 횟수, 최대 수집 개수, 요청 간격, 중복 제거, 종료 조건을 정해야 합니다.
| 스크롤 실행 | page.evaluate() 또는 mouse wheel | execute_script() |
| 새 아이템 대기 | locator count 증가, 특정 item 표시 대기 | WebDriverWait로 item count 증가 확인 |
| 종료 조건 | 더 이상 count 증가 없음, max scroll 도달 | 동일 |
| 초보자 난이도 | 낮음~보통 | 보통 |
| 유지보수 | locator 전략이 좋으면 안정적 | wait 조건을 잘 설계해야 안정적 |
10. Python 사용자에게 어떤 도구가 좋을까?
Python 사용자는 목적에 따라 나누는 것이 좋습니다.
| 정적 HTML 크롤링 | requests + BeautifulSoup |
| 대량 크롤링 파이프라인 | Scrapy |
| JavaScript 렌더링 크롤링 | Playwright 우선 검토 |
| 기존 Selenium 코드 유지 | Selenium 유지 |
| 사내 QA 테스트가 Java/Python Selenium 기반 | Selenium 유지 또는 일부 Playwright 전환 |
| 신규 E2E 테스트 | Playwright 추천 |
| 레거시 브라우저 조합 테스트 | Selenium 검토 |
Playwright 공식 문서는 Python에서 pytest 플러그인을 권장하며, 이 플러그인이 context isolation과 여러 browser configuration 실행 등을 제공한다고 설명합니다. Selenium은 Python 공식 API 문서와 WebDriver 바인딩이 제공되며, Selenium Manager로 드라이버 관리 부담이 예전보다 줄었습니다.
11. Node.js 사용자에게 어떤 도구가 좋을까?
Node.js 사용자라면 Playwright가 특히 자연스럽습니다. Playwright for Node.js는 자체 test runner, 병렬 실행, screenshot assertions, HTML reporter, automatic tracing 등을 제공한다고 공식 문서에서 설명합니다.
| Next.js, React 앱 E2E 테스트 | Playwright |
| Node.js 기반 크롤링 자동화 | Playwright |
| 기존 Selenium WebDriver JS 코드 유지 | Selenium |
| Selenium Grid 원격 브라우저 실행 | Selenium |
| 브라우저 자동화 + 테스트 리포트 빠른 구축 | Playwright |
Selenium도 JavaScript 바인딩을 제공하므로 Node.js에서 못 쓰는 것은 아닙니다. 다만 신규 프로젝트에서 E2E 테스트 도구를 고른다면 Playwright의 설정·테스트 러너·trace 경험이 더 단순하게 느껴질 가능성이 큽니다.
12. 실전 시나리오별 추천
| 1. 정적 HTML 상품명·가격 수집 | 가능하지만 브라우저 실행이 과할 수 있음 | 가능하지만 역시 과할 수 있음 | 낮음 | 보통 불필요 | 낮음 | requests + BeautifulSoup | 약관, robots.txt 확인. 브라우저 자동화는 비용 낭비일 수 있음 |
| 2. JavaScript 렌더링 쇼핑몰 목록 | 자동 대기와 locator로 간결 | 기존 Selenium 크롤링 예제가 많음 | 보통 | 아이템 locator 표시/개수 증가 대기 | Playwright가 조금 쉬움 | Playwright | 과도한 요청, 차단 우회, 개인정보 수집 금지 |
| 3. 로그인 후 마이페이지 확인 자동화 | storage state, locator, trace 활용 가능 | 기존 사내 로그인 테스트 자산 활용 가능 | 보통~높음 | 로그인 후 특정 UI/URL 대기 | 인증 흐름 변경 시 둘 다 유지보수 필요 | 사내 신규면 Playwright | 본인 계정·허가된 테스트 계정만 사용. 로그인 우회 금지 |
| 4. 무한 스크롤 게시글 수집 | count 증가 대기와 scroll loop 작성이 비교적 간결 | execute_script와 WebDriverWait 조합 가능 | 보통 | 새 item count 증가 대기 | 종료 조건 설계가 핵심 | Playwright | 무한 루프, 과도 요청, 비공개 데이터 수집 금지 |
| 5. 버튼 클릭 후 모달 데이터 추출 | role/text locator와 auto-waiting 유리 | explicit wait로 모달 표시 조건 명확히 가능 | 낮음~보통 | 모달 visible 대기 | selector 품질에 따라 달라짐 | Playwright | 모달이 iframe인지 shadow DOM인지 확인 |
| 6. E2E 회원가입 흐름 검증 | test runner, assertion, trace, parallel 편함 | 기존 Grid/테스트 프레임워크와 통합 좋음 | 보통 | 각 단계별 UI/URL/assertion 대기 | Playwright가 신규 프로젝트에 유리 | Playwright | 실제 이메일·SMS·개인정보 대신 테스트 환경 사용 |
13. 코드 예제 비교
아래 코드는 교육용 예제입니다. 특정 사이트에 과도한 요청을 보내거나, 캡차 우회, 로그인 우회, 유료 콘텐츠 수집, 봇 탐지 회피를 목적으로 작성한 코드가 아닙니다. 실제 크롤링 전에 robots.txt, 서비스 약관, 요청 빈도 제한, 개인정보 수집 가능 여부를 확인하세요.
자세한 코드는 아래 7. 코드 예제 섹션에 정리했습니다.
14. 유지보수와 디버깅 비교
| selector 유지보수 | role, text, test id locator 중심이면 안정적 | CSS/XPath 품질이 중요 |
| 대기 유지보수 | auto-waiting으로 코드가 짧아지는 편 | explicit wait 정책을 팀 표준으로 정해야 함 |
| 실패 분석 | Trace Viewer, HTML report, screenshot, video 활용 | 스크린샷, 로그, Grid UI, 테스트 리포트 조합 |
| 초보자 디버깅 | Codegen과 Inspector가 도움 | 브라우저 DevTools와 WebDriverWait 이해 필요 |
| 장기 유지보수 | 신규 SPA 프로젝트에 유리 | 레거시와 대형 QA 인프라에 유리 |
Playwright locator 문서는 CSS/XPath도 지원하지만 긴 CSS/XPath 체인은 DOM 구조 변화에 취약하며, role locator나 test id 같은 사용자 인식에 가까운 locator를 권장합니다. Selenium locator 문서 역시 CSS selector, XPath 등 다양한 locator 전략을 제공합니다.
15. 서버/Docker/CI 환경에서의 차이
Docker 서버에서 실행할 때
| 공식 Docker 이미지 | Playwright browsers와 시스템 의존성 포함 이미지 제공 | Selenium Standalone/Grid Docker 이미지 제공 |
| 개인 프로젝트 | Playwright가 단일 컨테이너 실행에 단순한 편 | standalone-chrome 같은 이미지로 가능 |
| 대규모 병렬 테스트 | workers, sharding 활용 | Selenium Grid가 강력 |
| 원격 브라우저 | Playwright Server 가능 | Remote WebDriver와 Grid가 전통적으로 강함 |
| 주의점 | untrusted site crawling에는 별도 사용자와 seccomp 권장 | Grid readiness, shared memory, browser node 관리 필요 |
Playwright Docker 문서는 이미지가 Playwright browsers와 browser system dependencies를 포함하지만 Playwright 패키지는 별도 설치해야 한다고 설명하며, 크롤링·스크래핑처럼 신뢰할 수 없는 사이트를 방문할 때는 별도 사용자와 seccomp profile을 권장합니다. Selenium Docker 문서는 standalone all-browsers 컨테이너, Hub/Nodes, Docker Compose, Kubernetes 배포, Grid ready 확인 등을 다룹니다.
병렬 실행과 CI/CD 연동
| 로컬 병렬 실행 | Playwright Test workers | pytest-xdist, JUnit/TestNG parallel 등과 조합 |
| CI 병렬화 | sharding으로 여러 job에 분산 | Selenium Grid 또는 클라우드 테스트 서비스 |
| GitHub Actions | init 과정에서 workflow 추가 가능 | 직접 workflow와 Grid 구성 |
| 실패 디버깅 | trace 파일과 HTML report 활용 | screenshot, logs, video, Grid observability 활용 |
Playwright는 기본적으로 test file을 병렬 실행하고 worker process를 사용하며, sharding으로 여러 머신에 테스트를 나눠 실행할 수 있습니다. Selenium Grid는 여러 머신에서 WebDriver 스크립트를 원격 브라우저 인스턴스로 라우팅하는 구조입니다.
16. 크롤링 시 법적·윤리적 주의사항
웹 자동화 추천 글에서 반드시 짚고 넘어가야 할 부분입니다. 기술적으로 가능하다고 해서 모두 해도 되는 것은 아닙니다.
반드시 확인할 것
| robots.txt | 사이트가 어떤 경로의 크롤링을 허용·제한하는지 확인 |
| 서비스 약관 | 자동화 접근, 데이터 수집, 재사용, 상업적 이용 제한 여부 확인 |
| 요청 빈도 제한 | 짧은 시간에 많은 요청을 보내지 않도록 제한 |
| 개인정보 | 이름, 이메일, 전화번호, 주소, 계정 정보 등 개인정보 수집 금지 또는 최소화 |
| 로그인 영역 | 본인 계정 또는 허가된 테스트 계정만 사용 |
| 유료 콘텐츠 | 권한 없는 수집·복제·재배포 금지 |
| 캡차·봇 탐지 | 우회 방법을 구현하지 말고, 공식 API나 허가된 접근 방식 사용 |
| 서버 부하 | 대상 사이트 운영에 피해를 주지 않도록 제한 |
Google Search Central은 robots.txt가 크롤러가 접근할 수 있는 URL을 알려주는 파일이며, 주로 사이트가 요청으로 과부하되는 것을 피하기 위해 사용된다고 설명합니다. IETF RFC 9309는 Robots Exclusion Protocol을 자동 클라이언트가 URI에 접근할 때 존중하도록 요청되는 규칙으로 정의하지만, 이 규칙이 접근 권한 부여 수단은 아니라고 설명합니다.
한국 개인정보 보호법은 개인정보 처리 목적을 명확히 하고, 목적에 필요한 범위에서 최소한의 개인정보만 적법하고 정당하게 수집해야 한다는 원칙을 둡니다. 크롤링 자동화에서 개인정보나 민감정보를 다룰 가능성이 있다면 기술 구현보다 법적 검토가 먼저입니다.
17. 최종 결론
Playwright를 추천하는 경우
Playwright는 다음 상황에서 특히 추천할 만합니다.
| 신규 E2E 테스트 프로젝트 | test runner, assertion, trace, parallel이 기본 제공 |
| React, Vue, Next.js 같은 SPA 자동화 | 자동 대기와 locator가 동적 UI에 유리 |
| Python 또는 Node.js로 동적 페이지 크롤링 | 클릭, 모달, 스크롤, JavaScript 렌더링 처리에 편함 |
| CI에서 빠르게 테스트를 돌리고 싶음 | 공식 CI/Docker 문서와 sharding 지원 |
| 초보자 또는 주니어 개발자 | Codegen, locator, auto-waiting 덕분에 시작이 비교적 쉬움 |
Selenium을 추천하는 경우
Selenium은 다음 상황에서 여전히 좋은 선택입니다.
| 기존 Selenium 프로젝트가 많음 | 전환 비용보다 유지·개선이 효율적일 수 있음 |
| Selenium Grid 인프라가 이미 있음 | 원격 브라우저, 다중 브라우저·버전 테스트에 강함 |
| Java, C#, Ruby 등 다양한 언어 팀 | 오래된 언어 바인딩과 레퍼런스가 풍부 |
| 레거시 브라우저 또는 특수 환경 테스트 | Selenium 생태계 문서와 경험이 많음 |
| 기업 QA 조직 | 기존 테스트 프레임워크, 리포터, Grid, 클라우드 서비스와 결합 쉬움 |
둘 다 적합하지 않은 경우
| 정적 HTML에서 데이터만 추출 | requests + BeautifulSoup |
| 대량 크롤링 파이프라인 | Scrapy |
| 공식 API가 제공됨 | API 사용 |
| 데이터가 JSON API로 공개 제공됨 | 브라우저 자동화보다 API 요청 |
| 크롤링 허용 여부가 불명확 | 수집하지 말고 허가 또는 공식 API 확인 |
| 캡차·로그인 우회가 필요함 | 자동화하지 않음 |
정리하면, Selenium 대체를 고민하는 신규 프로젝트라면 Playwright를 우선 검토할 가치가 큽니다. 하지만 Selenium은 오래된 도구라서 버릴 도구가 아니라, WebDriver 표준과 Grid, 레거시 테스트 자산이 있는 조직에서 여전히 강력한 선택입니다. “Playwright가 무조건 Selenium보다 낫다”가 아니라, 현대 웹앱 신규 자동화는 Playwright, 기존 대규모 WebDriver 인프라는 Selenium으로 보는 것이 현실적인 결론입니다.
6. 비교표
Playwright vs Selenium 상세 점수표
아래 점수는 공식 기능, 문서, 실무 사용성, 크롤링 자동화와 E2E 테스트 자동화 관점의 의사결정용 평가입니다. 직접 성능 벤치마크 결과가 아니며, 프로젝트 구조와 팀 환경에 따라 달라질 수 있습니다.
| 1. 설치와 초기 설정 난이도 | 4.6 | 4.1 |
| 2. 동적 페이지 처리 능력 | 4.8 | 4.2 |
| 3. 자동 대기 기능 | 4.9 | 3.8 |
| 4. selector/locator 안정성 | 4.8 | 4.0 |
| 5. Python 사용 편의성 | 4.4 | 4.3 |
| 6. Node.js 사용 편의성 | 4.8 | 4.0 |
| 7. 브라우저 지원 범위 | 4.3 | 4.8 |
| 8. 속도와 안정성 | 4.5 | 4.1 |
| 9. 디버깅 편의성 | 4.8 | 4.0 |
| 10. 병렬 실행 편의성 | 4.7 | 4.4 |
| 11. CI/CD 연동 편의성 | 4.7 | 4.3 |
| 12. 크롤링 자동화 적합성 | 4.5 | 4.1 |
| 13. E2E 테스트 자동화 적합성 | 4.9 | 4.3 |
| 14. 장기 유지보수성 | 4.5 | 4.6 |
| 15. 커뮤니티와 레퍼런스 | 4.4 | 4.9 |
| 평균 | 4.61 | 4.25 |
점수 해석
| 4.6 이상 | 신규 프로젝트에서 강력한 1순위 후보 |
| 4.0~4.5 | 목적에 따라 충분히 좋은 선택 |
| 3.5~3.9 | 특정 상황에서만 추천 |
| 3.4 이하 | 다른 도구와 비교 필요 |
Playwright는 최신 SPA와 E2E 테스트 작성 경험에서 강하고, Selenium은 장기 유지보수·브라우저 범위·커뮤니티·레거시 인프라에서 강합니다. Selenium은 WebDriver 표준과 다양한 브라우저 문서, Grid 생태계를 갖고 있고, Playwright는 자동 대기·locator·trace·parallel 실행이 잘 통합되어 있습니다.
7. 코드 예제
예제 1. 페이지 접속 후 제목 가져오기
Playwright Python
from playwright.sync_api import sync_playwright
# 교육용 예제입니다. 실제 크롤링 전 robots.txt와 약관을 확인하세요.
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com")
print(page.title())
browser.close()
Selenium Python
from selenium import webdriver
# 최신 Selenium은 Selenium Manager로 드라이버 관리를 도와줍니다.
driver = webdriver.Chrome()
try:
driver.get("https://example.com")
print(driver.title)
finally:
driver.quit()
예제 2. 특정 CSS selector의 텍스트 가져오기
Playwright Python
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")
# example.com에는 h1 요소가 있습니다.
heading = page.locator("h1").inner_text()
print(heading)
browser.close()
Selenium Python
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
try:
driver.get("https://example.com")
# CSS selector로 h1 요소를 찾습니다.
heading = driver.find_element(By.CSS_SELECTOR, "h1").text
print(heading)
finally:
driver.quit()
예제 3. 버튼 클릭 후 결과 기다리기
아래 예제는 본인 소유 또는 테스트 권한이 있는 페이지를 대상으로 가정한 코드입니다.
Playwright Python
from playwright.sync_api import sync_playwright, expect
TEST_URL = "https://your-owned-site.example/demo"
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(TEST_URL)
# 버튼 클릭 전에 Playwright가 자동으로 요소 상태를 확인합니다.
page.get_by_role("button", name="검색").click()
# 결과 영역이 보일 때까지 assertion이 자동으로 재시도됩니다.
result = page.locator("[data-testid='result']")
expect(result).to_be_visible(timeout=5000)
print(result.inner_text())
browser.close()
Selenium Python
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
TEST_URL = "https://your-owned-site.example/demo"
driver = webdriver.Chrome()
try:
driver.get(TEST_URL)
button = driver.find_element(By.CSS_SELECTOR, "button[data-testid='search']")
button.click()
# Selenium은 명시적 대기 조건을 직접 작성하는 방식이 중요합니다.
result = WebDriverWait(driver, 5).until(
EC.visibility_of_element_located((By.CSS_SELECTOR, "[data-testid='result']"))
)
print(result.text)
finally:
driver.quit()
예제 4. 무한 스크롤 기본 구조
아래 예제는 “허가된 테스트 페이지”를 대상으로 하는 기본 구조입니다. 실제 사이트에서 무한 스크롤 크롤링을 할 때는 최대 스크롤 횟수, 요청 간격, 중복 제거, robots.txt, 약관을 반드시 확인하세요.
Playwright Python
from playwright.sync_api import sync_playwright
TEST_URL = "https://your-owned-site.example/infinite-scroll"
MAX_SCROLLS = 5
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto(TEST_URL)
previous_count = 0
for _ in range(MAX_SCROLLS):
# 현재 게시글 개수 확인
items = page.locator("[data-testid='post-item']")
current_count = items.count()
# 새 아이템이 더 이상 늘지 않으면 종료
if current_count == previous_count and current_count > 0:
break
previous_count = current_count
# 페이지 하단으로 스크롤
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")
# 새 아이템이 렌더링될 시간을 제한적으로 기다립니다.
page.wait_for_timeout(1000)
for i in range(page.locator("[data-testid='post-item']").count()):
print(page.locator("[data-testid='post-item']").nth(i).inner_text())
browser.close()
Selenium Python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
TEST_URL = "https://your-owned-site.example/infinite-scroll"
MAX_SCROLLS = 5
driver = webdriver.Chrome()
try:
driver.get(TEST_URL)
previous_count = 0
for _ in range(MAX_SCROLLS):
items = driver.find_elements(By.CSS_SELECTOR, "[data-testid='post-item']")
current_count = len(items)
if current_count == previous_count and current_count > 0:
break
previous_count = current_count
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(1) # 실제 프로젝트에서는 WebDriverWait 조건으로 대체하는 것이 좋습니다.
items = driver.find_elements(By.CSS_SELECTOR, "[data-testid='post-item']")
for item in items:
print(item.text)
finally:
driver.quit()
짧은 Node.js 예제: Playwright로 제목 가져오기
import { chromium } from "playwright";
const browser = await chromium.launch({ headless: true });
const page = await browser.newPage();
await page.goto("https://example.com");
console.log(await page.title());
await browser.close();
8. 사용 사례별 추천표
| 정적 HTML 페이지에서 상품명·가격 가져오기 | requests + BeautifulSoup | 브라우저 실행 없이 빠르고 단순 |
| 여러 페이지를 체계적으로 수집 | Scrapy | spider, pipeline, retry, throttling 등 크롤링 구조화에 유리 |
| JavaScript 렌더링 크롤링 | Playwright | 자동 대기와 locator로 동적 UI 처리에 유리 |
| Selenium 크롤링 코드가 이미 있음 | Selenium 유지 | 전환보다 wait와 selector 개선이 비용 효율적일 수 있음 |
| 로그인 후 마이페이지 데이터 확인 자동화 | Playwright 또는 Selenium | 권한 있는 테스트 계정 기준으로 구현 |
| 무한 스크롤 크롤링 | Playwright 우선 | 새 item count 대기, locator 기반 구현이 간결 |
| 버튼 클릭 후 모달 데이터 추출 | Playwright | role/text locator와 auto-waiting이 편함 |
| 회원가입 E2E 테스트 | Playwright | 테스트 러너, assertion, trace, parallel 활용 가능 |
| Selenium Grid 기반 대형 QA | Selenium | 기존 Grid와 원격 브라우저 인프라 활용 |
| Java/C# 중심 기업 테스트 자동화 | Selenium | 레거시와 언어 바인딩, 기존 문서가 풍부 |
9. 선택 체크리스트
Playwright를 선택해도 좋은 경우
| ✅ | 신규 프로젝트인가? |
| ✅ | React, Vue, Next.js 같은 SPA인가? |
| ✅ | 버튼 클릭, 모달, 무한 스크롤, JavaScript 렌더링 처리가 많은가? |
| ✅ | E2E 테스트 리포트와 trace가 필요한가? |
| ✅ | Node.js 또는 Python 중심 프로젝트인가? |
| ✅ | Selenium Grid 같은 기존 인프라가 없는가? |
| ✅ | CI에서 빠르게 병렬 실행하고 싶은가? |
Selenium을 선택해도 좋은 경우
| ✅ | 기존 Selenium 프로젝트가 이미 많은가? |
| ✅ | Selenium Grid가 이미 운영 중인가? |
| ✅ | Java, C#, Ruby 등 기존 QA 언어 생태계를 유지해야 하는가? |
| ✅ | 다양한 브라우저 버전과 원격 실행 환경이 중요한가? |
| ✅ | WebDriver 표준 기반 도구를 써야 하는 조직인가? |
| ✅ | 레거시 자동화 코드를 유지해야 하는가? |
둘 다 쓰지 않는 것이 좋은 경우
| HTML에 데이터가 이미 있음 | requests + BeautifulSoup |
| 대량 페이지 수집이 목적 | Scrapy |
| 공식 API가 있음 | 공식 API |
| 자동화 접근이 약관상 금지 | 수집하지 않음 |
| 캡차 우회나 로그인 우회가 필요 | 구현하지 않음 |
| 개인정보 수집 가능성이 높음 | 법적 검토 후 최소 수집 또는 중단 |
10. FAQ
Q1. Playwright가 Selenium보다 무조건 좋은가요?
아닙니다. Playwright는 신규 E2E 테스트, SPA, 동적 페이지 자동화, 자동 대기, 디버깅 경험에서 강합니다. Selenium은 WebDriver 표준, 다양한 언어 바인딩, Selenium Grid, 기존 QA 인프라, 레거시 프로젝트에서 강합니다. 선택 기준은 “최신 도구인가”가 아니라 “내 프로젝트의 자동화 목적과 기존 인프라에 맞는가”입니다.
Q2. Selenium 대체로 Playwright를 바로 도입해도 되나요?
신규 프로젝트라면 Playwright를 먼저 검토할 만합니다. 하지만 기존 Selenium 테스트가 많다면 전체 전환보다 일부 신규 E2E 테스트부터 Playwright로 작성해보는 방식이 안전합니다. 특히 Grid, 리포트, 테스트 데이터, 로그인 세션, CI 파이프라인이 이미 Selenium 중심이라면 전환 비용을 먼저 계산해야 합니다.
Q3. 크롤링 자동화 도구로는 Playwright와 Selenium 중 무엇이 좋나요?
동적 페이지 크롤링, JavaScript 렌더링 크롤링, 무한 스크롤 크롤링, 버튼 클릭 후 모달 데이터 추출에는 Playwright가 더 간결한 경우가 많습니다. 다만 기존 Selenium 크롤링 코드가 안정적으로 돌아가고 있다면 굳이 바꾸지 않아도 됩니다. 정적 HTML 데이터 수집이라면 둘 다 과하고 requests, BeautifulSoup, Scrapy가 더 적합합니다.
Q4. Python 크롤링 자동화에는 Playwright가 좋나요?
Python에서도 Playwright는 좋은 선택입니다. 특히 동적 페이지, SPA, 클릭·스크롤·모달 처리가 필요한 경우 유용합니다. 다만 단순 HTML 파싱은 BeautifulSoup이 더 단순하고, 대량 크롤링 파이프라인은 Scrapy가 더 적합할 수 있습니다.
Q5. Node.js 크롤링 자동화에는 무엇을 추천하나요?
Node.js 사용자라면 Playwright가 자연스럽습니다. Playwright for Node.js는 자체 test runner와 병렬 실행, tracing, reporter 경험이 좋습니다. Selenium도 JavaScript 바인딩이 있지만, 신규 Node.js E2E 테스트나 브라우저 자동화 도구를 고른다면 Playwright를 우선 검토하는 편이 일반적으로 합리적입니다.
Q6. Playwright와 Selenium으로 캡차 우회나 차단 회피를 구현해도 되나요?
이 글에서는 캡차 우회, 로그인 우회, 봇 탐지 회피, 유료 콘텐츠 수집, 약관 위반 자동화 방법을 다루지 않습니다. 자동화가 필요한 경우 공식 API, 허가된 테스트 환경, 본인 소유 서비스, 명시적으로 허용된 데이터만 대상으로 해야 합니다.
Q7. 무한 스크롤 크롤링은 어떻게 안전하게 설계해야 하나요?
최대 스크롤 횟수, 최대 수집 개수, 중복 제거, 요청 간격, 종료 조건을 반드시 넣어야 합니다. while True로 계속 스크롤하는 방식은 피해야 합니다. 또한 robots.txt, 서비스 약관, 개인정보 포함 여부, 서버 부하 가능성을 먼저 확인해야 합니다.
'DEVEL > PYTHON' 카테고리의 다른 글
| Playwright로 이벤트 랜딩페이지 테스트 자동화하기: 매번 다른 페이지를 어떻게 검증할까? (0) | 2026.06.23 |
|---|---|
| Playwright Python 무한 스크롤 크롤링 예제: 동적 페이지 데이터 수집 실전 가이드 (0) | 2026.06.16 |
| Python - 맥OS에서 파이썬 설치 및 개발하기 (0) | 2025.09.02 |
| 파이썬 requests 완전 정복: 대안 라이브러리 비교, 장단점, 실전 예제 (0) | 2025.09.02 |
| Python Playwright를 이용한 스크래핑 (4) | 2024.08.31 |