반응형

1. 소개

 

Selenium을 통해 페이지에 있는 요소를 찾는 것은 여러가지 방법이 있습니다. Selenium 에서는 By 클래스를 통해 다양한 속성으로 이용이 가능합니다.(By Strategy) 먼저 현재 사용하고 있는 Selenium 라이브러리의 버전은 다음과 같습니다.

 

Version
Selenium = 4.3.0.
(향후 업데이트가 될 경우 아래 소개되는 내용은 이용이 불가능할 수 있으니 버전을 꼭 확인하시기 바랍니다)

 

전반적인 내용은 Selenium의 문서를 가져왔으며, 구성이나 번역은 제가 이해하기 쉽도록 바꾸었습니다. 원본에 대한 내용을 확인하고 싶으신 경우 아래 링크를 확인하시기 바랍니다.

 

Selenium Python Docs

 

적용은 아래 예시처럼 find_element 메서드를 활용해 가능합니다. 만약에 찾고자 하는 요소가 없다면, NoSuchElementException 예외가 발생합니다. 여러 요소를 찾을 경우에는 find_elements 메서드를 활용할 수 있습니다.

 

from selenium import webdriver
from selenium.webdriver.common.by import By
# 기본 작업 : driver 작동 및 웹페이지 접근
driver = webdriver.Chrome()
driver.get("address")

# 페이지 탐색 방법
driver.find_element(By.ID, "id")
driver.find_element(By.NAME, "name")
driver.find_element(By.XPATH, "xpath")
driver.find_element(By.LINK_TEXT, "link text")
driver.find_element(By.PARTIAL_LINK_TEXT, "partial link text")
driver.find_element(By.TAG_NAME, "tag name")
driver.find_element(By.CLASS_NAME, "class name")
driver.find_element(By.CSS_SELECTOR, "css selector")

 

2. Selenium에서 요소(Element) 찾기

2.1. Id 로 찾기

id 속성을 알고 있는 경우, 사용할 수 있는 방법입니다. 아래는 페이지 소스 예시입니다. (이후 케이스에서도 활용)

<html>
 <body>
  <form id="loginForm">
   <input name="username" type="text" />
   <input name="password" type="password" />
   <input name="continue" type="submit" value="Login" />
  </form>
 </body>
</html>

여기서 id인 loginForm을 찾기 위해서는 아래와 같이 코드를 사용합니다.

login_form = driver.find_element(By.ID, 'loginForm')

 

2.2. 이름으로 찾기

이름 속성을 아는 경우 사용할 수 있는 방법입니다. 2.1에서 사용한 페이지 소스 예시에서 username과 password란 name의 요소를 찾고자 하는 경우 아래와 같이 구현이 가능합니다.

username = driver.find_element(By.NAME, 'username')
password = driver.find_element(By.NAME, 'password')

 

2.3. XPath로 찾기

XPath는 W3C 표준으로 XML 문서 구조를 통해 노드를 찾도록 사용되는 언어입니다. XPath는 절대항으로 찾거나 상대적인 속성을 통해 찾을 수 있습니다. 2.1.에서 사용한 페이지 소스 예시에서 loginForm을 XPath를 활용하여 아래 코드와 같이 찾을 수 있습니다.

login_form = driver.find_element(By.XPATH, "/html/body/form[1]")       # Absoulte Path
login_form = driver.find_element(By.XPATH, "//form[1]")                # 1st form element 
login_form = driver.find_element(By.XPATH, "//form[@id='loginForm']")  # attribute id

XPath에 대한 더 세부적인 사용법을 공부할 수 있는 컨텐츠를 W3C나 W3School에서 제공하고 있습니다. XPath를 더욱 잘 활용하기 위해 공부를 하고 싶다면 아래 링크를 통해 접근할 수 있습니다.

W3C XPath

W3School (Xpath_Syntax)

 

2.4. 하이퍼링크 찾기

링크가 달려있는 텍스트를 알고 있다면 사용가능한 방법입니다. 새로운 페이지 소스 예시입니다. 안에는 앵커태그()가 있고 안에는 href 속성을 통해 보여주고자 하는 html을 정의하고 있습니다.

<html>
 <body>
  <p>Are you sure you want to do this?</p>
  <a href="continue.html">Continue</a>
  <a href="cancel.html">Cancel</a>
</body>
</html>

continue.html 로 가는 링크를 찾기 위해서는 아래와 같이 찾을 수 있습니다.

continue_link = driver.find_element(By.LINK_TEXT, 'Continue')
continue_link = driver.find_element(By.PARTIAL_LINK_TEXT, 'Conti')

 

2.5. 태그 이름으로 찾기

BeautifulSoup에서도 많이 활용되는 방법인데, 태그 이름을 가지고도 찾을 수 있습니다. 아래와 같은 페이지 소스가 있다고 가정합니다.

<html>
 <body>
  <h1>Welcome</h1>
  <p>Site content goes here.</p>
</body>
</html>

여기서 "Welcome"이라는 문구가 적힌 h1 태그이름을 알고 있다면 아래와 같이 찾을 수 있습니다.

heading1 = driver.find_element(By.TAG_NAME, 'h1'))

 

2.6. 클래스 이름으로 찾기

태그와 동일하게 클래스 이름으로도 찾을 수 있습니다. (BeautifulSoup을 많이 사용해보신 분들은 익숙하실 것 같습니다) 2.5.와 동일한 페이지 소스 예시에서 "p" 요소를 찾으려면 아래와 같이 구현할 수 있습니다.

content = driver.find_element(By.CLASS_NAME, 'content')

 

2.7. CSS 선택자로 찾기

XPath처럼 여러가지 정보를 담을 수 있는 CSS 선택자(Selector)도 크롤링에서 자주 등장하는 구문해석 방법입니다. 2.5.의 동일한 예시에서 같은 내용을 찾으려면 아래와 같이 구현이 가능합니다.

content = driver.find_element(By.CSS_SELECTOR, 'p.content')

XPath와 마찬가지로, 다양한 기관에서 CSS 선택자에 대한 자료를 제공하고 있으니 참고하시기 바랍니다. (Selenium 프로젝트 웹페이지에서는 아래 링크를 추천하고 있습니다.)

Sauce Labs (CSS documentation)

 

3. 활용

이렇게 구현한 요소를 찾는 것은 Web Element를 반환합니다. 한 예시로 제가 최근에 크롤링 작업을 했던 web element에 담겨있는 정보들입니다.

페이지를 구성하는 여러가지 요소들이 보이는데, 필요한 정보에 접근하기 위해서는 '변수명.정보'와 같이 해서 가져올 수 있습니다.  

반응형