У меня есть этот метод, использующий неявное ожидание, предварительно настроенный для возврата мне WebElement
:
private WebElement findElement(By locator) {
WebElement element = null;
for (int i = 0; i <= numberOfTries && element == null; i++)
try {
waiter.until(ExpectedConditions.elementToBeClickable(locator));
element = driver.findElement(locator);
} catch (TimeoutException | NoSuchElementException e) {
System.out.println(specificStringAboutTimeOutAndNoSuchEl);
} catch (WebDriverException e) {
Throwable cause = null;
Throwable result = e;
while (null != (cause = result.getCause()) && (result != cause))
result = cause;
System.out.println(specificStringAboutException);
System.out.println(result);
}
return element;
}
И это для ожидания исчезновения некоторых других элементов, таких как счетчики и экраны загрузки:
private void waitsElementToVanish(By locator, String previousOp) {
List<Class<? extends Throwable>> ignorableExceptions = new ArrayList<>();
ignorableExceptions.add(StaleElementReferenceException.class);
ignorableExceptions.add(NoSuchElementException.class);
try {
if (driver.findElements(locator).size() > 0)
System.out.println(locator.toString() + " exists");
waiter.ignoreAll(ignorableExceptions).until(ExpectedConditions.visibilityOfElementLocated(locator));
waiter.ignoreAll(ignorableExceptions).until(ExpectedConditions.invisibilityOfElementLocated(locator));
} catch (TimeoutException e) {
System.out.println("timeout waiting " + locator.toString() + " to vanish");
System.out.println(previousOp);
}
}
И я использую их так:
waitsElementToVanish(By.className("spinnerLoading"), "someString");
findElement(By.xpath(otherElement)).click();
И я получаю эту ошибку на .click()
:
org.openqa.selenium.WebDriverException: unknown error: Element <div class="menuContent ellipsis flex flexGrow">...</div> is not clickable at point (136, 240). Other element would receive the click: <div class="spinnerLoading">...</div>
Этот - это веб-сайт, который яЯ использую и это приложение является чисто образовательным.Это весь код .
Должен ли я обернуть метод Selenium
click
в какой-либо WebDriverException, например:
- Пытается щелкнуть, если выбрасывается WebDriverExceptionс
spinnerClass
, переходит к waitsElementToVanish
и затем пытается снова - Если количество попыток выходит за пределы, то возникает исключение
ReallyMessedUpExceptionDoSomething!
.
Мой вопросявляется: Я хочу избежать Thread.sleep()
любой ценой.Я хочу оптимизировать время тестирования, ожидая только того, что оно придет, а не какой-то заранее установленный период без проверки чего-либо на странице.«Хорошие практические действия» - это многократные попытки?Как я могу заверить, что я избегаю спиннера, даже если линия раньше тоже это пробовала?И я не вижу каких-либо проблем с обертыванием клика по циклу, чтобы попытаться снова и снова с ограничением.Но, на самом деле, какое здесь самое лучшее решение?