liminfo

Selenium Reference

Selenium 웹 자동화 레퍼런스

41개 결과

Selenium Reference 소개

이 Selenium 레퍼런스는 Python 기반 Selenium WebDriver를 위한 검색 가능한 치트시트로, 드라이버, 선택자, 액션, 대기, 프레임, 알림, 스크린샷, 설정의 여덟 가지 카테고리로 구성되어 있습니다. 모든 항목에는 테스트 스위트나 자동화 스크립트에 바로 붙여넣을 수 있는 실전용 코드 스니펫이 포함됩니다. pytest로 E2E 테스트를 작성하든, 웹 스크레이퍼를 구축하든, 반복적인 폼 제출을 자동화하든 가장 많이 사용하는 WebDriver 패턴을 즉시 참조할 수 있습니다.

Selenium WebDriver는 표준화된 프로토콜을 통해 브라우저와 통신하며 Chrome, Firefox, Edge, Safari를 프로그래밍 방식으로 제어합니다. 학습 곡선은 주로 두 가지에 집중됩니다: 올바른 선택자 전략 선택(ID vs CSS vs XPath)과 명시적 대기를 통한 비동기 페이지 로드 처리입니다. 이 레퍼런스는 두 주제 모두를 여러 항목으로 다루며, 타이밍 문제로 인한 불안정한 테스트를 방지하는 presence_of_element_located, visibility_of_element_located, element_to_be_clickable 같은 expected_conditions 패턴을 보여줍니다.

또한 고급 상호작용 패턴도 다룹니다. 호버 메뉴와 드래그 앤 드롭을 위한 ActionChains, 드롭다운 조작을 위한 Select 래퍼, 임베디드 콘텐츠를 위한 iframe 전환, 스크롤링과 DOM 조작을 위한 execute_script를 통한 JavaScript 실행 등이 있습니다. 설정 항목에서는 헤드리스 모드, 페이지 로드 전략, 쿠키 관리, 커스텀 Service 경로를 설명하여 로컬 개발과 CI/CD 파이프라인 실행 모두에 필요한 설정 지식을 제공합니다.

주요 기능

  • 헤드리스 모드와 커스텀 인자를 위한 ChromeOptions를 포함한 Chrome, Firefox 드라이버 초기화
  • By.ID, By.CSS_SELECTOR, By.XPATH, By.NAME, By.CLASS_NAME, By.LINK_TEXT 여섯 가지 선택자 전략과 find_element/find_elements
  • 존재, 표시, 클릭 가능, 텍스트, URL 변경에 대한 expected_conditions를 활용한 WebDriverWait 명시적 대기 패턴
  • 호버, 연속 클릭, 컨텍스트 메뉴를 포함한 복합 상호작용을 위한 ActionChains
  • select_by_visible_text, select_by_value, select_by_index를 지원하는 드롭다운 요소용 Select 래퍼
  • 프레임 및 창 전환 — switch_to.frame(), switch_to.window(), switch_to.default_content(), parent_frame 탐색
  • accept, dismiss, send_keys, alert_is_present 대기 조건을 포함한 알림(Alert) 처리
  • 페이지 및 요소 수준 스크린샷 캡처와 JavaScript 기반 스크롤링 및 DOM 쿼리를 위한 execute_script

자주 묻는 질문

이 레퍼런스는 어떤 Selenium 버전을 다루나요?

Python용 Selenium 4.x의 최신 WebDriver API를 기준으로 합니다. Selenium 3과의 주요 차이점은 드라이버 경로를 위한 Service 클래스 사용, By 기반 로케이터 전략, Chrome DevTools Protocol 기본 지원 등이 있습니다.

CSS 선택자와 XPath는 언제 구분해서 사용해야 하나요?

CSS 선택자는 대부분의 경우 더 빠르고 가독성이 좋습니다. ID, 클래스, 속성, 구조적 관계를 타겟팅하는 데 적합합니다. 텍스트 내용으로 매칭하거나(//button[text()="제출"]), 부모 요소로 위쪽 탐색이 필요하거나, CSS로 표현할 수 없는 복잡한 조건 로직이 필요할 때 XPath를 사용하세요.

암시적 대기(implicit wait)와 명시적 대기(explicit wait)의 차이는 무엇인가요?

암시적 대기는 find_element 호출이 NoSuchElementException을 발생시키기 전에 DOM을 폴링하는 전역 타임아웃을 설정합니다. 명시적 대기(WebDriverWait + expected_conditions)는 특정 요소의 특정 조건을 기다리므로 훨씬 세밀한 제어가 가능합니다. 두 가지를 혼합하면 예측 불가능한 타임아웃 동작이 발생할 수 있어 권장하지 않습니다.

JavaScript로 동적 로드되는 페이지는 어떻게 처리하나요?

적절한 expected_condition과 함께 WebDriverWait를 사용하세요. AJAX 콘텐츠에는 EC.presence_of_element_located나 EC.visibility_of_element_located를 사용하고, URL 해시가 변경되는 SPA에는 EC.url_contains를 사용합니다. time.sleep()은 임의의 지연으로 불안정한 테스트를 만들므로 피해야 합니다.

헤드리스 모드에서 Selenium 테스트를 실행하려면 어떻게 하나요?

ChromeOptions에 --headless를 추가합니다: options.add_argument("--headless"). CI/CD 파이프라인에서는 컨테이너 환경의 리소스 문제를 방지하기 위해 --no-sandbox와 --disable-dev-shm-usage도 함께 추가하세요. 헤드리스 모드는 보이는 브라우저 창 없이 실행되지만 스크린샷을 포함한 모든 WebDriver 작업을 지원합니다.

iframe 내부의 요소와 상호작용하려면 어떻게 하나요?

먼저 driver.switch_to.frame(element)로 iframe 컨텍스트로 전환합니다. element는 iframe 태그입니다. 작업을 수행한 후 driver.switch_to.default_content()로 메인 페이지로 돌아갑니다. 중첩된 iframe의 경우 switch_to.parent_frame()으로 한 단계씩 위로 이동할 수 있습니다.

테스트가 StaleElementReferenceException으로 간헐적으로 실패하는 이유는 무엇인가요?

찾은 DOM 요소가 페이지에서 다시 렌더링되거나 분리되었을 때 발생합니다. 일반적인 해결 방법은 페이지 변경 후 요소를 다시 찾거나, WebDriverWait로 업데이트된 요소를 기다리거나, try/except 블록에 재시도 로직을 감싸는 것입니다. 주로 페이지 이동, AJAX 업데이트, 프레임워크 재렌더링 후에 자주 발생합니다.

Java나 JavaScript Selenium에도 이 레퍼런스를 참고할 수 있나요?

선택자, 대기, ActionChains, 프레임 전환 등의 API 패턴과 개념은 모든 Selenium 언어 바인딩에서 동일합니다. import 경로와 구문만 다릅니다. 여기의 Python 예제는 동등한 Java(WebDriverWait, ExpectedConditions) 및 JavaScript(until, By) 코드에 직접 대응됩니다.