Selenium 101
업데이트:
Selenium 이용한 웹 스크래핑 방법, 웹 자동화
Selenium 가이드: 웹 자동화
1. Selenium 이란?
Selenium은 웹 브라우저 자동화를 위한 아래와 같은 용도
- 웹 애플리케이션 테스트 자동화
- 웹 스크래핑 및 데이터 추출
- 반복적인 웹 작업 자동화
- 크로스 브라우저 테스팅
주요 기능
- 브라우저 제어: 다양한 브라우저에서 웹 페이지를 자동으로 로드하고 조작할 수 있습니다.
- DOM 조작: 웹 페이지의 DOM 요소를 검색하고 조작할 수 있습니다.
- 폼 자동화: 폼을 자동으로 작성하고 제출할 수 있습니다.
- 스크린샷 캡처: 웹 페이지의 스크린샷을 캡처할 수 있습니다.
- 헤드리스 모드: 브라우저 창을 띄우지 않고 백그라운드에서 작업을 수행할 수 있습니다.
Selenium은 다양한 프로그래밍 언어를 지원하며, 웹 개발자와 QA 엔지니어들에게 필수적인 도구로 사용
2. 지원하는 웹 드라이버 종류
Selenium은 다양한 웹 브라우저를 지원합니다. 주요 웹 드라이버는 다음과 같습니다:
- ChromeDriver (Google Chrome)
- GeckoDriver (Mozilla Firefox)
- EdgeDriver (Microsoft Edge)
- SafariDriver (Apple Safari)
- IEDriverServer (Internet Explorer)
각 브라우저의 버전에 맞는 웹 드라이버를 설치해야 합니다.
3. 기본적인 웹 페이지 호출 방법 (Chrome 드라이버 사용)
$ pip install selenium webdriver_manager
Chrome 드라이버를 사용하여 웹 페이지를 호출하는 기본적인 Python 코드는 다음과 같습니다:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
## WebDriver 객체 생성
## ChromeDriverManager().install():
## webdriver_manager 라이브러리는 현재 시스템과 호환되는 ChromeDriver 버전을 찾아서 다운로드
## 다운로드된 ChromeDriver 파일은 로컬에 저장되며, 해당 파일의 경로를 반환
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
## 웹 페이지 열기
driver.get('https://www.example.com')
## 브라우저 종료
driver.quit()
]
4. DOM 을 찾기 위한 find_elements
사용법
Selenium은 다양한 방법으로 웹 요소를 찾을 수 있습니다. 주요 메서드는 다음과 같습니다:
메서드 | 설명 |
---|---|
find_element(By.ID, 'id') |
ID 속성으로 요소 찾기 |
find_element(By.NAME, 'name') |
name 속성으로 요소 찾기 |
find_element(By.XPATH, 'xpath') |
XPath로 요소 찾기 |
find_element(By.CSS_SELECTOR, 'css_selector') |
CSS 선택자로 요소 찾기 |
find_element(By.CLASS_NAME, 'class_name') |
클래스 이름으로 요소 찾기 |
find_element(By.TAG_NAME, 'tag_name') |
HTML 태그 이름으로 요소 찾기 |
find_element(By.LINK_TEXT, 'link_text') |
링크 텍스트로 요소 찾기 |
find_element(By.PARTIAL_LINK_TEXT, 'partial_link_text') |
부분적인 링크 텍스트로 요소 찾기 |
By.ID
는 가장 빠르고 신뢰할 수 있는 방법이지만, 모든 요소에 고유한 ID가 있는 것은 아닙니다.By.XPATH
는 매우 유연하지만, 복잡한 XPath는 성능에 영향을 줄 수 있습니다.By.CSS_SELECTOR
는By.XPATH
보다 일반적으로 더 빠르고 읽기 쉽습니다.By.LINK_TEXT
와By.PARTIAL_LINK_TEXT
는 특히 네비게이션 테스트에 유용합니다.
예시
from selenium.webdriver.common.by import By
## ID로 요소 찾기
element = driver.find_element(By.ID, 'search-input')
## 여러 요소 찾기
# 1. ID로 요소 찾기
elements_by_id = driver.find_elements(By.CSS_SELECTOR, '#example-id')
for element in elements_by_id:
print(f"ID: {element.text}")
# 2. 클래스명으로 요소 찾기
elements_by_class = driver.find_elements(By.CSS_SELECTOR, '.example-class')
for element in elements_by_class:
print(f"Class: {element.text}")
# 3. 태그명으로 요소 찾기
elements_by_tag = driver.find_elements(By.CSS_SELECTOR, 'div')
for element in elements_by_tag:
print(f"Tag: {element.text}")
# 4. 계층 구조로 요소 찾기 (자식 요소)
elements_by_hierarchy = driver.find_elements(By.CSS_SELECTOR, 'div > p')
for element in elements_by_hierarchy:
print(f"Hierarchy (child): {element.text}")
# 5. 계층 구조로 요소 찾기 (후손 요소)
elements_by_descendant = driver.find_elements(By.CSS_SELECTOR, 'div p')
for element in elements_by_descendant:
print(f"Hierarchy (descendant): {element.text}")
# 6. 여러 클래스 조합으로 요소 찾기
elements_by_multiple_classes = driver.find_elements(By.CSS_SELECTOR, '.class1.class2')
for element in elements_by_multiple_classes:
print(f"Multiple Classes: {element.text}")
# 7. 속성 값으로 요소 찾기
elements_by_attribute = driver.find_elements(By.CSS_SELECTOR, '[attribute-name="value"]')
for element in elements_by_attribute:
print(f"Attribute: {element.text}")
5. 주요 DOM 조작 기능
find_elements 메서드를 사용하여 여러 요소가 조회되면 모든 일치하는 요소를 리스트(배열)로 처리 해야함
click()
: 요소를 클릭
button = driver.find_element(By.ID, 'submit-button')
button.click()
send_keys()
: 텍스트를 입력
input_field = driver.find_element(By.NAME, 'username')
input_field.send_keys('myusername')
text
: 요소의 텍스트
paragraph = driver.find_element(By.CLASS_NAME, 'content')
print(paragraph.text)
get_attribute
: 요소의 속성 값을 가져옵니다.
link = driver.find_element(By.TAG_NAME, 'a')
href = link.get_attribute('href')
6. Headless 모드 및 기타 옵션
Headless 모드는 GUI 없이 브라우저를 실행하는 방법으로 서버 환경이나 백그라운드 작업에 유용
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu') # 필요한 경우
chrome_options.add_argument('user-agent=Mozilla/5.0 ...') # User-Agent 설정
driver = driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.get('https://example.com')
print(driver.title)
driver.quit()
기타 유용한 옵션:
--start-maximized
: 브라우저를 최대화하여 시작--disable-extensions
: 확장 프로그램 비활성화--disable-gpu
: GPU 하드웨어 가속 비활성화--no-sandbox
: 샌드박스 비활성화 (주의: 보안상 위험할 수 있음)window-size=1200x600
: 브라우저 창 크기 설정user-agent=Mozilla/5.0 ...
: User-Agent 설정
댓글남기기