Элемент Не доступен для взаимодействия / Элемент не доступен для кликабельности

#java #selenium #selenium-webdriver #selenium-chromedriver #cucumber

Вопрос:

Я попытался использовать явное ожидание, ожидаемые условия.elementToBeClickable и waitForVisibleElement, но это заканчивается тайм-аутом и ожиданием, когда элемент станет доступным для кликабельности.

Я также попытался получить разные локаторы (разные div). Вот мой код (и те, которые я пробовал)

 public void setSystemInformationSection() throws Exception {

        scrollPageDownBy800();
        
        //wait.until(ExpectedConditions.elementToBeClickable(INVERTERMANUFACTURERDRPDWN));
        //click(INVERTERMANUFACTURERDRPDWN, "INVERTERMANUFACTURERDRPDWN;");
        
        
        //click(INVERTERMANUFACTURERDRPDWN, "INVERTERMANUFACTURERDRPDWN;");
        //waitForVisibleElement(driver, SMACORE1OPTION); click(SMACORE1OPTION,"SMACORE1OPTION");
                

        Boolean wait = new WebDriverWait(driver,20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id="SMA - Core1"]")));
        jse.executeScript("arguments[0].click()", INVERTERMANUFACTURERDRPDWN);
        //waitForVisibleElement(driver, SMACORE1OPTION);
        jse.executeScript("arguments[0].click()", SMACORE1OPTION);
}
        
 

Другие выпадающие списки, которые я пробовал, отлично работали с последним фрагментом кода (те, которые не были закомментированы).

Я попробовал это с другим раскрывающимся списком, и это сработало нормально

     public void setCommercialDealType() throws Exception {
        Boolean wait = new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("/html/body/app-root/ng-component/commercial-create-account/main/section[2]/opportunity-information/form/div[2]/div[1]/sp-dropdown/div/div/div[2]/ul/li[2]")));
        jse.executeScript("arguments[0].click()", COMMERCIALDEALTYPEDROPDOWN);
        waitForVisibleElement(driver, COMMERCIALHELIXPPA);
        jse.executeScript("arguments[0].click()", COMMERCIALHELIXPPA);
    }
 

Когда я пытаюсь проверить с помощью IsEnabled или isDisplayed, это выдает ошибку тайм-аута. Я застрял.

Комментарии:

1. Можете ли вы поделиться URL-адресом страницы, которую вы пытаетесь автоматизировать, или вы можете добавить HTML-код части страницы, которую вы пытаетесь автоматизировать, в вопросе выше.

Ответ №1:

Иногда элемент виден или доступен для вас, но разделители или промежутки (или другие элементы) скрывают его с точки зрения Селена. Чтобы преодолеть это:

  1. Сначала вы находите элемент по идентификатору, xpath или Css-выражению.
  2. Попробуйте перейти к элементу (сфокусируйтесь на нем) с помощью Selenium, а затем щелкните его.
  3. Если шаг 2 не удался — просто выполните элемент.нажмите
  4. если шаг 3 не удался — сделайте жесткий щелчок с помощью JavaScript:

Пример кода:

  public void clickLastFoundElement() {        
    try {
        Actions builder = new Actions(browser);
        builder.moveToElement(lastFoundElement).click().build().perform();
    } catch (ElementNotInteractableException x1) {
        try {
            lastFoundElement.click();
        }
        catch (Exception x2) {
            hardClickElement();
        }
    }
}

private void hardClickElement() {
    JavascriptExecutor executor = (JavascriptExecutor) browser;
    executor.executeScript("arguments[0].click();", lastFoundElement);      
}
 

Комментарии:

1. Я действительно все это сделал, число 4 проходит тест, но на самом деле оно ни на что не нажимает.

2. Таким образом, элемент на самом деле не доступен для клика, он отключен.

3. Он доступен для кликабельности. Я обнаружил кое-что при тестировании, когда я выбираю опцию на странице выше, выпадающий список становится недоступным. Но когда я оставляю его по умолчанию, он щелкает по элементу. Может быть, xpath движется? Я действительно заблудился.

4. Не ждите, пока элемент станет невидимым, ждите, пока он будет доступен или доступен для клика. Если что — то не получается- заверните это в блок try and catch. В блоке catch попробуйте снова найти элемент, возможно, страница сильно изменилась, а вместе с ней и DOM…

5. Я нашел проблему. 2 элемента имеют одинаковые пути xpath. Добавление «[2] » не работает, какие-нибудь советы?