HOWTO · Python

Python에서 Selenium을 사용하여 텍스트로 요소를 찾는 방법

이 튜토리얼에서는 Python에서 Selenium을 사용하여 텍스트로 요소를 찾는 방법을 보여줍니다. XPath, CSS 선택자, 링크 텍스트 기법 등 다양한 방법을 배워 웹 자동화 기술을 향상시켜 보세요. 초보자와 숙련된 개발자 모두에게 적합한 이 가이드는 실용적인 예제와 명확한 설명을 제공하여 복잡한 웹 페이지를 효율적으로 탐색할 수 있도록 도와줍니다.

이 페이지의 내용

Selenium의 By.XPATH 로케이터는 표시되는 텍스트로 페이지 요소를 찾기 위한 일반적인 선택입니다. 앵커에는 링크 텍스트 로케이터를 사용하세요. CSS 선택자는 자체적으로 텍스트와 일치하지 않으므로, 필요할 때는 CSS 선택과 텍스트 확인을 결합하세요. 아래 로케이터 스니펫은 Selenium 4 API를 사용합니다. 브라우저 예제에는 Selenium과 구성된 브라우저 드라이버가 필요합니다. 독립 실행형 Python 예제는 이러한 외부 종속성 없이 정확한 텍스트 일치를 보여줍니다.

방법 1: XPath를 사용하여 텍스트로 요소 찾기

대상이 직접 텍스트 노드인 경우 //*[text()='About Us']를 사용하세요. 추가 공백이나 중첩된 요소가 포함될 수 있는 텍스트의 경우, //*[normalize-space(.)='About Us']는 공백을 다듬고 축소한 뒤 요소의 모든 하위 텍스트를 결합한 값과 비교합니다. 여러 요소가 같은 텍스트를 포함할 수 있는 경우 태그나 속성으로 범위를 좁히세요.

이 독립 실행형 텍스트 일치 예제를 실행하세요:

from html.parser import HTMLParser

class LinkTextParser(HTMLParser):
    def __init__(self):
        super().__init__()
        self.in_link = False
        self.links = []

    def handle_starttag(self, tag, attrs):
        if tag == "a":
            self.in_link = True
            self.links.append("")

    def handle_endtag(self, tag):
        if tag == "a":
            self.in_link = False

    def handle_data(self, data):
        if self.in_link:
            self.links[-1] += data

html = '<a href="#about">About Us</a><a href="#help">Help</a>'
parser = LinkTextParser()
parser.feed(html)
matches = [link.strip() for link in parser.links if link.strip() == "About Us"]
print(matches[0])
About Us

이 예제는 고정된 HTML 문자열에 대한 텍스트 비교를 보여주며, 브라우저를 구동하지는 않습니다. Selenium에서는 페이지가 비동기적으로 렌더링하는 경우 대상을 기다리세요. 예를 들어 WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, "//*[normalize-space(.)='About Us']")))를 사용합니다. 조회가 실패하더라도 정리가 이루어지도록 finally 블록에서 드라이버를 닫으세요.

방법 2: CSS 선택자를 사용하여 텍스트로 요소 찾기

CSS에는 표준 표시 텍스트 선택자가 없습니다. 먼저 관련 후보의 작은 집합을 선택한 다음 브라우저에서 그 텍스트를 비교하세요. 예를 들어 document.querySelectorAll('button.action')로 버튼을 선택하고 textContent.trim()이 요청한 레이블과 같은 버튼을 찾습니다. 넓은 쿼리는 컨테이너와 그 자식 모두와 일치할 수 있고, textContent에는 숨겨진 하위 텍스트도 포함되므로, 특정 선택자를 사용하고 이러한 구분이 중요한 경우 표시 여부를 확인하세요. Selenium은 driver.execute_script(...)로 이 확인을 실행할 수 있습니다. 동적 콘텐츠를 쿼리하기 전에 관련 컨테이너를 기다리세요.

방법 3: 링크 텍스트와 부분 링크 텍스트 사용하기

앵커 요소에 대해 Selenium은 By.LINK_TEXT와 By.PARTIAL_LINK_TEXT를 제공합니다. 예를 들어 driver.find_element(By.LINK_TEXT, "Python documentation")는 정확한 링크 레이블을 찾고, driver.find_element(By.PARTIAL_LINK_TEXT, "Python guide")는 해당 구를 포함하는 링크를 찾습니다. 이러한 로케이터는 버튼, 제목 또는 기타 요소 유형에는 적용되지 않습니다. 링크가 초기 페이지 로드 후 추가되는 경우 명시적 대기를 사용하고, 링크 레이블이 비슷한 경우 정확한 텍스트를 선호하세요.

결론

일반적인 텍스트 일치에는 XPath를 선택하세요. 특히 공백이나 요소 관계가 중요한 경우에 그렇습니다. CSS는 후보를 좁힐 수 있지만 별도의 텍스트 비교가 필요합니다. 링크 텍스트 로케이터는 앵커에 간결합니다. 조회에서 예상한 요소를 찾지 못하면 그 텍스트와 유형을 확인하고, 여러 요소가 일치하는지 확인하며, 고정된 지연에 의존하지 말고 클라이언트에서 렌더링되는 콘텐츠를 기다리세요.

FAQ

  1. Python용 Selenium은 어떻게 설치하나요? python -m pip install selenium으로 Selenium 패키지를 설치합니다. Python에는 time 모듈이 포함되어 있으며, 설치할 패키지가 아닙니다. 브라우저 제어에는 지원되는 브라우저와 드라이버 설정도 필요합니다.

  2. Selenium은 어떤 브라우저를 제어할 수 있나요? Selenium은 브라우저 드라이버를 통해 Chrome, Firefox, Safari, Edge와 같은 일반적인 브라우저를 제어할 수 있습니다. 사용 가능 여부는 운영 체제와 설치된 브라우저에 따라 다릅니다.

  3. Selenium을 헤드리스로 실행할 수 있나요? 예. 드라이버를 만들기 전에 드라이버 옵션에서 브라우저의 헤드리스 옵션을 설정하세요. 헤드리스 모드에서도 브라우저와 드라이버 설정이 필요합니다.

  4. XPath와 CSS는 언제 사용해야 하나요? XPath는 텍스트와 일치하고 DOM의 관계를 탐색할 수 있습니다. CSS는 요소, 클래스, 속성으로 선택하지만 표준 텍스트 일치는 없습니다. 필요한 경우 별도의 텍스트 확인을 추가하세요.

  5. Selenium으로 단일 페이지 애플리케이션을 테스트할 수 있나요? 예. 애플리케이션이 업데이트된 후 예상되는 요소나 상태를 기다리세요. 탐색이 성공했다고 해서 클라이언트에서 렌더링되는 콘텐츠가 준비되었다는 보장은 없습니다.