Selenium 2.0에서 페이지가로드 될 때까지 어떻게 대기합니까?
답변
다음 코드를 사용하여 페이지로드를 확인할 수도 있습니다.
IWait<IWebDriver> wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));
wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
답변
WebDriverWait 클래스 사용
여기 참조
당신은 어떤 요소를 보여줄 것으로 기대할 수 있습니다. C #과 같은 것 :
WebDriver _driver = new WebDriver();
WebDriverWait _wait = new WebDriverWait(_driver, new TimeSpan(0, 1, 0));
_wait.Until(d => d.FindElement(By.Id("Id_Your_UIElement"));
답변
드라이버의 암시 적 대기를 설정 한 다음 findElement
로드 된 페이지에있을 것으로 예상되는 요소 에서 메소드 를 호출 하면 WebDriver는 요소를 찾거나 시간 종료 값에 도달 할 때까지 해당 요소를 폴링합니다.
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
출처 : 암시 적 대기
답변
일반적으로 Selenium 2.0의 경우 웹 드라이버는 페이지가로드 된 것으로 판단되면 호출 코드로 제어를 반환해야합니다. 그렇지 않은 waitforelemement
경우을 호출 할 수 있습니다. 호출 findelement
은 발견되거나 시간 초과 될 때까지 라운드 호출을 순환 합니다 (시간 초과를 설정할 수 있음).
답변
루비 구현 :
wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
@driver.execute_script("return document.readyState;") == "complete"
}
답변
System.out
라인을 제거 할 수 있습니다 . 디버그 목적으로 추가됩니다.
WebDriver driver_;
public void waitForPageLoad() {
Wait<WebDriver> wait = new WebDriverWait(driver_, 30);
wait.until(new Function<WebDriver, Boolean>() {
public Boolean apply(WebDriver driver) {
System.out.println("Current Window State : "
+ String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")));
return String
.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState"))
.equals("complete");
}
});
}
답변
이러한 모든 솔루션은 특정 경우에 적합하지만 두 가지 가능한 문제 중 하나 이상이 발생합니다.
-
그것들은 충분히 일반적이지 않습니다-그들은 당신이 당신이 가고있는 페이지에 대해 특정 조건이 참임을 미리 알고 싶어합니다 (예 : 일부 요소가 표시됩니다)
-
이전 페이지와 새 페이지에 실제로 존재하는 요소를 사용하는 경쟁 조건에 개방적입니다.
파이썬 에서이 문제를 피하는 일반적인 솔루션에 대한 나의 시도는 다음과 같습니다.
먼저, 일반적인 “대기”함수 (원하는 경우 WebDriverWait를 사용하면 추악합니다) :
def wait_for(condition_function):
start_time = time.time()
while time.time() < start_time + 3:
if condition_function():
return True
else:
time.sleep(0.1)
raise Exception('Timeout waiting for {}'.format(condition_function.__name__))
다음으로 솔루션은 셀레늄이 최상위 <html>
요소를 포함하여 페이지의 모든 요소에 대해 (내부) id 번호를 기록한다는 사실에 의존합니다 . 페이지를 새로 고치거나로드하면 새 ID를 가진 새로운 html 요소가 표시됩니다.
예를 들어, “my link”라는 텍스트가있는 링크를 클릭한다고 가정하면 다음과 같습니다.
old_page = browser.find_element_by_tag_name('html')
browser.find_element_by_link_text('my link').click()
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
더 파이썬적이고 재사용 가능한 일반 도우미를 위해 컨텍스트 관리자를 만들 수 있습니다.
from contextlib import contextmanager
@contextmanager
def wait_for_page_load(browser):
old_page = browser.find_element_by_tag_name('html')
yield
def page_has_loaded():
new_page = browser.find_element_by_tag_name('html')
return new_page.id != old_page.id
wait_for(page_has_loaded)
그리고 거의 모든 셀레늄 상호 작용에 사용할 수 있습니다.
with wait_for_page_load(browser):
browser.find_element_by_link_text('my link').click()
방탄이라고 생각합니다! 어떻게 생각해?
블로그 게시물에 대한 자세한 정보는 여기