페이지 부하 기다리고 있는 셀레늄

어떻게 하면 [셀레늄] [1] 2.0 진정하라구요 페이지의 로드하기에?

[1]: http://en.wikipedia.org/wiki/Selenium_% 28software% 29

질문에 대한 의견 (1)

다음과 같은 코드를 사용하여 파헤로데트 확인할 수 있습니다

IWait wait = new OpenQA.Selenium.Support.UI.WebDriverWait(driver, TimeSpan.FromSeconds(30.00));

 wait.Until(driver1 => ((IJavaScriptExecutor)driver).ExecuteScript("return document.readyState").Equals("complete"));
해설 (12)

클래스를 사용하여 웹드라이버웨이트

또한 지켜보리니 [here] [2]

[2]: http://seleniumhq.org/docs/04_webdriver_advanced.html # 명시성 및 암시적입니다 대기하는

일부 요소를 표시하십시오 기대할 수 있습니다. 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"));
해설 (7)

드라이버의 진정하라구요 암시적입니다 설정하면 어졌다면 security. 핀들레먼트 요소에 대한 '방법' 에 있을 것으로 기대하고 있습니다 로드됨 페이지, 해당 요소의 요소이거나 도달할 때까지 WebDriver 폴링합니다 시간 초과 값을 찾습니다.

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

출처: [암시적입니다 대기하는] [1]

암시적입니다 대기하는 [1]:

해설 (4)

일반적으로 웹 2.0 통제할 수 있는 경우에만 호출하는 코드를 통해 다시 한번 드라이버구성 페이지가 로드되었는지 것으로 결정했습니다. 그렇지 않으면 견딜 수 있는 ',' 핀들레먼트 라운드하지 웨이트포에르메망 문의할 수 있습니다 '또는' 발견될 때까지 호출하십시오 초과되기 (time out 설정할 수 있습니다).

해설 (6)

루비 구축상의:

wait = Selenium::WebDriver::Wait.new(:timeout => 10)
wait.until {
    @driver.execute_script("return document.readyState;") == "complete" 
}
해설 (3)

'선' 시스템리우스 제거할 수 있습니다. 디버그 목적으로 추가됩니다.

WebDriver driver_;

public void waitForPageLoad() {

    Wait wait = new WebDriverWait(driver_, 30);
    wait.until(new Function() {
        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");
        }
    });
}
해설 (1)

이러한 모든 솔루션은 양호임 구체적인 사건에 대한 몇 가지 가능한 문제를 겪을 수 있지만, 적어도 하나의.

  1. 그들은 want you to know), 충분한 시간을 주지 않는 일반 앞두고 있는 페이지의 일부 특정 조건이 true 될 것인지 (예를 들어, 일부 요소점 표시할지를)

  2. 이는 실제로 사용할 수 있는 이들은 경합이 열 수 있는 요소를 이전 페이지가 아니라 새로운 호출이네요

39 의 here& 일반 솔루션을 허용하지 않는 나의 시도는 이 문제 () 의 파이썬):

첫째, 일반 &quot wait"; 함수 (웹드라이버웨이트 사용하여 원한다면, 내가 것들이었다고요 ugly):

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__))

그런 다음, 셀레늄 (내부) 솔루션을 기반으로 한 사실을 레코드전자문서의 id 번호를 페이지에서 ',' 등 모든 요소에 대해, 최상위 &lt html&gt 요소. 이 때 얻을 수 있는 새로운 페이지를 갱신율 또는 로드되는지 새 id 를 html 요소.

그래서, 가정 내 link&quot 텍스트와 링크를 클릭하면 싶은 "; 예를 들면 다음과 같습니다.

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()

내가 있겠냐 that& # 39 의 완벽한! 어떻게 생각하세요?

자세한 정보 받을시간은 [블로그 포스트를 여기에 대한] (http://www.obeythetestinggoat.com/how-to-get-selenium-to-wait-for-page-load-after-a-click.html)

해설 (1)

클래스를 사용할 수도 있습니다. 엑스프레스테드콘딧이언스 '' 를 명시적으로 진정하라구요 요소에 대한 더 이상의 조치를 취하지 먼저 웹 페이지 up on the 표시하십시오.

'클래스' 엑스프레스테드콘딧이언스 표시되는지를 요소를 여부를 결정하는 데 사용할 수 있습니다.

WebElement element = (new WebDriverWait(getDriver(), 10)).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input#houseName")));

'클래스' 에 대해 모든 조건을 목록니다 지켜보리니 엑스프레스테드콘딧이언스 Javadoc 선택할 수 있게 됩니다.

해설 (0)

이 심각한 제한을 WebDriver 것으로 보인다. 기다리고 있는 것은 물론, 특히 로드되었는지 페이지의 DOM element 않을 수 있다 (프레디 스테이드) 이를 실행 및 CSS, JS 이미지를 완전히 구축하십시오 로드중 여전히 남아 있다.

I believe 가장 간단한 방법은 그 모든 것을 확인하고 이 초기화되었는지 onload 이벤트 후 및 JS 변수 설정 진정하라구요 엔드입니다 JS 변수로 셀레늄.

해설 (6)

39 의 재탕 오토메이티드 imran& Java 의 7:

    WebDriverWait wait = new WebDriverWait(driver, 30);

    wait.until(new ExpectedCondition() {
        public Boolean apply(WebDriver wdriver) {
            return ((JavascriptExecutor) driver).executeScript(
                "return document.readyState"
            ).equals("complete");
        }
    });
해설 (0)

기다려야 스케쳐내 불러오시길 특정 요소 () '에서' 방법 '' 레네르드베베르망 이디스플라이드 사용할 수 있습니다.

// Sleep until the div we want is visible or 5 seconds is over
long end = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < end) {
    // Browsers which render content (such as Firefox and IE) return "RenderedWebElements"
    RenderedWebElement resultsDiv = (RenderedWebElement) driver.findElement(By.className("gac_m"));

    // If results have been returned, the results are displayed in a drop down.
    if (resultsDiv.isDisplayed()) {
      break;
    }
}

(예) 에서 시작 5 분 안내선)

해설 (2)

이런 조건이 명시적으로 진정하라구요 또는 조건부 진정하라구요 이 때까지 기다립니다.

WebDriverWait wait = new WebDriverWait(wb, 60);
wait.until(ExpectedConditions.elementToBeClickable(By.name("value")));

이 모든 웹 요소점 60 초 동안 기다릴 예정이다.

모든 요소를 사용하여 페이지의 암시적으로 진정하라구요 기다리고 있다는 점에서 인도되니 하게하면서요.

driver.manage().timeouts().implicitlyWait(60, TimeUnit.SECONDS);

이 모든 웹 요소점 60 초 동안 기다릴 예정이다.

해설 (0)

모든 요소를 사용하여 페이지의 특정 시간 기다려야 인도되니 암시적으로 기다립니다.

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

이 페이지의 기다리는 모든 요소에 대해 30 초.

주어진 조건 또는 조건부 진정하라구요 이 때까지 기다려 기다려 기다려 다른 용어가 사용되고 있다.

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));

화면의 페이지 요소 id 의 id 열거하십시오 원하는거요 디피덴틀리 대로 페이지는 정적 로드.

해설 (1)

39 m, t, 술어 i& 놀라게 한 때 일반적으로 알고 있는 첫 번째 솔루션으로서의 weren& # 39 요소 (s), re 기다림커서 로드하기에 you& # 39 페이지에 다음 상호 작용할 수 있습니다. 늘 내 외곽진입 구축할 수 있는 것 같은 기능을 술어 (문자열 id) '와' / '웨이트포렐레멘트베이드 웨이트포에르메트비시블비클레스 (구체화하십시오 className)' 등 언제 어디서나 사용할 수 있을 뿐만 아니라, 그 후 이러한 및 재사용합니다 데릭쉐퍼드와 페이지의 로딩 또는 페이지 내용 변경 I& # 39 m, 대기 중.

예를 들어,

내 테스트 클래스:

driverWait.until(textIsPresent("expectedText");

내 테스트 클래스가 부모:

protected Predicate textIsPresent(String text){
    final String t = text;
    return new Predicate(){
        public boolean apply(WebDriver driver){
            return isTextPresent(t);
        }
    };
}

protected boolean isTextPresent(String text){
    return driver.getPageSource().contains(text);
}

비록 이 같다 많이유 거듭 확인 당신꺼에요 잘 걸립니다. 얼마나 자주 함께 설정되었습니다 궁극적인 및 간격 확인할 수 있습니다. 대기 시간 초과되기 전에. 또한, 이러한 방법을 재사용합니다 됩니다.

이 예에서 상위 클래스 정의 '와' 이 'WebDriver 드라이버구성 초기화됨 웹드라이버웨이트 드라이버웨이트'.

이렇게 하면 좋겠다.

해설 (1)
  • 노데지스 Solution:*

  • It in * 노데지스 공약을 통해 얻을 수 있습니다.

이 코드를 작성하는 경우 확인할 수 있습니다 다음 페이지가 완전히 때 로드되었는지 액세스할 수 있습니다.

driver.get('www.sidanmor.com').then(()=> {
    // here the page is fully loaded!!!
    // do your stuff...
}).catch(console.log.bind(console));

이 코드를 작성하는 경우 3 초 기다리는 이동하고 있는 것입니다.

driver.get('www.sidanmor.com');
driver.sleep(3000);
// you can't be sure that the page is fully loaded!!!
// do your stuff... hope it will be OK...

셀레늄 에서 문서:

티s.제 (url) thenable&lt undefined>;

주어진 명령을 스케줄링합니다 탐색하십시오 uirl.

때 마침 로드중 약속이 되돌려줍니다 확인할 수 있는 문서가 .

[셀레늄 설명서 (노데지스)] [1]

[1]: # http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/chrome_exports_driver.html 확보하십시오.

해설 (0)

이 스크립트는 아래에 호출하십시오 기능을 javascript 를 사용하여 인도되니 기다리는 페이지 로드되지 않았습니다.

public static boolean isloadComplete(WebDriver driver)
{
    return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("loaded")
            || ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete");
}
해설 (1)
/**
 * Call this method before an event that will change the page.
 */
private void beforePageLoad() {
    JavascriptExecutor js = (JavascriptExecutor) driver;
    js.executeScript("document.mpPageReloaded='notYet';");
}

/**
 * Call this method after an event that will change the page.
 * 
 * @see #beforePageLoad
 * 
 *      Waits for the previous page to disappear.
 */
private void afterPageLoad() throws Exception {
    (new WebDriverWait(driver, 10)).until(new Predicate() {

        @Override
        public boolean apply(WebDriver driver) {
            JavascriptExecutor js = (JavascriptExecutor) driver;
            Object obj = js.executeScript("return document.mpPageReloaded;");
            if (obj == null) {
                return true;
            }
            String str = (String) obj;
            if (!str.equals("notYet")) {
                return true;
            }
            return false;
        }
    });
}

이 문서에서 변경할 수 있는 요소가 있는 경우, 일부만 문서 바뀌고 있다.

이 기법은 신세바스치 답을 영감을 얻었다.

해설 (0)
  • 셀레니어음와이터 *:
import com.google.common.base.Function;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.WebDriverWait;

public class SeleniumWaiter {

      private WebDriver driver;

      public SeleniumWaiter(WebDriver driver) {
           this.driver = driver;
      }

      public WebElement waitForMe(By locatorname, int timeout){
           WebDriverWait wait = new WebDriverWait(driver, timeout);
           return wait.until(SeleniumWaiter.presenceOfElementLocated(locatorname));
      }

      public static Function presenceOfElementLocated(final By locator) {
            // TODO Auto-generated method stub
            return new Function() {
                 @Override
                 public WebElement apply(WebDriver driver) {
                      return driver.findElement(locator);
                 }
            };
      }
 }
    • 이를 사용할 수 있습니다.
_waiter = new SeleniumWaiter(_driver);

try {
   _waiter.waitForMe(By.xpath("//..."), 10);
} 
catch (Exception e) {
   // Error
}
해설 (0)

페이지 로드되는지 Java 바인딩을 위한 가장 좋은 방법은 기다리는 사용할 때 사용할 수 있는 페이지를 객체에는 페이지파스토리 WebDriver 디자인 패턴이다. 간단히 말해 '역할을 하고 있는 아이아스엘레멘트로카토르파스토리 활용할 수 있습니다' 당신의 모든 요소를 노드전역 기다립니다. 이 회사는 같은 요소에 대한 제한이 필요한 코드 양을 획기적으로 줄일 수 있지만, 복잡한 드롭합니다 상자 javascript 전환 속도를 높이고 테스트 시간. 이 블로그 게시물 좋은 예를 찾을 수 있습니다. 코어 Java 에 대한 기본적인 이해 간주됩니다.

http://startingwithseleniumwebdriver.blogspot.ro/2015/02/wait-in-page-factory.html

해설 (0)

아래 기존 페이지에로트티메우스 시간은 설정하기 위한 방법을 사용할 수 있습니다. 아래 예를 취하고 있는 페이지의 경우 20 초 이상 로드하기에 관심용 페이지 리로드하려면 예외가 던져질 것이다

 WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS)
해설 (0)