Selenium WebDriver-элемент не является кликабельным в точке, почему?



Я знаю, что есть несколько тем, касающихся этой темы, но я не обязательно ищу решение, а скорее объяснение. Я работаю над очень большим пакетом автоматизации, который тестирует веб-приложение через мобильные телефоны с помощью browserstack. Моя стабильность очень низкая.. и именно из-за этой ошибки на меня накинулись! Иногда это будет работать, а иногда нет.. Я не могу использовать действия, потому что Browserstack не поддерживает это.. Почему эта ошибка существует и была ли у кого-нибудь такая успех это работа вокруг него. Я всегда жду объект, используя wait.пока (ожидаемые условия), но иногда это не работает достаточно хорошо. Я не могу полностью поймать его как исключение, так как это неизвестная ошибка. Кроме того, наши стандарты не позволяют использовать нить.сон(). Есть идеи? Большое вам спасибо



Введите описание изображения здесь



А вот экран какого-то кода..
Введите описание изображения здесь

737   4  

4 ответов:

Элемент обычно не может щелкнуть по следующим причинам .

  1. Html загружается, а клиент все еще получает обновления от сервера
  2. При Прокрутке
  3. это может быть связано с тем, что какой-то объект перекрывает цель

Проблема 3 не может быть решена вам нужно исправить ваш код в этом ждать Я жду HTML, чтобы готов, а затем проверить, это Нажмите кнопку может или нет это устранило такие исключения из моего кода

Как я вообще нашел решение для задачи 1 и 2 Вы можете просто использовать мое пользовательское ожидание перед щелчком . вызывать эту функцию public static void waitForElementPresent(final By by, int timeout,WebDriver driver) После этого, если вы используете браузер другой, то chrome затем вызовите прокрутку до этого объекта это исправит вашу проблему код

   public static void waitForElementPresent(final By by, int timeout,WebDriver driver) { 

        waitForPageLoad(driver);
        WebDriverWait wait = (WebDriverWait)new WebDriverWait(driver,40).ignoring(StaleElementReferenceException.class); 
        /*  wait.until(new ExpectedCondition<Boolean>(){ 
            @Override 
            public Boolean apply(WebDriver webDriver) { 
              WebElement element = webDriver.findElement(by); 
              return element != null && element.isDisplayed(); 
            } 
          }); */
          try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
           wait.until(ExpectedConditions.presenceOfElementLocated(by));
          wait.until(ExpectedConditions.elementToBeClickable(by));
          WebDriverWait wait2 = new WebDriverWait(driver, 40);
          wait2.until(ExpectedConditions.elementToBeClickable(by));

        }
    //wait for page to laod 
    public static void waitForPageLoad(WebDriver driver) {
        ExpectedCondition<Boolean> pageLoadCondition = new
            ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
                }
            };
        WebDriverWait wait = new WebDriverWait(driver, 30);
        wait.until(pageLoadCondition);
    }

Вы ожидаете, что веб-элемент будет доступен для клика, затем снова находите список веб-элементов и щелкаете первый элемент. Это не гарантирует, что вы щелкаете элемент, который вы ждали, чтобы он был кликабельным.

public void waitAndClickElement(WebElement element) {
    driverWait.until(ExpectedConditions.elementToBeClickable(element)).click();
}

В вашем случае,

public void clickImageView() {
    driverWait.until(ExpectedConditions.elementToBeClickable(listImageView)).click() ;
}

Это связано со скоростью, с которой работает селен. Он будет пытаться найти элементы до загрузки страницы, что приведет к этой ошибке.

Для предоставленного Вами примера кода .until() возвращает ожидаемое значение WebElement. Вы можете использовать приведенный ниже код, чтобы щелкнуть его, а не выскабливать страницу снова.

public void clickImageView()
{
    driverWait.until(ExpectedConditions.elementToBeClickable(listImageView)).click();
}

Comments

    Ничего не найдено.