08.selenium Wait

jeong_hyeon·2022년 1월 21일
0

웹 크롤링

목록 보기
8/8

크롤링 코딩을 하면서 페이지 이동기간동안 time 을 많이 사용했다 하지만 원하는시간만큼만 기다리기때문에 로딩이 빠르나 느리나 정해진 시간만큼 기다려야 하는 단점이 생겼다.

이를 해결하기 위해 구글링 한결과 selenium의 Wait을 찾게되었고 잊어버리지 않기위해 남겨놓는다.

1.Implicitly Wait

Implicitly Wait 은 쉽게 풀어서 말하면
페이지 이동 등의 명령을 할때 다음페이지가 넘어올때까지 기다리라는 뜻으로

driver.implicitly_wait(10)

이런식의 코드가있을경우 괄호안의 숫자만큼 다음페이지가 로딩될때 까지 기다리고 만약 실행이 되지 않았더라도 숫자만큼의 시간이 지나면 다음명령어를 실행 하겠다는 뜻이다.

물론 여기서 10초를 온전히 기다리겠다 라는게 아니라
나는 다음페이지를 불러오는데 최대 10초까지만 기다리겠다
라는 뜻이다.

2.Explicitly Wait

Explicitly Wait 은 implicitly_wait의 단점을 보안하기위해 나왔다.

예를 들어 implicitly_wait를 10초로 설정 해두었는데 웹페이지는 2~3초만에 넘어왓는데 페이지의 일부가 자바스크립트로 구현이 되어서 그부분이 화면에서 렌더링 되느라 늦게 렌더링 되었다.

이런경우 문제가 발생하는데 implicitly_wait는 웹페이지가 넘어온순간 다음 명령어가 실행될것이다.

이런 문제를 해결하기위해 Explicitly Wait이 존재하며
Explicitly Wait를 쉽게 표현하자면 내가 필요한(원하는)부분이 표시될때까지 기다려 일것 같다.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome('chromedriver.exe')
driver.get("https://pythondocs.net")
wait = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "idname")))

wait 이라고 변수를 잡아주고 WebDriverWait(driver, 10) 의 의미는 구동한 driver는 셀레니움 구동한 드라이버 변수명, 뒤에 10은 10초까지 그 부분이 필요할때까지 기다려보겠다는 의미이다. 물론 10초 이전에 그 부분이 나타나면 10초까지 다 기다리지 않는다. 엘레먼트가 나타나면 해당 엘레먼트를 wait 변수가 가리키게 된다.

until(EC.presence_of_element_located((By.ID, “idname”)))

EC.presence_of_element_located이부분은 괄호안에 요소가 나타날때까지 기다리라는 의미이다.
괄호안에는 보통
(By.ID, ‘아이디이름’)
(By.CLASS_NAME, ‘클래스명’)
(By.XPATH, ‘xpath경로’)
(By.NAME, ‘네임명’)
(By.CSS_SELECTOR, ‘CSS셀렉터’)
(By.PARTIAL_LINK_TEXT, ‘링크텍스트일부분’)
(By.LINK_TEXT, ‘링크텍스트(전부일치)’)
정도 가 들어간다.

마치 find_by__~ ~로 엘리먼트를 찾는것과 비슷하다.

0개의 댓글