Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

Selenium에서 id, name, xpath, CSS 중 어떤 로케이터를 사용해야 할까?

웹 자동화 테스트에서 요소를 찾는 각 로케이터(locator)마다 고유한 장점과 용도가 있습니다. 어떤 것을 선택할지는 페이지의 구조와 상황에 따라 달라집니다.

로케이터 선택 기준

페이지에 고유한 속성 값(unique attribute)이 존재한다면, 가장 먼저 해당 속성을 활용하는 것이 좋습니다. 예를 들어 id나 name이 유일하게 존재한다면 이것이 가장 안정적이고 빠른 방법입니다.

반면 고유한 속성이 없다면 CSS 셀렉터를 사용하는 것이 권장됩니다. CSS 셀렉터는 속도 면에서 효율적이기 때문입니다.

CSS 셀렉터의 한계

CSS 셀렉터에는 하나의 단점이 있습니다. 바로 자식 노드에서 부모 노드로 거슬러 올라가는 탐색(역방향 이동)이 불가능하다는 점입니다.

XPath의 장점

XPath는 이러한 역방향 탐색을 지원합니다. XPath는 Selenium에서 가장 널리 사용되는 로케이터로, DOM 요소와 속성을 자유롭게 순회하며 대상 객체를 식별할 수 있습니다.

Absolute XPath vs Relative XPath

XPath는 두 가지 방식으로 표현됩니다. 바로 단일 슬래시(/)와 이중 슬래시(//)입니다.

절대 경로(Absolute Path) — 단일 슬래시(/)

단일 슬래시는 절대 경로를 의미합니다. 이 경우 XPath는 DOM에서 루트(root) 노드부터 시작해 부모에서 자식으로 직접 이동하며, 루트 노드부터 목표 요소까지 전체 경로를 명시해야 합니다.

문법 —

driver.findElement(By.xpath("/html/body/div/input")).

상대 경로(Relative Path) — 이중 슬래시(//)

이중 슬래시는 상대 경로를 의미합니다. 이 경우 XPath는 특정 시작 지점 없이 DOM 전체 영역에서 일치하는 요소를 검색합니다.

문법 —

driver.findElement(By.xpath("//input[@name='Tutorial']")).

어떤 것을 사용해야 할까?

항상 절대 경로보다는 상대 경로(relative xpath)를 사용하는 것이 권장됩니다. 절대 경로는 루트부터 원하는 요소까지 모든 경로를 지정해야 하므로, 중간에 있는 어떤 속성이나 값이라도 변경되면 XPath가 더 이상 유효하지 않게 됩니다. 반면 상대 경로는 페이지 구조 변화에 훨씬 유연하게 대응할 수 있습니다.

예제 코드

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
public class TextMatch {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\ghs6kor\\Desktop\\Java\\chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        String url = " https://www.tutorialspoint.com/questions/index.php";
        driver.get(url);
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        //xpath로 요소 식별
        driver.findElement(By.xpath("//input[@class='gsc-input']")).click();
        driver.close();
    }
}