파이썬 Selenium을 이용한 웹 브라우저 자동화

웹 브라우저 자동화의 필요성

웹 스크래핑에 익숙한 개발자라면 requests 라이브러리를 통해 웹 페이지의 소스 코드를 직접 가져오는 방식이 더 효율적이라고 생각할 수 있습니다. 하지만 실제 웹 환경은 그리 단순하지 않습니다.

일반적인 웹 스크래핑의 난관:

  1. 복잡한 안티봇 시스템: 웹사이트들은 비정상적인 접근을 막기 위해 다양한 방어 메커니즘을 사용합니다. 요청 헤더를 분석하여 브라우저가 아닌 요청을 거부하거나, 특정 IP 대역을 차단하기도 합니다.
  2. JavaScript 기반 콘텐츠 렌더링: 현대의 많은 웹 페이지는 JavaScript를 통해 동적으로 콘텐츠를 로드하고 렌더링합니다. requests만으로는 이러한 JavaScript 실행 결과를 얻을 수 없으며, 대부분 빈 껍질의 HTML만 받게 됩니다.
  3. CAPTCHA 및 인증: 슬라이드 퍼즐, 클릭 검증, SMS 인증 등 다양한 형태의 CAPTCHA는 프로그램으로 우회하기 매우 어렵습니다.
  4. 사용자 세션 유지: 쿠키(Cookie), 세션(Session), 토큰(Token) 등 사용자 인증 메커니즘은 복잡하게 얽혀 있어, 이를 수동으로 관리하기 어렵습니다.

이러한 문제들을 해결하기 위해 Selenium이 강력한 대안으로 떠오릅니다.

Selenium의 장점:

  • 실제 브라우저를 실행하므로, 웹사이트 입장에서는 정상적인 사용자 접근으로 인식합니다.
  • JavaScript를 자동으로 실행하여 완전히 렌더링된 페이지를 확보할 수 있습니다.
  • 사용자의 클릭, 입력, 스크롤 등 다양한 동작을 정교하게 모방할 수 있습니다.
  • 복잡한 로그인 절차도 효과적으로 처리할 수 있습니다.

Selenium 소개

Selenium은 원래 웹 애플리케이션의 자동화된 테스트 도구로 개발되었습니다. 웹 페이지의 기능이 정상적으로 작동하는지 검증하는 데 주로 사용되었으나, 그 강력한 기능 덕분에 웹 스크래핑 및 자동화 분야에서 '만능 도구'로 자리매김했습니다.

Selenium의 주요 활용 분야:

  • 대부분의 안티봇 메커니즘을 우회하여 실시간 데이터 수집.
  • 다양한 웹사이트 자동 로그인 및 세션 유지.
  • 특정 상품 구매, 티켓 예매 등 정해진 시간에 이루어지는 작업 자동화.
  • 자동 양식 작성 및 데이터 제출.
  • 파일 대량 업로드/다운로드 자동화.
  • 커뮤니티 활동, 소셜 미디어 관리 등 운영 자동화.

간단히 말해, Selenium은 "코드로 제어하는 로봇 브라우저"라고 할 수 있습니다.

환경 설정

Windows 환경에서 Selenium을 사용하기 위해서는 다음 세 가지 구성 요소가 필요합니다.

구성 요소 역할 본 튜토리얼에서 사용하는 버전
Selenium 라이브러리 (Python) 파이썬 코드에서 브라우저를 제어하는 인터페이스 최신 버전
웹 브라우저 Selenium에 의해 제어될 실제 프로그램 Google Chrome
브라우저 드라이버 파이썬 명령을 브라우저가 이해하는 언어로 번역하는 역할 (통역사) ChromeDriver

1. Selenium 라이브러리 설치

파이썬 개발 환경(예: PyCharm)의 터미널에서 다음 명령어를 실행하여 Selenium 라이브러리를 설치합니다.

pip install selenium

설치 후, 코드에서 필요한 모듈을 임포트합니다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service # ChromeDriver 서비스를 관리하기 위해 필요

2. Chrome 브라우저 설치

Google Chrome 공식 웹사이트에서 최신 버전을 다운로드하여 설치합니다. 설치 완료 후, Chrome 주소창에 chrome://version/을 입력하여 현재 Chrome의 버전 정보를 확인합니다. 예를 들어, 98.0.4758와 같은 버전 번호의 앞 세 자리를 기억해 둡니다. 이는 이후 ChromeDriver 설치 시 필요합니다.

3. ChromeDriver 드라이버 설치

드라이버가 필요한 이유: Selenium은 파이썬 언어로 명령을 내리고, Chrome은 브라우저 고유의 언어로 동작합니다. 이 둘 사이의 통신을 가능하게 하는 통역사가 바로 ChromeDriver입니다.

다운로드 절차:

  1. ChromeDriver 다운로드 페이지(http://chromedriver.storage.googleapis.com/index.html)에 접속합니다.
  2. 설치된 Chrome 브라우저 버전과 일치하는 ChromeDriver 버전을 찾습니다. (예: Chrome 버전이 98.x.xxxx.x라면 98.0.4758.102와 같은 폴더를 찾습니다.)
  3. 해당 폴더로 이동하여 운영체제에 맞는 버전(chromedriver_win32.zip)을 다운로드합니다.
  4. 압축을 해제하면 chromedriver.exe 파일이 나옵니다.
  5. 이 파일을 특정 고정된 경로(예: D:\driver\chromedriver.exe 또는 시스템 PATH에 추가)에 저장합니다.

버전 일치가 매우 중요합니다! Chrome 브라우저가 업데이트되면, 해당 버전에 맞는 ChromeDriver를 다시 다운로드해야 할 수도 있습니다.

기본 사용법

브라우저 객체 초기화

환경 설정이 완료되면, Selenium을 이용한 첫 번째 코드를 작성해 보겠습니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# ChromeDriver 실행 파일 경로 지정
driver_service = Service(r'D:\driver\chromedriver.exe') # 실제 경로로 변경 필요

# 브라우저 드라이버 초기화
browser_driver = webdriver.Chrome(service=driver_service)

# 2초 동안 기다리며 동작 확인
time.sleep(2)

# 브라우저 닫기
browser_driver.quit() # 모든 브라우저 창 닫기

위 코드를 실행하면 Chrome 창이 나타났다가 2초 후 자동으로 닫히는 것을 볼 수 있습니다. 이것이 Selenium이 브라우저를 제어하는 방식입니다.

헤드리스 모드 (Headless Mode)

브라우저 창이 실제로 나타나는 것이 불필요하거나, 서버 환경(GUI 없음)에서 실행할 경우 헤드리스 모드를 사용할 수 있습니다. 이는 시각적인 인터페이스 없이 백그라운드에서 브라우저를 실행합니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

driver_service = Service(r'D:\driver\chromedriver.exe') # 실제 경로로 변경 필요

# Chrome 브라우저 옵션 객체 생성
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("headless")  # 헤드리스 모드 활성화

# 헤드리스 브라우저 드라이버 초기화
browser_driver = webdriver.Chrome(service=driver_service, options=chrome_options)

# Google 방문
browser_driver.get(r'https://www.google.com/')

# 스크린샷 저장
browser_driver.save_screenshot('google_screenshot.png')
print("스크린샷이 'google_screenshot.png'로 저장되었습니다.")

browser_driver.quit()

이 코드를 실행하면 브라우저 창은 나타나지 않지만, `google_screenshot.png` 파일이 생성됩니다.

헤드리스 모드의 활용:

  • 서버 환경에서의 자동화 (그래픽 인터페이스가 없을 때)
  • 렌더링 과정이 생략되어 실행 속도 향상
  • 백그라운드에서 실행되는 자동화 작업

웹 페이지 방문

get() 메서드를 사용하여 특정 URL로 이동할 수 있습니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)

# Naver 홈 페이지 방문
browser_driver.get(r'https://www.naver.com/')
print("네이버 홈 페이지를 열었습니다.")

time.sleep(2)
browser_driver.quit()

브라우저 창 크기 조절

브라우저 창의 크기를 특정 해상도로 설정하거나, 최대화할 수 있습니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.naver.com/')

time.sleep(1)

# 창 크기를 500x500 픽셀로 설정
browser_driver.set_window_size(500, 500)
print("창 크기가 500x500으로 조정되었습니다.")

time.sleep(1)

# 창 크기를 1000x800 픽셀로 설정
browser_driver.set_window_size(1000, 800)
print("창 크기가 1000x800으로 조정되었습니다.")

time.sleep(1)

# 창 최대화
browser_driver.maximize_window()
print("창이 최대화되었습니다.")

time.sleep(1)
browser_driver.quit()

창 크기 조절의 중요성:

  • 일부 웹사이트는 창 크기를 감지하여 봇 여부를 판단할 수 있습니다.
  • 반응형 웹 페이지는 해상도에 따라 다른 레이아웃을 보여줍니다.
  • 스크린샷을 찍을 때 고정된 크기가 필요할 수 있습니다.

페이지 새로 고침

브라우저의 F5 키를 누르는 것과 동일하게 페이지를 새로 고칩니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.google.com/')

time.sleep(2)

# 페이지 새로 고침
browser_driver.refresh()
print("페이지가 새로 고쳐졌습니다.")

time.sleep(2)
browser_driver.quit()

뒤로 가기/앞으로 가기

브라우저의 '뒤로 가기' 및 '앞으로 가기' 버튼을 모방합니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)

# Google 방문
browser_driver.get(r'https://www.google.com/')
print(f"현재 페이지: {browser_driver.title}")

time.sleep(2)

# Daum 방문
browser_driver.get(r'https://www.daum.net')
print(f"현재 페이지: {browser_driver.title}")

time.sleep(2)

# 뒤로 가기 (Google로 이동)
browser_driver.back()
print(f"뒤로 가기: {browser_driver.title}")

time.sleep(2)

# 앞으로 가기 (Daum으로 이동)
browser_driver.forward()
print(f"앞으로 가기: {browser_driver.title}")

time.sleep(2)
browser_driver.quit()

페이지 기본 속성 확인

현재 웹 페이지의 다양한 기본 정보를 가져올 수 있습니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.naver.com/')

time.sleep(2)

# 웹 페이지 제목 가져오기
print(f"웹 페이지 제목: {browser_driver.title}")

# 현재 URL 가져오기
print(f"현재 URL: {browser_driver.current_url}")

# 브라우저 이름 가져오기
print(f"브라우저 이름: {browser_driver.name}")

# 페이지 소스 코드 가져오기 (데이터 파싱에 활용 가능)
html_source = browser_driver.page_source
print(f"페이지 소스 코드 길이: {len(html_source)} 문자")

browser_driver.quit()

페이지 소스 코드 활용:

  • 정규 표현식을 이용한 특정 데이터 추출.
  • BeautifulSoup 라이브러리를 이용한 HTML 파싱.
  • XPath 또는 CSS Selector를 이용한 요소 위치 확인.

요소(Element) 탐색

웹 자동화의 핵심은 웹 페이지 내의 특정 요소를 찾아내고 조작하는 것입니다. Selenium은 8가지 주요 탐색 방법을 제공합니다.

탐색을 위해 By 클래스를 임포트합니다.

from selenium.webdriver.common.by import By

1. ID 탐색 (By.ID)

요소의 id 속성값을 이용하여 탐색합니다. 가장 빠르고 정확한 방법입니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.naver.com/') # 네이버는 검색창 ID가 'query'

time.sleep(2)

# id="query" 인 검색창을 찾아 "selenium automation" 입력
search_box = browser_driver.find_element(By.ID, 'query')
search_box.send_keys('selenium automation')
print("검색어 'selenium automation'이 입력되었습니다.")

time.sleep(2)
browser_driver.quit()

ID 탐색의 특징:

  • 웹 페이지에서 id는 고유해야 합니다.
  • 탐색 속도가 가장 빠릅니다.
  • 가장 먼저 고려해야 할 탐색 방식입니다.

2. Name 탐색 (By.NAME)

요소의 name 속성값을 이용하여 탐색합니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.google.com/') # 구글 검색창 name은 'q'

time.sleep(2)

# name="q" 인 검색창을 찾아 "python selenium" 입력
search_box_by_name = browser_driver.find_element(By.NAME, 'q')
search_box_by_name.send_keys('python selenium')
print("name으로 탐색하여 'python selenium'을 입력했습니다.")

time.sleep(2)
browser_driver.quit()

3. Class Name 탐색 (By.CLASS_NAME)

요소의 class 속성값을 이용하여 탐색합니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.naver.com/') # 네이버 검색창 class 중 하나는 'search_input'

time.sleep(2)

# class="search_input" 인 요소를 탐색
search_input_by_class = browser_driver.find_element(By.CLASS_NAME, 'search_input')
search_input_by_class.send_keys('web automation')
print("class name으로 탐색하여 'web automation'을 입력했습니다.")

time.sleep(2)
browser_driver.quit()

참고: 한 페이지에 동일한 class 속성을 가진 여러 요소가 있을 수 있으며, 이 경우 find_element()는 첫 번째로 발견된 요소를 반환합니다.

4. Tag Name 탐색 (By.TAG_NAME)

HTML 태그 이름을 이용하여 탐색합니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.daum.net/')

time.sleep(2)

# 페이지에서 첫 번째 'input' 태그를 찾아 입력 시도
# 주의: 페이지에는 수많은 input 태그가 있을 수 있으므로 정밀하지 않습니다.
first_input_element = browser_driver.find_element(By.TAG_NAME, 'input')
first_input_element.send_keys('daum search')
print("첫 번째 input 태그에 'daum search'를 입력했습니다.")

time.sleep(2)
browser_driver.quit()

Tag Name 탐색의 한계:

  • 대부분의 웹 페이지에는 동일한 태그가 매우 많습니다.
  • 정확한 요소를 탐색하기 어렵습니다.
  • 주로 다른 조건과 함께 사용되거나, find_elements()와 함께 여러 요소를 가져올 때 사용됩니다.

5. Link Text 탐색 (By.LINK_TEXT)

링크(<a> 태그)의 정확한 텍스트 내용을 이용하여 탐색합니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.naver.com/')

time.sleep(2)

# '뉴스' 텍스트를 가진 링크 클릭
news_link = browser_driver.find_element(By.LINK_TEXT, '뉴스')
news_link.click()
print("뉴스 링크를 클릭했습니다.")

time.sleep(2)
browser_driver.quit()

6. Partial Link Text 탐색 (By.PARTIAL_LINK_TEXT)

링크 텍스트의 일부분을 이용하여 탐색합니다 (부분 일치).

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.naver.com/')

time.sleep(2)

# 링크 텍스트에 '쇼핑'이 포함된 링크 클릭 (예: '네이버 쇼핑')
shopping_link = browser_driver.find_element(By.PARTIAL_LINK_TEXT, '쇼핑')
shopping_link.click()
print("부분 일치로 쇼핑 링크를 클릭했습니다.")

time.sleep(2)
browser_driver.quit()

활용 사례:

  • 링크 텍스트가 너무 길어 전체를 입력하기 번거로울 때.
  • 링크 텍스트의 일부가 동적으로 변하는 경우.

7. XPath 탐색 (By.XPATH)

XPath는 XML/HTML 문서 내에서 요소를 탐색하기 위한 강력한 언어입니다. 거의 모든 요소를 탐색할 수 있습니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.google.com/')

time.sleep(2)

# XPath: id 속성이 'APjFqb'인 input 요소 탐색
# 이는 구글 검색창에 해당함
search_box_xpath = browser_driver.find_element(By.XPATH, '//*[@id="APjFqb"]')
search_box_xpath.send_keys('Selenium XPath examples')
print("XPath를 이용해 검색창에 'Selenium XPath examples'를 입력했습니다.")

time.sleep(2)
browser_driver.quit()

자주 사용되는 XPath 문법:

XPath 표현식 의미
//div 문서 내의 모든 <div> 요소
//input[@id="some_id"] id 속성값이 "some_id"인 모든 <input> 요소
//div[@class="item_class"] class 속성값이 "item_class"인 모든 <div> 요소
//div[contains(@class, "partial_class")] class 속성값이 "partial_class"를 포함하는 모든 <div> 요소
//button[text()="확인"] 텍스트 내용이 "확인"인 모든 <button> 요소
//div[@id="parent_id"]//span id 속성값이 "parent_id"<div> 요소의 모든 하위 <span> 요소

8. CSS Selector 탐색 (By.CSS_SELECTOR)

CSS 선택자를 이용하여 탐색합니다. 문법이 간결하고 실행 속도가 빠릅니다.

import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.google.com/')

time.sleep(2)

# CSS Selector: id가 'APjFqb'인 요소
search_box_css = browser_driver.find_element(By.CSS_SELECTOR, '#APjFqb')
search_box_css.send_keys('Selenium CSS selector examples')
print("CSS Selector를 이용해 검색창에 'Selenium CSS selector examples'를 입력했습니다.")

time.sleep(2)
browser_driver.quit()

자주 사용되는 CSS Selector:

CSS Selector 의미
#id_value id 속성값이 id_value인 요소 (예: #query)
.class_value class 속성값이 class_value인 요소 (예: .s_input)
tag_name 태그 이름이 tag_name인 요소 (예: input)
tag_name#id_value id 속성과 태그를 조합 (예: input#query)
tag_name.class_value class 속성과 태그를 조합 (예: input.s_input)
[attr=value] 특정 속성값을 가진 요소 (예: [name="q"])
div > span <div>의 직계 자식 <span> 요소
div span <div>의 모든 하위 <span> 요소

9. 여러 요소 탐색 (find_elements)

페이지에 동일한 조건을 만족하는 요소가 여러 개 있을 경우, find_elements (s가 붙음) 메서드를 사용하여 모든 요소를 리스트 형태로 가져올 수 있습니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

driver_service = Service(r'D:\driver\chromedriver.exe')
browser_driver = webdriver.Chrome(service=driver_service)
browser_driver.get(r'https://www.google.com/')

# 페이지의 모든 'a' (링크) 태그 요소를 찾기
link_elements = browser_driver.find_elements(By.TAG_NAME, 'a')
print(f"페이지에 총 {len(link_elements)}개의 링크 요소가 있습니다.")

# 각 링크 요소의 텍스트 출력
for idx, link_elem in enumerate(link_elements):
    if link_elem.text: # 텍스트가 있는 링크만 출력
        print(f"링크 {idx+1}: {link_elem.text}")

browser_driver.quit()

반환되는 값은 요소 객체의 리스트이므로, 반복문을 통해 각 요소를 개별적으로 처리할 수 있습니다.

핵심 요약 및 팁

1. Selenium의 기본 개념

Selenium은 웹 브라우저 자동화 도구로, 코드를 통해 브라우저를 실제 사용자처럼 조작할 수 있게 해줍니다.

  • 주요 기능: 웹 페이지 열기, 버튼 클릭, 텍스트 입력, 스크린샷 캡처, 데이터 추출.
  • 사용 이유: 안티봇 우회, JavaScript 콘텐츠 처리, 실제 사용자 동작 모방.
  • 주요 활용처: 자동 로그인, 데이터 수집 (크롤링), 자동화된 테스트, 정시 예약 구매.

작동 흐름:

Python 코드 → Selenium 라이브러리 → ChromeDriver → Chrome 브라우저 → 대상 웹사이트

2. 환경 설정 단계

단계 작업 내용 주의 사항
① 라이브러리 설치 pip install selenium PyCharm 터미널 등 개발 환경에서 설치
② 브라우저 설치 Google Chrome 최신 버전 설치 브라우저 버전 확인 (예: chrome://version/)
③ 드라이버 설치 Chrome 버전에 맞는 ChromeDriver 다운로드 버전 일치 필수! (예: Chrome 98.x.xxx.x → ChromeDriver 98.x.xxx.x)

3. 브라우저 제어 기본 명령어

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 초기화 (드라이버 경로 설정)
chrome_service = Service(r'D:\driver\chromedriver.exe')
web_driver = webdriver.Chrome(service=chrome_service)

# 일반적인 동작
web_driver.get('대상_URL')             # 특정 페이지 방문
web_driver.refresh()                # 페이지 새로 고침
web_driver.back()                   # 이전 페이지로 이동
web_driver.forward()                # 다음 페이지로 이동
web_driver.set_window_size(폭, 높이) # 창 크기 설정
web_driver.maximize_window()        # 창 최대화

# 정보 확인
page_title = web_driver.title           # 페이지 제목
current_address = web_driver.current_url     # 현재 URL
page_html_source = web_driver.page_source     # 페이지 HTML 소스 코드

# 종료
web_driver.close()         # 현재 활성 탭 닫기
web_driver.quit()          # 모든 브라우저 창 (프로세스) 닫기

4. 요소 탐색 8가지 방법

탐색 방식 By 사용법 주요 활용
ID By.ID, 'element_id' 가장 정확하고 빠르며, 최우선 고려 대상
Name By.NAME, 'element_name' 주로 폼(form) 요소에 사용
Class Name By.CLASS_NAME, 'element_class' 스타일 클래스 이름으로 탐색
Tag Name By.TAG_NAME, 'tag_name' 태그 이름으로 탐색, 여러 개일 경우 첫 번째만 반환
Link Text By.LINK_TEXT, '링크_텍스트' 링크의 정확한 전체 텍스트로 탐색
Partial Link Text By.PARTIAL_LINK_TEXT, '부분_텍스트' 링크 텍스트의 일부분으로 탐색 (부분 일치)
XPath By.XPATH, '//*[@id="any_id"]' 가장 강력하고 유연하며, 복잡한 요소 탐색에 유용
CSS Selector By.CSS_SELECTOR, '#any_id' 간결한 문법, 빠른 실행 속도

탐색 방법 선택 가이드:

  1. id 속성이 있다면 By.ID를 최우선으로 사용합니다. (가장 빠르고 정확)
  2. id가 없다면 name 또는 class 속성을 고려합니다.
  3. 복잡하거나 특정 조건을 만족해야 하는 경우 XPathCSS Selector를 사용합니다.
  4. Tag Name은 너무 광범위하므로, 특정 상황 외에는 피하는 것이 좋습니다.

5. 요소 조작 명령어

찾아낸 웹 요소에 대해 다양한 조작을 할 수 있습니다.

from selenium.webdriver.common.by import By
# ... (드라이버 초기화 코드) ...

target_element = web_driver.find_element(By.ID, 'search_input')

# 텍스트 입력
target_element.send_keys('입력할 내용')

# 클릭
target_element.click()

# 입력 필드 내용 지우기
target_element.clear()

# 요소의 텍스트 내용 가져오기
element_text = target_element.text

# 요소의 특정 속성 값 가져오기 (예: value, href 등)
attribute_value = target_element.get_attribute('value')

6. 흔히 발생하는 문제와 해결 방안

문제 1: SessionNotCreatedException 발생

  • 원인: Chrome 브라우저와 ChromeDriver의 버전이 일치하지 않을 때 발생합니다.
  • 해결: 현재 사용 중인 Chrome 브라우저 버전에 맞는 ChromeDriver를 다시 다운로드하여 설정합니다.

문제 2: NoSuchElementException 발생

  • 원인: 웹 페이지의 특정 요소가 아직 로드되지 않았거나, 탐색하려는 시점에 존재하지 않을 때 발생합니다.
  • 해결: time.sleep()을 사용하여 페이지 로드를 기다리거나, Selenium의 명시적/암시적 대기(Explicit/Implicit Waits) 기능을 사용하는 것이 더 견고한 방법입니다.

문제 3: 요소가 페이지에 보이지만 탐색이 안 되는 경우

  • 원인: 해당 요소가 iframe 내부에 있거나, 새로운 브라우저 창/탭에서 열린 경우입니다.
  • 해결: driver.switch_to.frame()을 사용하여 iframe으로 전환하거나, driver.switch_to.window()를 사용하여 다른 창 핸들로 전환해야 합니다.

문제 4: 한글 입력 시 깨짐 현상

  • 해결: send_keys() 메서드는 기본적으로 유니코드(UTF-8)를 지원하므로, 파이썬 파일의 인코딩이 UTF-8로 설정되어 있는지 확인합니다.

7. 학습 조언

  1. 모방에서 시작: 제공된 코드 예제를 직접 실행해보고, 파라미터나 값을 변경해보면서 각 기능의 동작 방식을 익힙니다.
  2. 개발자 도구 활용: 웹 브라우저의 개발자 도구 (F12)를 적극적으로 사용하여 웹 페이지의 HTML 구조를 분석하고, 요소의 id, class, name 등을 확인하며 탐색 방법을 연습합니다.
  3. 대기(Wait) 처리: 웹 페이지 로딩은 항상 예측 가능하지 않습니다. time.sleep() 뿐만 아니라, WebDriverWait를 사용한 명시적 대기 또는 암시적 대기(implicitly_wait)를 학습하여 코드의 안정성을 높이는 것이 중요합니다.
  4. 예외 처리: 네트워크 오류, 요소 미발견 등 예외 상황은 언제든지 발생할 수 있습니다. try-except 구문을 사용하여 이러한 예외를 안정적으로 처리하는 습관을 들입니다.
  5. 단계별 학습: 기본적인 브라우저 제어 및 요소 탐색 방법을 먼저 완벽히 익힌 후, iframe 전환, 알림창 처리, 파일 업로드 등 더 복잡한 기능으로 나아가는 것이 좋습니다.

태그: python selenium 웹 자동화 ChromeDriver 웹 크롤링

9월 18일 18:42에 게시됨