반응형

파이썬, 셀레니움 응답 기다리기 

 

글. 수알치 오상문 

 

다음과 같은 웹 페이지가 있다고 하자. 

 

<!doctype html>
<meta charset=utf-8>
<title>Race Condition Example</title>
<script>
  var initialised = false;
  window.addEventListener("load", function() {
    var newElement = document.createElement("p");
    newElement.textContent = "Hello from JavaScript!";
    document.body.appendChild(newElement);
    initialised = true;
  });
</script>

 

셀레님움에서 특정 요소를 가져올 때 응답 시간차이로 에러가 발생할 수 있다.

driver.navigate("file:///race_condition.html")
el = driver.find_element(By.TAG_NAME, "p")
assert el.text == "Hello from JavaScript!"

 

다음처럼 응답 시간 10초로 설정해서 기다릴 수 있다. (10초 이전이라도 응답이 처리된다.)

from selenium.webdriver.support.ui import WebDriverWait
def document_initialised(driver):
    return driver.execute_script("return initialised")
driver.navigate("file:///race_condition.html")
WebDriverWait(driver, timeout=10).until(document_initialised)
el = driver.find_element(By.TAG_NAME, "p")
assert el.text == "Hello from JavaScript!"

 

다음처럼 특정 조건이 만족할 때까지 기다리는 것도 가능하다. (예; p 태그를 발견하면)

from selenium.webdriver.support.ui import WebDriverWait
driver.navigate("file:///race_condition.html")
el = WebDriverWait(driver, timeout=3).until(lambda d: d.find_element_by_tag_name("p"))
assert el.text == "Hello from JavaScript!"

 

다음은 id가 myDynamicElement인 요소가 올 때까지 기다린다.

driver = Firefox()
driver.implicitly_wait(10)
driver.get("http://somedomain/url_that_delays_loading")
my_dynamic_element = driver.find_element(By.ID, "myDynamicElement")

 

다음처럼 조건을 기다리는 최대 시간과 조건을 확인하는 조건을 정의할 수도 있다.  페이지에서 요소를 검색할 때 NoSuchElementException과 같이 기다리는 동안 특정 유형의 예외를 무시하며 기다리도록 설정할 수 있다.

driver = Firefox()
driver.get("http://somedomain/url_that_delays_loading")
wait = WebDriverWait(driver, timeout=10, poll_frequency=1, ignored_exceptions=[ElementNotVisibleException, ElementNotSelectableException])
element = wait.until(EC.element_to_be_clickable((By.XPATH, "//div")))

 

 

반응형

+ Recent posts