1. 기술적 기초
폼 채우기 및 제출
폼 작업은 사용자 등록 자동화, 설문지 작성, 데이터 수집 등에서 자주 필요해. 수백 개의 폼을 채워야 할 때, 수작업으로 하는 건 마치 빨대로 수박 먹으려는 것 같지. Selenium의 초능력을 사용하면 몇 초 만에 끝낼 수 있어.
먼저 우리가 어떻게 텍스트 필드를 채우고 폼을 제출할 수 있는지 알아보자. 일반적인 로그인 폼을 예로 들어 기본 단계를 학습할 거야:
from selenium import webdriver
# 드라이버 설정 (예: ChromeDriver)
driver = webdriver.Chrome()
try:
# 웹 페이지 열기
driver.get("https://example.com/login")
# 사용자 이름 입력 필드 찾기 및 텍스트 입력
username_input = driver.find_element_by_name("username")
username_input.send_keys("내_로그인")
# 비밀번호 입력 필드 찾기 및 텍스트 입력
password_input = driver.find_element_by_name("password")
password_input.send_keys("내_비밀번호")
# 폼 제출 버튼 찾기 및 클릭
submit_button = driver.find_element_by_name("submit")
submit_button.click()
finally:
# 드라이버 닫기
driver.quit()
검증 및 오류 처리
개발자를 망치는 건 예상치 못한 오류지. 그래서 미리 처리해야 해. try/except
를 사용해서 오류를 잡고, 무슨 일이 잘못됐는지 로그로 확인하자.
try:
username_input = driver.find_element_by_name("username")
username_input.send_keys("내_로그인")
except Exception as e:
print(f"사용자 이름 입력 중 오류: {e}")
logging.error("사용자 이름 입력 중 오류", exc_info=True)
2. 체크박스 (Checkboxes)
버튼을 클릭하는 방법을 배운 후 여러 옵션을 선택해 보자. 체크박스를 선택하거나 선택 해제하려면 click()
메서드를 사용할 수 있어. 체크 여부 확인은 is_selected()
속성을 보면 돼.
checkbox = driver.find_element_by_id("checkbox_id")
if not checkbox.is_selected():
checkbox.click()
3. 라디오 버튼 (Radio Buttons)
라디오 버튼은 여러 옵션 중 하나만 선택 가능하지. 체크박스와 마찬가지로 click()
메서드로 선택하고, is_selected()
로 상태를 확인할 수 있어.
radio_button = driver.find_element_by_id("radio_button_id")
if not radio_button.is_selected():
radio_button.click()
4. 드롭다운 (Dropdowns)
드롭다운은 여러 옵션이 포함된 리스트야. Selenium에서는 Select
클래스를 사용하여 이를 관리할 수 있어.
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element_by_id("dropdown_id"))
dropdown.select_by_visible_text("Option 1")
select_by_index()
또는 select_by_value()
를 사용해서도 선택할 수 있어.
5. 텍스트 영역 (Text Areas)
텍스트 영역은 텍스트 필드와 비슷하지만 주로 많은 양의 텍스트 입력에 사용돼. 사용 방법은 텍스트 필드와 동일해.
text_area = driver.find_element_by_id("textarea_id")
text_area.send_keys("텍스트 영역 샘플 텍스트입니다.")
6. 날짜 선택기 (Date Picker)
날짜 필드는 사용자가 날짜를 선택하도록 해. 일반 텍스트 입력 필드라면 send_keys()
로 입력할 수 있어.
date_field = driver.find_element_by_id("date_field_id")
date_field.send_keys("2023-12-25") # 날짜 형식은 사이트에 따라 다를 수 있음
하지만 팝업 캘린더를 열고 날짜를 선택해야 하는 경우도 해봐야 할 수 있어.
7. 파일 업로드 필드 (File Upload)
이 필드는 파일을 서버에 업로드할 수 있게 해. send_keys()
를 사용하고 로컬 경로를 지정하면 돼.
file_input = driver.find_element_by_id("file_upload_id")
file_input.send_keys("/path/to/file.txt")
8. 숨겨진 필드 (Hidden Fields)
숨겨진 필드는 페이지에 표시되지 않지만 폼 전송에 필요한 정보를 저장하는 데 사용돼. 값을 확인하거나 변경하려면 get_attribute()
를 사용해 확인할 수 있어.
hidden_field = driver.find_element_by_id("hidden_field_id")
value = hidden_field.get_attribute("value")
print("숨겨진 필드 값:", value)
9. 작업 성공 확인
작업이 제대로 수행되었는지 확인하는 건 필수지. 폼 제출 후 요청이 성공적으로 처리되었는지 확인하는 방법은 다음과 같아:
># 사이트에 성공적으로 로그인했는지 확인
if "환영합니다" in driver.page_source:
print("로그인이 성공적으로 완료되었습니다!")
else:
print("로그인 중 오류가 발생하였습니다.")
10. 문제 및 해결책
문제
- 작업의 불안정성: 웹 페이지는 자주 변경되지. 페이지 구조 변경은 스크립트 오류로 이어질 수 있어, 코드의 최신 상태를 정기적으로 확인해야 해.
- 네트워크 속도 의존성: 페이지 및 요소 로드 속도가 일정하지 않을 수도 있어. 명시적 대기(explicit waits)를 사용해 지연을 처리하자.
해결책
- 로깅: 모든 작업의 로그를 남기면 문제를 파악하기 수월해.
logging
라이브러리를 사용하면 로깅이 훨씬 쉬워져. - 코드의 모듈화: 복잡한 작업을 함수와 모듈로 나눠서 작업을 더 쉽게 수정하고 테스트할 수 있도록 하자.
GO TO FULL VERSION