2015-10-26 37 views

Odpowiedz

14

Musisz poczekać, aż Javascript i jQuery zakończą ładowanie. Wykonaj Javascript, aby sprawdzić, czy jQuery.active jest 0 i document.readyState jest complete, co oznacza, że ​​ładowanie JS i jQuery zostało zakończone.

public boolean waitForJSandJQueryToLoad() { 

    WebDriverWait wait = new WebDriverWait(driver, 30); 

    // wait for jQuery to load 
    ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver driver) { 
     try { 
      return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0); 
     } 
     catch (Exception e) { 
      // no jQuery present 
      return true; 
     } 
     } 
    }; 

    // wait for Javascript to load 
    ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() { 
     @Override 
     public Boolean apply(WebDriver driver) { 
     return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState") 
     .toString().equals("complete"); 
     } 
    }; 

    return wait.until(jQueryLoad) && wait.until(jsLoad); 
} 
+0

Dzięki :) Czy to działa z każdą witryną lub tylko z witrynami za pomocą jQuery? –

+0

Będzie działał na każdej stronie, obsługuje obecność i nieobecność Jquery'ego i JS – LINGS

+0

Dzięki - dam teraz spróbować –

2

Jak Mark Collin opisane w książce „Mastering Selen Webdriver” wykorzystać JavascriptExecutor pozwalają zorientować się, czy strony internetowej przy użyciu jQuery zakończeniu dokonywania AJAX wywołuje

public class AdditionalConditions { 

    public static ExpectedCondition<Boolean> jQueryAJAXCallsHaveCompleted() { 
    return new ExpectedCondition<Boolean>() { 

     @Override 
     public Boolean apply(WebDriver driver) { 
      return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);"); 
     } 
    }; 
    } 
} 
+0

Dzięki za podpowiedź. Ale co, jeśli strona nie używa jQuery? –

+0

Dobrze, jeśli masz inną bibliotekę javascript, musisz na niej polegać. W tej samej książce ma przykład AngularJS, inaczej zgodziłbym się z inną odpowiedzą, musisz być specyficzny dla domeny i używać [Jawnych i nieokreślonych czekania] (http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit i niejawnie czeka) –

0

Nie wierzę, że istnieje uniwersalne podejście po wyjęciu z pudełka. Zazwyczaj używam metody, która wykonuje .waituntilrowcount(2) lub waituntilvisible(), która odpytuje element.

+0

Hm - dammn. Czy istnieje jakaś inna biblioteka zdolna do indeksowania witryn ajaxowych? Próbowano selenu, htmlunit i crawljax. Problem htmlunit: Bardzo wrażliwy na błędy i nie można go wyłączyć. Crawljax: Prawdopodobnie jest w stanie indeksować ajax, ale nie można uzyskać html strony internetowej - ouch selen: patrz pytanie;) –