하이어시스템 소개
원문:https://selenium-python.readthedocs.io/waits.html
Waits
현재 대부분의 웹 어플리케이션은 AJAX 기술을 사용하고 있습니다. 브라우저에서 페이지를 로드할 때 해당 페이지의 요소들은 다양한 시간 간격으로 로드될 수 있습니다. 이로 인해 요소들을 찾는 것이 어려워집니다: 만약 요소가 DOM에 아직 존재하지 않는다면, locate 함수(=Web Element 위치를 찾는 함수)는 ElementNotVisibleException 예외를 발생시킵니다. 우리는 Waits(대기)를 사용하여 이 문제를 해결할 수 있습니다. 대기는 수행된 작업 사이에 여유를 제공하며, 주로 요소를 찾거나 요소와 관련된 다른 작업을 수행할 때 사용됩니다.
Selenium Webdriver는 두 가지 종류의 Waits를 제공합니다. 첫번째는 Implicit Waits(암묵적 대기)와 Explicit Waits(명시적 대기)입니다. 명시적 대기는 WebDriver가 특정 조건이 충족될 때까지 실행을 진행하지 않도록 지정하는 것입니다. 암묵적 대기는 WebDriver가 요소를 찾을 때 DOM을 일정 시간 동안 붙잡고 있는 것입니다.
5.1. Explicit Wait 명시적 대기
명시적 대기는 코드 내에서 특정 조건이 충족될 때까지 기다리도록 정의하는 것입니다. 이것의 극단적인 경우는 time.sleep()으로, 정확한 시간 기간을 기다리도록 조건을 설정합니다. 필요한 만큼만 기다리는 코드를 작성하는 데 도움이 되는 몇 가지 편의 메서드가 제공됩니다. WebDriverWait와 ExpectedCondition을 조합하여 이를 수행할 수 있습니다.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
위의 코드에서 Selenium은 주어진 조건과 일치하는 요소를 찾기 위해 최대 10초까지 기다립니다. 만약 해당 시간 동안 요소를 찾지 못하면 TimeoutException이 발생합니다. 기본적으로 WebDriverWait는 ExpectedCondition을 500 밀리초마다 호출하여 성공할 때까지 기다립니다. ExpectedCondition은 요소를 찾지 못했을 경우 True (불린)을 반환하거나 성공하지 못했을 경우 null이 아닌 다른 값이 반환됩니다.
기대 조건 (Expected Conditions)
웹 브라우저를 자동화하는 데 유용한 몇 가지 일반적인 조건들이 있습니다. 각각의 이름은 아래와 같습니다. Selenium Python 바인딩은 이들을 사용하기 위한 편의 메서드를 제공하여 직접 expected_condition 클래스를 작성하거나 자체 유틸리티 패키지를 만들 필요가 없게 해줍니다.
-title_is
-title_contains
-presence_of_element_located
-visibility_of_element_located
-visibility_of
-presence_of_all_elements_located
-text_to_be_present_in_element
-text_to_be_present_in_element_value
-frame_to_be_available_and_switch_to_it
-invisibility_of_element_located
-element_to_be_clickable
-staleness_of
-element_to_be_selected
-element_located_to_be_selected
-element_selection_state_to_be
-element_located_selection_state_to_be
-alert_is_present
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, 'someid')))
5.2. Implicit Wait 암묵적 대기
암묵적 대기는 WebDriver가 즉시 사용 가능하지 않은 요소(또는 요소들)를 찾을 때 DOM을 일정 시간 동안 폴링하도록 지시합니다. 기본 설정은 0(영)입니다. 설정된 후 암묵적 대기는 WebDriver 객체의 수명 동안 계속 유지됩니다.
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
'파이썬코드공유' 카테고리의 다른 글
구글 시트 API 연결하기 (0) | 2023.08.07 |
---|---|
셀레니움 find_element XPath 완벽 해설 (0) | 2023.08.04 |
셀레니움 웹드라이버 close 와 quit 차이점 (0) | 2023.08.04 |
셀레니움 selenium 매크로 탐지 회피 전략 (0) | 2023.08.04 |
Tkinter Background Task 백그라운드 작업 (0) | 2023.08.03 |