반응형
파이썬, 셀레니움 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")
반응형
'웹 크롤링, 스크래핑' 카테고리의 다른 글
셀레니움(파이썬), 에러를 줄이는 스크래핑 (0) | 2022.09.04 |
---|---|
셀레리움 웹드라이버 최신 버전 관리 (0) | 2022.09.02 |
ERROR: Could not find a version that satisfies the requirement seleniumrequests (0) | 2022.08.27 |
셀레니움, 영문 가이드 링크 (0) | 2022.08.27 |
파이썬, 셀레니움에서 파일 다운로드 및 스크린샷 저장하기 (0) | 2022.08.14 |