Czy istnieje uniwersalne podejście do Selenium, aby poczekać na załadowanie wszystkich treści ajax? (Nie związany z konkretnym stronie - tak to działa na każdym ajax stronie)Selenium czekać na załadowanie zawartości Ajax - podejście uniwersalne
Odpowiedz
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);
}
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);");
}
};
}
}
Dzięki za podpowiedź. Ale co, jeśli strona nie używa jQuery? –
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) –
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.
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;) –
Dzięki :) Czy to działa z każdą witryną lub tylko z witrynami za pomocą jQuery? –
Będzie działał na każdej stronie, obsługuje obecność i nieobecność Jquery'ego i JS – LINGS
Dzięki - dam teraz spróbować –