Chủ đề này cũ hơn một chút, nhưng tôi nghĩ tôi sẽ đăng những gì tôi hiện đang làm (đang tiến hành).
Mặc dù tôi vẫn gặp phải các tình huống trong đó hệ thống đang tải nặng và khi tôi nhấp vào nút gửi (ví dụ: login.jsp), cả ba điều kiện (xem bên dưới) đều trả về true
nhưng trang tiếp theo (ví dụ: home.jsp) thì không ' chưa bắt đầu tải.
Đây là một phương pháp chờ chung sử dụng một danh sách các Điều kiện mong đợi.
public boolean waitForPageLoad(int waitTimeInSec, ExpectedCondition<Boolean>... conditions) {
boolean isLoaded = false;
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(waitTimeInSec, TimeUnit.SECONDS)
.ignoring(StaleElementReferenceException.class)
.pollingEvery(2, TimeUnit.SECONDS);
for (ExpectedCondition<Boolean> condition : conditions) {
isLoaded = wait.until(condition);
if (isLoaded == false) {
//Stop checking on first condition returning false.
break;
}
}
return isLoaded;
}
Tôi đã xác định các Điều kiện mong đợi có thể tái sử dụng khác nhau (ba điều kiện bên dưới). Trong ví dụ này, ba điều kiện mong đợi bao gồm document.readyState = 'complete', không có "wait_dialog" và không có 'spinners' (phần tử cho biết dữ liệu không đồng bộ đang được yêu cầu).
Chỉ cái đầu tiên có thể được áp dụng chung cho tất cả các trang web.
/**
* Returns 'true' if the value of the 'window.document.readyState' via
* JavaScript is 'complete'
*/
public static final ExpectedCondition<Boolean> EXPECT_DOC_READY_STATE = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
String script = "if (typeof window != 'undefined' && window.document) { return window.document.readyState; } else { return 'notready'; }";
Boolean result;
try {
result = ((JavascriptExecutor) driver).executeScript(script).equals("complete");
} catch (Exception ex) {
result = Boolean.FALSE;
}
return result;
}
};
/**
* Returns 'true' if there is no 'wait_dialog' element present on the page.
*/
public static final ExpectedCondition<Boolean> EXPECT_NOT_WAITING = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
Boolean loaded = true;
try {
WebElement wait = driver.findElement(By.id("F"));
if (wait.isDisplayed()) {
loaded = false;
}
} catch (StaleElementReferenceException serex) {
loaded = false;
} catch (NoSuchElementException nseex) {
loaded = true;
} catch (Exception ex) {
loaded = false;
System.out.println("EXPECTED_NOT_WAITING: UNEXPECTED EXCEPTION: " + ex.getMessage());
}
return loaded;
}
};
/**
* Returns true if there are no elements with the 'spinner' class name.
*/
public static final ExpectedCondition<Boolean> EXPECT_NO_SPINNERS = new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
Boolean loaded = true;
try {
List<WebElement> spinners = driver.findElements(By.className("spinner"));
for (WebElement spinner : spinners) {
if (spinner.isDisplayed()) {
loaded = false;
break;
}
}
}catch (Exception ex) {
loaded = false;
}
return loaded;
}
};
Tùy thuộc vào trang, tôi có thể sử dụng một hoặc tất cả chúng:
waitForPageLoad(timeoutInSec,
EXPECT_DOC_READY_STATE,
EXPECT_NOT_WAITING,
EXPECT_NO_SPINNERS
);
Ngoài ra còn có các Điều kiện mong đợi được xác định trước trong lớp sau: org.openqa.selenium.support.ui.E Dự kiến Điều kiện