용어집 · UI 자동화
XPath
다른 이름: XPath 표현식, XPath expression, XPath 로케이터, XPath locator
정의
XML이나 HTML 문서에서 노드를 선택하는 쿼리 언어로, UI 자동화에서 구조·속성·텍스트로 요소를 찾는 데 사용합니다.
XPath(XML Path Language)는 문서 트리를 따라 원하는 노드까지 가는 경로를 기술합니다. 테스트 자동화에서는 로케이터를 작성하는 방법 중 하나이며, CSS에 비해 가장 큰 장점은 텍스트 내용으로 매칭할 수 있고 어느 방향으로든, 즉 위로는 부모, 옆으로는 형제, 아래로는 자손까지 이동할 수 있다는 점입니다. 브라우저는 XPath 1.0을 구현하므로 matches()나 lower-case() 같은 이후 버전의 함수는 쓸 수 없습니다.
예시
//button[normalize-space()='Sign in']
//input[@name='email']
//label[text()='Password']/following-sibling::input
//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']
//a[contains(@href, '/invoices/')]
네 번째 줄은 사람들이 XPath를 찾는 이유를 보여 줍니다. 특정 셀을 포함하는 테이블 행을 찾은 다음, 그 행 안의 버튼을 찾는 것입니다.
WebElement cancel = driver.findElement(
By.xpath("//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']"));
절대 경로와 상대 경로
절대 XPath는 루트에서 시작하며(/html/body/div[2]/form/button), 감싸는 요소 하나만 바뀌어도 바로 깨집니다. 상대 XPath는 //로 시작하고 의미 있는 요소를 기준점으로 삼습니다. DevTools에서 “Copy full XPath”로 복사하면 절대 경로가 나오는데, 테스트에서 원하는 형태는 거의 아닙니다.
흔한 실수
(//div)[7]같은 인덱스 기반 경로. 의미가 아니라 레이아웃을 담고 있습니다.- 중첩 마크업이 있는 요소에
text()를 쓰는 것. 라벨이 자식<span>안에 있으면//button[text()='Save']는 실패합니다.normalize-space()(또는.)는 전체 문자열 값을 사용합니다. @class='btn'으로 클래스를 매칭하는 것. 이 방식은 속성 전체가btn일 때만 매칭됩니다.contains(concat(' ', normalize-space(@class), ' '), ' btn ')를 쓰거나 CSS.btn으로 바꾸십시오.- 습관적으로 XPath부터 쓰는 것. Playwright에서는
getByRole과getByText가 텍스트 기반 사례 대부분을 처리하며 가독성도 더 좋습니다.