यह धागा थोड़ा पुराना है, लेकिन मुझे लगा कि मैं वर्तमान में क्या करूंगा (कार्य प्रगति पर है)।
हालाँकि, मैं अभी भी उन स्थितियों से जूझ रहा हूँ जहाँ सिस्टम भारी लोड के अधीन है और जब मैं सबमिट बटन पर क्लिक करता हूँ (जैसे, login.jsp), तो तीनों स्थितियाँ (नीचे देखें) वापसी true
लेकिन अगला पृष्ठ (जैसे, home.jsp) hasn ' टी अभी तक लोड करना शुरू कर दिया।
यह एक सामान्य प्रतीक्षा विधि है जो ExpectedConditions की सूची लेती है।
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;
}
मैंने विभिन्न पुन: प्रयोज्य ExpectedConditions (तीन नीचे हैं) को परिभाषित किया है। इस उदाहरण में, तीन अपेक्षित स्थितियों में document.readyState = 'पूरा', वर्तमान में कोई "Wait_dialog" शामिल है, और कोई 'spinners' (तत्व जो async डेटा का संकेत देने का अनुरोध किया जा रहा है)।
केवल पहले वाले को सभी वेब पेजों पर उदारतापूर्वक लागू किया जा सकता है।
/**
* 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;
}
};
पृष्ठ के आधार पर, मैं उनमें से एक या सभी का उपयोग कर सकता हूं:
waitForPageLoad(timeoutInSec,
EXPECT_DOC_READY_STATE,
EXPECT_NOT_WAITING,
EXPECT_NO_SPINNERS
);
निम्न वर्ग में पूर्वनिर्धारित अपेक्षित शर्तें भी हैं : org.openqa.selenium.support.ui.ExpectedConditions