반응형

파이썬, 셀레니움 Explicit Waits 예제

글. 수알치 오상문 

 

from selenium import webdriver
import chromedriver_autoinstaller
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# webdirver 설정(Chrome)
chromedriver_autoinstaller.install()
options = Options()
# options.add_argument('headless'); # headless는 화면이나 페이지 이동을 표시하지 않고 동작하는 모드
driver = webdriver.Chrome(options=options, desired_capabilities=desired_caps)
driver.maximize_window()
driver.implicitly_wait(10)  # 크롬 브라우저 내부 대기 (암묵적 대기)
# 주의!!! 아래 예제는 특정 URL에 접속한 상태라고 가정하고 진행합니다.
#         그러므로 해당 사용 예만 참고하기 바랍니다
#
# 참고: By.XPATH 이외에 다른 선택어도 사용할 수 있습니다. 
try:
    driver.get('https://www.naver.com')
    # 요소가 클릭 가능한 상태이면 element를 돌려준다.
    el = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, 'someid'))) 
    el.click()
    el = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CLASS_NAME, 'some_classname')))
    el.click()
    el = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, 'some_name')))
    el.click()
    # 페이지/탭 제목(title값)이 지정한 텍스트와 같으면(대소문자 구분) True를 반환한다. 
    ret = WebDriverWait(driver, 10).until(EC.title_is('home'))
    # 페이지/탭 제목(title값)에 지정한 텍스트가 포함되었으면(대소문자 구분) True를 반환한다.
    ret = WebDriverWait(driver, 10).until(EC.title_contains('login'))
    # 특정 프레임(iframe)이 존재하면 그 프레임으로 이동한다. 성공하면 True를 반환한다.
    ret = WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH, 'locater')))
    # 참고: driver.switch_to.frame('iframeResult')  # iframe 선택
    # DOM locater가 화면에 안보이는 상태이면 True를 반환한다.
    ret = WebDriverWait(driver, 10).until(EC.invisibility_of_element_located((By.XPATH, 'locater')))
    # element가 DOM에서 제거될 때까지 기다리다가 제거되면 True를 반환한다.
    ret = WebDriverWait(driver, 10).until(EC.staleness_of((By.XPATH, 'element')))
    # 라디오버튼, 체크박스 element가 selected 상태면 True를 반환한다. (실패시 에러)
    ret = WebDriverWait(driver, 10).until(EC.element_to_be_selected((By.XPATH, 'element')))
    # 라디오버튼, 체크박스 locater가 selected 상태이면 True를 반환한다. (실패시 에러)
    ret = WebDriverWait(driver, 10).until(EC.element_located_to_be_selected((By.XPATH, 'locater')))
    # element 선택 상태(selected) 여부를 True/False로 지정하여 확인한다.
    ret = WebDriverWait(driver, 10).until(EC.element_selection_state_to_be((By.XPATH, 'element'), True))        
    ret = WebDriverWait(driver, 10).until(EC.element_selection_state_to_be((By.XPATH, 'element'), False))
    # locater 선택 상태(selected) 여부를 True/False로 지정하여 확인한다.
    ret = WebDriverWait(driver, 10).until(EC.element_located_selection_state_to_be((By.XPATH, 'locater'), True)) 
    ret = WebDriverWait(driver, 10).until(EC.element_located_selection_state_to_be((By.XPATH, 'locater'), False))
    # alert 창이 나타났는지 확인한다.
    ret = WebDriverWait(driver, 10).until(EC.alert_is_present())  
except Exception as e:
    print('Error:', e)
try:
    # 지정한 DOM locater가 있으면 element를 반환한다. (실패하면 에러 발생)
    el = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, 'locater')))
    # 지정한 DOM locater가 화면에 보이는 상태면 element를 반환한다.
    # (화면에 나타나는 상태이고 높이/너비가 모두 0보다 커야 한다.)
    el = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.XPATH, 'locater')))
    # 지정한 DOM element가 화면에 보이는 상태면 element를 반환한다.
    el = WebDriverWait(driver, 10).until(EC.visibility_of((By.XPATH, 'element')))
    # 해당하는 DOM locater에 해당하는 모든 요소를 리스트로 반환한다. 
    data = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH, 'locater')))
    # 지정한 locater에 text 값('애국가')이 존재하면 element를 반환한다.
    el = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element((By.XPATH, 'locater'), '애국가'))
    # 지정한 element에 text 값('동해물과 백두산')이 존재하면 element를 반환한다.
    el = WebDriverWait(driver, 10).until(EC.text_to_be_present_in_element_value((By.XPATH, 'element'), '동해물과 백두산'))
    # element가 클릭 가능한 상태이면 element를 반환한다.
    el = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, 'element')))
except Exception as e:  # 시간 경과 시 에러 발생
    print('Error:', e)
finally:    
    driver.close()    
    driver.quit()
# 버튼 요소를 클릭하고 페이지가 재로딩될 때까지 기다린다.
def clickAndWaitForPageLoad(timeout=10):
    """
    Click the some button on page and wait for the next page to load.
    """
    html = driver.find_element_by_tag_name('html')
    driver.find_element_by_tag_name('button').click()
    # 페이지 재로딩이 시작될 때까지 기다림
    WebDriverWait(driver, timeout).until(expected_conditions.staleness_of(html))
    # 페이지 재로딩이 끝날 때까지 기다림
    WebDriverWait(driver, timeout).until(lambda driver: driver.execute_script("return document.readyState;") == "complete") 
def WaitForPageLoad(timeout=10):
    # 페이지 재로딩이 시작될 때까지 기다림
    WebDriverWait(driver, timeout).until(expected_conditions.staleness_of(html))
    # 페이지 재로딩이 끝날 때까지 기다림
    WebDriverWait(driver, timeout).until(lambda driver: driver.execute_script("return document.readyState;") == "complete")

 

반응형

+ Recent posts