Selenium은 웹 애플리케이션 테스트와 자동화를 위한 강력한 도구이며, 그 핵심은 바로 HTML 요소를 얼마나 정확하고 안정적으로 탐색하느냐에 달려 있습니다. 요소 탐색이 불안정하면 테스트가 자주 실패하거나 유지보수가 어려워질 수 있으므로, 다양한 요소 선택 전략을 이해하고 상황에 맞게 활용하는 것이 매우 중요합니다. 이 글에서는 Selenium에서 제공하는 주요 요소 탐색 방법과 그 활용 팁을 정리합니다.
기본 선택자: id, name, class 활용
Selenium에서 가장 간단하고 빠르게 사용할 수 있는 요소 선택 방식은 기본 HTML 속성인 id
, name
, class
를 이용하는 것입니다. 다음은 대표적인 사용 예입니다:
driver.find_element(By.ID, "login-input")
driver.find_element(By.NAME, "email")
driver.find_element(By.CLASS_NAME, "btn-primary")
id 선택자는 가장 빠르고 안정적인 방법으로, 가능한 한 id
를 사용하는 것이 권장됩니다. 하지만 모든 요소에 id가 있는 것은 아니기 때문에 상황에 따라 다른 선택자가 필요합니다. class
속성은 한 페이지 내에 여러 요소가 공유할 수 있으므로 단일 요소 탐색 시 주의가 필요합니다. find_elements
를 통해 다수의 요소를 리스트 형태로 가져올 수도 있습니다.
이러한 기본 선택자들은 HTML 구조가 단순하거나 정적일 때 매우 유용하지만, 구조가 복잡하거나 동적으로 변하는 페이지에서는 한계가 있을 수 있습니다. 따라서 다음 단계로는 XPath, CSS Selector 등의 고급 탐색 기법이 필요합니다.
XPath를 활용한 유연한 탐색
XPath
는 XML 및 HTML 문서의 노드를 경로 기반으로 탐색하는 강력한 언어로, Selenium에서 매우 자주 사용되는 선택자 방식입니다. XPath는 요소의 위치, 속성, 텍스트, 계층 구조까지 기준으로 삼을 수 있어 매우 유연합니다. 예시를 살펴보면 다음과 같습니다:
driver.find_element(By.XPATH, "//input[@type='text']")
driver.find_element(By.XPATH, "//div[@class='card']//button[text()='확인']")
driver.find_element(By.XPATH, "//*[@id='user-form']/div[2]/input")
절대 경로(/html/body/div [1]/...)보다는 상대 경로(//div[@class=...])를 사용하는 것이 유지보수에 유리합니다. XPath는 다양한 조건을 조합하여 매우 정밀한 탐색이 가능하지만, 잘못 사용하면 성능에 영향을 줄 수 있으므로 간결하면서도 명확한 경로를 작성하는 것이 중요합니다.
또한 XPath는 동적으로 생성되는 요소나 클래스명이 반복되는 요소 탐색에 특히 유리합니다. 예를 들어 텍스트 일치 여부로 버튼을 찾거나, 특정 속성 조합으로만 구별되는 요소를 정확히 선택할 수 있습니다. 복잡한 UI 테스트나 비동기 페이지 로딩이 많은 SPA 구조에서는 XPath가 강력한 무기가 됩니다.
CSS Selector와 기타 전략
CSS Selector
는 CSS에서 사용하는 방식과 동일하게 요소를 선택하는 방법으로, 짧고 간결한 문법으로도 정밀한 선택이 가능합니다. 다음은 예시입니다:
driver.find_element(By.CSS_SELECTOR, "#login-form input[type='text']")
driver.find_element(By.CSS_SELECTOR, ".card > .btn.submit")
CSS Selector는 XPath보다 가독성이 좋고 브라우저 성능도 다소 더 나은 경우가 많습니다. 계층 관계, 속성 조합, 자식/형제 요소 탐색에 탁월하며, 프런트엔드 프레임워크에서 공통 클래스 구조가 사용될 때 유용하게 활용됩니다. nth-child
, :first-child
등의 의사 클래스도 활용할 수 있어 반복되는 리스트 요소에서도 활용도가 높습니다.
이 외에도 link text
또는 partial link text
같은 전략을 통해 텍스트 기반으로 링크를 탐색할 수 있고, tag name
을 활용하여 특정 태그 전체를 탐색하는 것도 가능합니다. 상황에 따라 wait
와 함께 조합하여 요소가 완전히 로드된 후 탐색하도록 설정하는 것이 좋습니다. 예:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "submit")))
복합적인 페이지 구조에서는 XPath와 CSS Selector를 혼합하거나, 프레임이나 팝업 같은 특수 구조를 고려한 탐색 전략이 필요합니다. 안정적인 테스트를 위해서는 선택자의 재사용성과 명확성, 그리고 유지보수 가능성을 고려해 선택자를 구성해야 합니다.
Selenium에서 요소 탐색은 테스트 자동화의 핵심이자 가장 빈번한 작업입니다. 기본 선택자부터 XPath, CSS Selector까지 다양한 방법을 상황에 맞게 조합하면 더 강력하고 안정적인 자동화 스크립트를 작성할 수 있습니다. 선택자의 설계는 테스트의 신뢰성과 유지보수에 직결되므로, 전략적으로 구성해 보세요.