এই থ্রেডটি কিছুটা পুরানো, তবে ভেবেছিলাম আমি বর্তমানে যা করছি তা পোস্ট করব (কাজ চলছে)।
যদিও আমি এখনও পরিস্থিতিগুলিতে আঘাত করছি যেখানে সিস্টেমটি ভারী বোঝার মধ্যে রয়েছে এবং আমি যখন একটি জমা দেওয়ার বোতামে ক্লিক করি (যেমন, login.jsp), তখন তিনটি শর্ত (নীচে দেখুন) ফিরে আসবে true
তবে পরের পৃষ্ঠা (যেমন, হোম.জেএসপি) হ্যান ' টি এখনও লোড করা শুরু করে।
এটি একটি জেনেরিক অপেক্ষার পদ্ধতি যা প্রত্যাশিত শর্তগুলির একটি তালিকা গ্রহণ করে।
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) {
break;
}
}
return isLoaded;
}
আমি বিভিন্ন পুনরায় ব্যবহারযোগ্য প্রত্যাশিত শর্তগুলি সংজ্ঞায়িত করেছি (তিনটি নীচে রয়েছে)। এই উদাহরণে, তিনটি প্রত্যাশিত শর্তের মধ্যে ডকুমেন্ট রয়েছে readyডিয়ারস্টেট = 'সম্পূর্ণ', কোনও "ওয়েট_ডায়ালগ" উপস্থিত নেই, এবং কোনও 'স্পিনার' নেই (উপাদানগুলিকে অ্যাসিঙ্ক ডেটা নির্দেশ করার অনুরোধ করা হচ্ছে)।
সমস্ত ওয়েব পৃষ্ঠাগুলিতে কেবল প্রথমটি সাধারণভাবে প্রয়োগ করা যেতে পারে।
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;
}
};
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;
}
};
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.EPreCCitions