Предотвращение «Другой элемент получил бы щелчок» с elementToBeClickable - PullRequest
0 голосов
/ 24 августа 2018

У меня есть этот метод, использующий неявное ожидание, предварительно настроенный для возврата мне 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, например:

  1. Пытается щелкнуть, если выбрасывается WebDriverExceptionс spinnerClass, переходит к waitsElementToVanish и затем пытается снова
  2. Если количество попыток выходит за пределы, то возникает исключение ReallyMessedUpExceptionDoSomething!.

Мой вопросявляется: Я хочу избежать Thread.sleep() любой ценой.Я хочу оптимизировать время тестирования, ожидая только того, что оно придет, а не какой-то заранее установленный период без проверки чего-либо на странице.«Хорошие практические действия» - это многократные попытки?Как я могу заверить, что я избегаю спиннера, даже если линия раньше тоже это пробовала?И я не вижу каких-либо проблем с обертыванием клика по циклу, чтобы попытаться снова и снова с ограничением.Но, на самом деле, какое здесь самое лучшее решение?

...