본문 바로가기
IT

Selenium 실행 중 오류 없이 멈추는 현상

by 소꼼냥의 일상 2025. 3. 8.
728x90
반응형

Python으로 Selenium 코드를 디버그 모드에서 실행할 때, 수행 중 반응이 없는 경우는 여러 가지 원인으로 발생할 수 있습니다. 가장 일반적인 원인과 그 해결 방법을 아래에 정리해 드리겠습니다.

1. 페이지 로딩 대기 시간 부족

페이지가 로딩되기 전에 코드가 실행되면 요소를 찾지 못하거나, 요소를 클릭하려고 할 때 반응이 없는 경우가 있습니다. 이는 웹 페이지가 완전히 로딩되기 전에 요소를 찾으려 할 때 발생할 수 있습니다.

해결 방법:

  • time.sleep(지연시간(초)): 페이지가 완전히 로드될 때까지 잠시 기다리는 방법입니다.
  • Explicit Wait: Selenium의 WebDriverWait을 사용하여 특정 요소가 로드될 때까지 대기하는 방법입니다. sleep으로 주어진 지연 시간은 페이지가 완전히 로드 되는 것을 보장할 수는 없으며 조건에 따라서 로드까지의 시간의 가변적일 수 있어서 이 방법이 time.sleep()보다 더 효율적입니다.

예시: WebDriverWait을 사용하는 방법

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

#옵션 설정
options = webdriver.ChromeOptions()

#서비스 설정
# WebDriverManager로 ChromeDriver 경로를 자동 가져옴
service = Service(ChromeDriverManager().install())

#Chrome driver
driver = webdriver.Chrome(options=options, service=service)

# 페이지 열기
driver.get('https://www.example.com')

# 방법1. 페이지가 로딩될 때까지 잠시 대기
# time.sleep(2)

# 방법2. 특정 요소가 로드될 때까지 대기 (최대 10초 대기)
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, 'some_element_id'))
)

# 요소가 준비되면 작업 수행
element.click()

# 브라우저 종료
driver.quit()

2. 잘못된 XPath나 CSS 선택자

Selenium에서 사용하는 XPath나 CSS 선택자가 잘못된 경우, 해당 요소를 찾지 못하고 대기 상태가 지속될 수 있습니다. 이는 디버그 모드에서 잘못된 요소를 찾고 있을 때 발생할 수 있습니다.

해결 방법:

  • 개발자 도구(Chrome의 F12)를 열어 XPath나 CSS 선택자가 올바른지 확인합니다.
  • find_element()나 find_elements()가 반환하는 값을 확인하여 해당 요소가 존재하는지 체크합니다.

예시: 요소 찾을 때 확인하기

element = driver.find_element(By.XPATH, '//button[@class="submit"]')

if element:
    element.click()
else:
    print("요소를 찾을 수 없습니다.")

3. 브라우저와 드라이버의 버전 불일치

Chrome 브라우저와 ChromeDriver의 버전이 일치하지 않으면 Selenium이 정상적으로 작동하지 않을 수 있습니다. 드라이버가 브라우저의 최신 버전과 호환되지 않는 경우, 반응이 없거나 에러가 발생할 수 있습니다.

해결 방법:

  • ChromeDriver 버전 확인: 사용 중인 Chrome 브라우저의 버전에 맞는 ChromeDriver를 다운로드하고, webdriver.Chrome(executable_path='path_to_chromedriver')로 드라이버 경로를 지정합니다.

4. 브라우저 설정 문제

브라우저에서 팝업, 알림, 보안 경고 등으로 인해 Selenium이 제대로 동작하지 않는 경우가 있습니다. 예를 들어, 브라우저에서 "이 사이트에 대한 액세스가 차단되었습니다." 같은 팝업을 띄울 수 있습니다.

해결 방법:

  • 브라우저 옵션 설정: Options를 사용하여 브라우저에서 불필요한 팝업이나 알림을 비활성화할 수 있습니다.

예시: Chrome에서 팝업 비활성화하기

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--disable-notifications")  # 알림 비활성화
chrome_options.add_argument("--headless")  # 헤드리스 모드 (브라우저 UI 없이 실행)

driver = webdriver.Chrome(options=chrome_options)

# 페이지 열기
driver.get("https://www.example.com")

# 작업 수행
driver.quit()

5. 헤드리스 모드(Headless Mode) 문제

헤드리스 모드에서 Selenium을 실행하면 실제 화면을 띄우지 않고 동작하지만, 이 모드에서 일부 동작이 예상대로 이루어지지 않는 경우가 있을 수 있습니다. 예를 들어, 일부 JavaScript 동작이나 CSS 애니메이션이 헤드리스 모드에서는 다르게 작동할 수 있습니다.

해결 방법:

  • 헤드리스 모드를 비활성화: 테스트를 디버그할 때는 화면을 띄운 상태로 실행하는 것이 도움이 될 수 있습니다. 헤드리스 모드를 비활성화하고 브라우저를 직접 보며 디버깅합니다.
chrome_options = Options()
chrome_options.headless = False  # 헤드리스 모드 비활성화

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.example.com')

6. 브라우저 실행 후 드라이버 종료 전까지 코드가 멈추는 경우

브라우저를 종료하기 전에 Selenium 코드가 기다리거나 멈출 때가 있습니다. 이는 특정 페이지가 로딩되는 시간이나, 어떤 이벤트가 끝날 때까지 기다리지 않아서 발생할 수 있습니다.

해결 방법:

  • driver.quit() 전에 작업이 완료되었는지 명확히 확인하고, 페이지가 완전히 로드되었거나 필요한 작업이 끝났음을 확인한 후 브라우저를 종료합니다.
# 예를 들어, 페이지가 완전히 로딩된 후 종료
if driver.title == "Expected Title":
    driver.quit()

7. 디버깅 로그 출력

디버깅을 위해 로그를 출력하거나 상태를 확인하는 방법이 유용할 수 있습니다.

해결 방법:

  • 코드에서 중간중간 print()나 logging을 추가하여 진행 상태를 출력하고, 어디서 멈추는지 파악합니다.
print("페이지 열기 시작")
driver.get("https://www.example.com")
print("페이지 열기 완료")

# 요소 찾기
element = driver.find_element(By.XPATH, '//*[@id="some_element"]')
print("요소 찾기 완료")

결론

Selenium에서 디버그 모드로 실행할 때 반응이 없는 경우는 주로 페이지 로딩 시간, 잘못된 XPath, 브라우저/드라이버 불일치, 팝업 등으로 인해 발생할 수 있습니다. WebDriverWait을 사용하여 대기 시간을 적절히 설정하고, 오류가 발생할 수 있는 부분에 대해서 로그를 찍어가며 디버깅하면 문제를 쉽게 해결할 수 있습니다.

반응형