AI Study

Selenium을 통한 브라우저 제어(2)

jimmmy_jin 2025. 3. 9. 20:11

Selenium은 웹 브라우저를 자동으로 조작할 수 있는 강력한 도구다. 이를 통해 로그인 자동화, 특정 버튼 클릭, 드롭다운 메뉴 조작 등 다양한 작업을 수행할 수 있다. Selenium을 활용한 브라우저 제어 방법을 정리한다.

1. 브라우저 제어의 필요성

브라우저를 제어해야 하는 이유는 여러 가지가 있다.

  • 로그인 자동화: 로그인 후에만 접근할 수 있는 페이지를 분석할 때 필요하다.
    • ID와 비밀번호 입력 후 로그인 버튼 클릭 또는 엔터키 입력
  • 드롭다운 버튼 조작: 특정 요소를 가져오기 위해 드롭다운 버튼을 클릭해야 하는 경우가 있다.
    • 드롭다운 버튼을 찾아서 클릭

이러한 작업을 가능하게 하는 것이 Selenium이다.

2. 브라우저 로딩 기다리기

웹 페이지는 로딩 시간이 필요하다. 요소가 로딩되지 않은 상태에서 크롤링을 시도하면 오류가 발생할 수 있다. 이를 방지하기 위해 브라우저가 로딩될 때까지 기다리는 방법이 필요하다.

Point I: time.sleep(n) – 무조건 기다리기

import time

with webdriver.Firefox() as driver:
    driver.get(url)  # 웹페이지 로딩
    time.sleep(10)   # 10초간 기다리기
    
    e = driver.find_element()
  • time.sleep(n): n초 동안 무조건 기다린다.
  • 요소가 이미 로딩되었더라도 설정된 시간을 다 채울 때까지 대기한다.

Point II: implicitly_wait(n) – 암시적 기다리기

with webdriver.Firefox() as driver:
    driver.implicitly_wait(10)
    driver.get(url)  # 웹 페이지 로딩
    
    e = driver.find_element()
  • implicitly_wait(n): 요소가 로딩될 때까지 최대 n초 동안 기다린다.
  • 요소가 로딩되면 즉시 기다림을 종료하고 코드를 실행한다.
  • 한 번 설정하면 해당 브라우저 세션에서 계속 적용된다.

Point III: presence_of_element_located – 명시적 기다리기

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

with webdriver.Firefox() as driver:
    driver.implicitly_wait(10)
    driver.get(url)  # 웹 페이지 로딩
    
    e = WebDriverWait(driver, 30).until(
        EC.presence_of_element_located((By.ID, "id_name"))
    )  # 해당 요소를 불러올 때까지 30초 기다림
  • presence_of_element_located: 특정 요소가 로딩될 때까지 최대 n초 동안 기다린다.
  • 요소는 ID, class_name, xpath 등 다양한 방식으로 찾을 수 있다.
  • element_to_be_clickable: 요소가 클릭 가능할 때까지 기다릴 수도 있다.

3. 키보드 및 마우스 입력

Selenium을 이용하면 키보드와 마우스를 자동으로 조작할 수 있다.

Point I: 키보드 입력

from selenium.webdriver.common.keys import Keys

# ID 입력
driver.find_element_by_xpath('//*[@id="id"]').send_keys('my_id')

# 비밀번호 입력 후 엔터
driver.find_element_by_xpath('//*[@id="pw"]').send_keys('my_password' + Keys.ENTER)
  • send_keys: 해당 요소에 문자열을 입력한다.
  • Keys: ENTER, SHIFT, CONTROL 등 특수 키를 입력할 때 사용한다.

Point II: 마우스 입력

# 로그인 버튼 클릭
driver.find_element_by_xpath('//*[@id="log.login"]').click()
  • click(): 요소를 클릭하는 효과를 낸다.

4. 다양한 입력 및 Action Chains

Selenium 기본 입력 방식에는 한계가 있다. 여러 요소에 대한 연속적인 입력이나 복잡한 마우스 조작을 하려면 Action Chains를 사용해야 한다.

Point I: Action Chains 개념

  • 여러 개의 액션을 체인처럼 연결하여 실행할 수 있다.
  • 키보드 및 마우스를 보다 정밀하게 조작할 수 있다.

Point II: 키보드 입력 (ActionChains 활용)

from selenium.webdriver.common.action_chains import ActionChains

# 요소 찾기
_id = driver.find_element_by_xpath('//*[@id="id"]')
_pw = driver.find_element_by_xpath('//*[@id="pw"]')

# 액션 수행
webdriver.ActionChains(driver) \
    .send_keys_to_element(_id, 'my_id') \
    .send_keys_to_element(_pw, 'my_pw') \
    .send_keys(Keys.ENTER) \
    .perform()
  • send_keys_to_element: 특정 요소에 키 입력을 수행한다.
  • perform(): 설정한 액션을 실행한다.

Point III: 다양한 Action Chains 조합

컨트롤 + 클릭

_button = driver.find_element_by_xpath('//button')
chains = webdriver.ActionChains(driver)

chains.key_down(Keys.CONTROL)  # 컨트롤 버튼 누른 채로
chains.click(_button)  # 버튼 클릭
chains.perform()
  • key_down(Keys.CONTROL): 컨트롤 키를 누른다.
  • click(_button): 버튼을 클릭한다.

마우스 이동 및 대기 후 이동

_button = driver.find_element_by_xpath('//button')
chains = webdriver.ActionChains(driver)

chains.move_to_element(_button) \
    .pause(3) \
    .move_by_offset(100, 100) \
    .perform()
  • move_to_element: 특정 요소 위로 마우스를 이동시킨다.
  • pause(n): n초 동안 멈춘다.
  • move_by_offset(x, y): 현재 위치에서 (x, y)만큼 이동한다.

마무리

Selenium을 활용하면 브라우저를 자동으로 제어하고, 로그인 자동화, 버튼 클릭, 키보드 및 마우스 입력 등을 쉽게 수행할 수 있다.

  • 요소가 로딩될 때까지 기다리는 방법에는 무조건 기다리기(time.sleep), 암시적 기다리기(implicitly_wait), 명시적 기다리기(WebDriverWait) 가 있다.
  • 키보드 및 마우스 입력을 통해 로그인 및 다양한 조작이 가능하다.
  • Action Chains를 활용하면 더 복잡한 액션도 수행할 수 있다.

이제 Selenium을 활용한 크롤링을 더욱 효과적으로 수행할 수 있을 것이다! 🚀