웹 자동화
Selenium을 사용하면 웹 브라우저를 프로그래밍 방식으로 제어할 수 있습니다. 반복적인 웹 작업, 테스트, 데이터 수집 등을 자동화해보겠습니다.
설치하기
Selenium 설치
# Selenium 설치
pip install selenium
# WebDriver Manager (드라이버 자동 관리)
pip install webdriver-manager
브라우저 드라이버
Selenium은 브라우저를 제어하기 위해 드라이버가 필요합니다.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# Chrome 드라이버 자동 설치 및 실행
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 또는 Firefox
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(service=Service(GeckoDriverManager().install()))
기본 사용법
브라우저 열고 닫기
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 브라우저 실행
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 웹 페이지 열기
driver.get("https://www.example.com")
# 페이지 제목 출력
print(driver.title)
# 현재 URL 확인
print(driver.current_url)
# 브라우저 닫 기
driver.quit() # 모든 창 닫기
# driver.close() # 현재 창만 닫기
요소 찾기
from selenium.webdriver.common.by import By
# ID로 찾기
element = driver.find_element(By.ID, "username")
# 클래스명으로 찾기
element = driver.find_element(By.CLASS_NAME, "btn-primary")
# 태그명으로 찾기
element = driver.find_element(By.TAG_NAME, "h1")
# CSS 선택자로 찾기
element = driver.find_element(By.CSS_SELECTOR, "div.container > p")
# XPath로 찾기
element = driver.find_element(By.XPATH, "//button[@type='submit']")
# 링크 텍스트로 찾기
element = driver.find_element(By.LINK_TEXT, "로그인")
element = driver.find_element(By.PARTIAL_LINK_TEXT, "자세히")
# 여러 요소 찾기 (리스트 반환)
elements = driver.find_elements(By.CLASS_NAME, "product-item")
요소와 상호작용
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 텍스트 입력
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Python Selenium")
# Enter 키 입력
search_box.send_keys(Keys.RETURN)
# 버튼 클릭
button = driver.find_element(By.ID, "submit-btn")
button.click()
# 텍스트 가져오기
text = element.text
# 속성 가져오기
href = element.get_attribute("href")
class_name = element.get_attribute("class")
# 입력 필드 비우기
search_box.clear()
# 체크박스 선택 여부 확인
is_selected = checkbox.is_selected()
# 요소 표시 여부 확인
is_displayed = element.is_displayed()
# 요소 활성화 여부 확인
is_enabled = element.is_enabled()
대기 처리
암묵적 대기
# 페이지 로딩을 최대 10초까지 기다림
driver.implicitly_wait(10)
# 이후 모든 요소 찾기에 적용됨
element = driver.find_element(By.ID, "dynamic-content")
명시적 대기
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
# 특정 조건이 만족될 때까지 최대 10초 대기
wait = WebDriverWait(driver, 10)
# 요소가 나타날 때까지 대기
element = wait.until(
EC.presence_of_element_located((By.ID, "dynamic-element"))
)
# 요소가 클릭 가능할 때까지 대기
element = wait.until(
EC.element_to_be_clickable((By.ID, "submit-btn"))
)
# 요소가 보일 때까지 대기
element = wait.until(
EC.visibility_of_element_located((By.CLASS_NAME, "popup"))
)
# 제목에 특정 텍스트가 포함될 때까지 대기
wait.until(EC.title_contains("검색 결과"))
# 알림창이 나타날 때까지 대기
wait.until(EC.alert_is_present())
명시적 대기 조건
from selenium.webdriver.support import expected_conditions as EC
# 자주 사용되는 조건들
EC.presence_of_element_located() # 요소가 DOM에 존재
EC.visibility_of_element_located() # 요소가 보임
EC.element_to_be_clickable() # 요소가 클릭 가능
EC.invisibility_of_element_located() # 요소가 안 보임
EC.text_to_be_present_in_element() # 요소에 특정 텍스트 존재
EC.title_contains() # 제목에 텍스트 포함
EC.title_is() # 제목이 정확히 일치
EC.url_contains() # URL에 텍스트 포함
EC.alert_is_present() # 알림창 존재
EC.frame_to_be_available_and_switch_to_it() # 프레임 전환 가능
고급 기능
스크롤
# 페이지 끝까지 스크롤
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 특정 위치로 스크롤
driver.execute_script("window.scrollTo(0, 500);")
# 특정 요소까지 스크롤
element = driver.find_element(By.ID, "footer")
driver.execute_script("arguments[0].scrollIntoView();", element)
# 무한 스크롤 처리
import time
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
# 끝까지 스크롤
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(2)
# 새로운 높이 계산
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
드롭다운 선택
from selenium.webdriver.support.ui import Select
# Select 객체 생성
select_element = driver.find_element(By.ID, "country")
select = Select(select_element)
# 인덱스로 선택
select.select_by_index(2)
# 값으로 선택
select.select_by_value("kr")
# 보이는 텍스트로 선택
select.select_by_visible_text("대한민국")
# 현재 선택된 옵션
selected_option = select.first_selected_option
print(selected_option.text)
# 모든 옵션 가져오기
all_options = select.options
for option in all_options:
print(option.text)
창/탭 관리
# 현재 창 핸들
current_window = driver.current_window_handle
# 모든 창 핸들
all_windows = driver.window_handles
# 새 탭 열기
driver.execute_script("window.open('https://www.example.com');")
# 새 창으로 전환
driver.switch_to.window(driver.window_handles[1])
# 원래 창으로 돌아가기
driver.switch_to.window(current_window)
# 현재 창 닫기
driver.close()
iframe 처리
# iframe으로 전환
iframe = driver.find_element(By.ID, "iframe-id")
driver.switch_to.frame(iframe)
# 또는 인덱스로
driver.switch_to.frame(0)
# iframe 내부 요소 접근
element = driver.find_element(By.ID, "element-in-iframe")
# 기본 컨텐츠로 돌아가기
driver.switch_to.default_content()