1. Selenium 소개
Selenium은 웹 브라우져를 컨트롤하여 웹 UI 를 Automation 하는 도구 중의 하나이다. Selenium은 Selenium Server와 Selenium Client가 있는데, 로컬 컴퓨터의 웹 브라우져를 컨트롤하기 위해서는 Selenium Client 를 사용한다 (여기서는 Selenium 3 사용). Selenium Client는 WebDriver라는 공통 인터페이스(Common interface)와 각 브라우져 타입별(IE, Chrome, FireFox 등)로 하나씩 있는 Browser Driver로 구성되어 있다.
2. Selenium 설치
Selenium을 설치하기 위해서는 먼저 아래와 같이 pip 을 사용하여 Selenium Client 모듈을 설치한다.
pip install selenium
다음으로 사용할 브라우저별 Selenium 드라이버를 설치한다. 드라이버가 설치된 후, 해당 드라이버의 경로를 실행 PATH에 넣어 준다. 아래는 대표적인 브라우저별 설치 링크이다. 특별한 이유가 없다면 Selenium이 가장 잘 동작하는 Firefox를 사용하는 것이 좋다.
- Firefox : https://github.com/mozilla/geckodriver/releases
- Chrome : https://sites.google.com/a/chromium.org/chromedriver/downloads
- Edge : https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
3. Selenium 사용법
Selenium을 사용하기 위해서는 먼저 selenium.webdriver 모듈을 import 한 후, webdriver.Firefox() 를 호출하여 브라우져를 실행시킨다. 만약 크롬을 사용할 경우 webdriver.Chrome()을 호출하고, Edge를 사용할 경우 webdriver.Edge()을 호출한다.
브라우져를 띄운 상태에서 특정 웹사이트로 이동하기 위해서는 아래와 같이 browser 객체의 get() 메서드를 사용한다.
from selenium import webdriver
browser = webdriver.Firefox()
# browser = webdriver.Chrome()
browser.get("http://python.org")
Selenium은 웹페이지 내의 특정 요소(들)을 찾는 많은 메서드들을 제공하고 있는데, 이들은 보통 한 요소를 리턴하는 find_element_*() 혹은 복수 요소를 리턴하는 find_elements_*() 메서드로 구분된다. 자주 사용되는 몇가지 검색 메서드를 예를 들면, 특정 태그 id 로 검색하는 find_element_by_id(), 특정 태그 name 속성으로 검색하는 find_element_by_name(), CSS 클래스명으로 검색하는 find_element_by_class_name(), CSS selector를 사용해 검색하는 find_element_by_css_selector() 등이 있는데, 예상되는 결과가 복수이면 find_element_* 대신 find_elements_* 를 사용한다.
검색 결과 리턴되는 객체는 FirefoxWebElement 와 같이 *WebElement 타입의 객체가 되는데, 리턴된 요소는 WebElement 타입 타입의 속성이나 메서드를 사용하여 데이타를 얻거나 특정 행위를 할 수 있다. 예를 들어, WebElement의 text는 요소 내의 문자열을 리턴하고, tag_name 은 해당 요소의 태크명 (예: a, span) 을 리턴하며, clear() 메서드를 호출하면 text 입력 영역을 초기화하고, click() 메서드를 호출하면 해당 요소를 클릭한다.
아래 예제는 python.org 웹사이트를 방문해서 상단 메인 메뉴 문자열을 출력하고, PyPI 메뉴를 클릭한 후 5초 후에 브라우저를 종료하는 예이다.
from selenium import webdriver
import time
browser = webdriver.Firefox()
browser.get("http://python.org")
menus = browser.find_elements_by_css_selector('#top ul.menu li')
pypi = None
for m in menus:
if m.text == "PyPI":
pypi = m
print(m.text)
pypi.click() # 클릭
time.sleep(5) # 5초 대기
browser.quit() # 브라우저 종료