1. 페이지에서 요소 찾기 기초
요소 검색 메서드 사용
Selenium을 실제 프로젝트에서 사용하기 시작하면, 첫 번째 작업 중 하나는 페이지에서 요소를 찾는 것이다. 이는 호텔에서 엘리베이터 버튼을 찾는 것과 비슷하다: 버튼이 어디에 있는지 알아야 눌러서 원하는 층으로 갈 수 있다.
Selenium은 요소를 찾기 위한 몇 가지 방법을 제공한다. 당신의 선호도에 따라
find_element_by_id
, find_element_by_name
,
find_element_by_xpath
, find_element_by_css_selector
등을
사용할 수 있다. 이미 알고 있는 것을 상기하며 간단한 예제를 작성해 보자:
from selenium import webdriver
# 브라우저 인스턴스 생성 (여기서는 Chrome 사용)
driver = webdriver.Chrome()
# 페이지 열기
driver.get('http://example.com')
# ID로 요소 검색
element_by_id = driver.find_element_by_id('main')
# 이름으로 요소 검색
element_by_name = driver.find_element_by_name('username')
# XPath로 요소 검색
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# CSS 선택자로 요소 검색
element_by_css = driver.find_element_by_css_selector('div.content')
find_element와 find_elements의 차이
여러 요소를 캡처하려면 (예: btn
클래스가 있는 모든 버튼),
find_elements
메서드가 필요하다. find_element
와
find_elements
의 차이는 전자가 하나의 요소만 반환하고 후자는 요소의 리스트를
반환한다는 것이다.
# 하나의 요소 검색
single_element = driver.find_element_by_class_name('btn')
# 여러 요소 검색
multiple_elements = driver.find_elements_by_class_name('btn')
# 검색된 요소 순회
for element in multiple_elements:
print(element.text)
보시다시피, find_elements
는 페이지에 여러 개 있을 수 있는 요소 컬렉션과
작업하기에 적합하다. 각 find_element_xxx
메서드에는 리스트를 반환하는
해당 find_elements_xxx
가 있다.
2. 요소와의 상호작용
버튼, 링크 및 입력 필드와의 상호작용
이제 요소를 찾는 방법을 떠올렸으니, 이제 상호작용하는 방법을 기억할 때다! 이는 LEGO 세트 놀이와 비슷하다: 올바르게 조립해야 원하는 것을 얻을 수 있다.
Selenium이 제공하는 메서드를 사용하여 요소와 상호작용할 수 있다. 다시 한 번, 이것을 어떻게 하는지 보자:
# 버튼 클릭하기
button = driver.find_element_by_id('submit')
button.click()
# 입력 필드에 텍스트 입력하기
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# 요소의 텍스트 가져오기
header = driver.find_element_by_tag_name('h1')
print(header.text)
이벤트 처리 및 동적 요소 작업
동적 요소(예: 특정 작업 후에만 나타나는 버튼)와 작업해야 할 때
지연 및 대기를 고려하는 것이 중요하다. Selenium은
이러한 요소의 로드를 기다리는 방법을 제공한다. 그 중 하나는
WebDriverWait
클래스를 expected_conditions
와
결합하여 사용하는 것이다.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 10초 동안 버튼이 나타날 때까지 대기
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
참고. expected_conditions
를 매번 작성하는 대신
EC
로 이름을 바꿨다.
대기를 사용하면 스크립트가 더 견고해지고 일시적인 지연이나 페이지 로드가 느린 경우에도 중단되지 않는다. 실무에서는 이런 일이 매우 자주 발생한다 - 거의 항상 :)
3. 무엇이 잘못될 수 있을까?
모든 것이 잘못될 수 있다. 요소와 상호작용하려는 준비를 마쳤을 때, 갑자기 무언가 잘못될 수 있다. 이 여정에서 당신을 기다리고 있는 몇 가지 일반적인 오류를 논의해 보자.
첫 번째로, NoSuchElementException
- 특히 찾고 있는 요소가 페이지에
존재하지 않을 때 자주 보게 될 오류 메시지다. 이는 존재하지 않는 요소를 찾으려고 할 때
발생한다. 이러한 상황을 방지하려면 try-except
를 사용하여 예외를 처리할
수 있다.
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("앗, 요소가 없는 것 같아!")
또한 동적 요소와 로드 시간과 관련된 문제가 발생할 수 있다. 이 경우, 앞서 논의한 대로
WebDriverWait
을 사용하여 요소 로드를 기다리십시오.
GO TO FULL VERSION