Strona na której chcę kliknąć przycisk ("Add user") ładuje się "przykryta" elementem, który znika, aż wszystko się wczyta (blockUI blockOverlay) zajmuje to około 150-300ms
Gdy czekam czy element jest klikalny
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id='pagecontrols']/input[1]")));
Selenium przechodzi dalej, jednak gdy chcę go kliknąć, nie jest on w rzeczywistości osiągalny i klik idzie w "blockUI blockOverlay"
Próbowałem czekać, aż się się skrypty skończą lądować, ale bez rezultatu return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
Dlatego postanowiłem poczekać, aż element zakrywający zniknie
try {
while (
driver.findElement( By.xpath("//div[@class='blockUI blockOverlay']")
).isDisplayed() ) {
System.out.println("blockOverlay is visible. Waiting for 10ms.");
Thread.sleep(10);}}
catch ( Exception nse ) {
}
lub
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='blockUI blockOverlay']")));
rozwiązanie działa, ale ma pewien problem, aby radzić sobie z opóźnieniami w ładowaniu stron używam: driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
jednak w tym przypadku powoduje to, że muszę czekać ponad 10 sekund zanim slenium zwróci mi info, że element już zniknął i mogę iść dalej
Czy ma ktoś jakąś radę ?
Dodam, że w moim teście będzie z pewne wiele takich sytuacji więc gdyby każdy wydłużył czas o 10s to będzie to już problem (globalnie też nie mogę dać niższego czasu, nawet bym chciał go zwiększyć docelowo)
EDIT
A może najlepiej po prostu całkowicie wywalić
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
I zamiast tego zawsze samemu sprawdzać czy elementu już jest dostępny przez np wait.until(ExpectedConditions.elementToBeClickable ?
Doda to masę sprawdzeń w teście, których teoretycznie można uniknąć, ale nie będzie niepotrzebnych opóźnień