Как решить ElementNotInteractableException: элемент не отображается в веб-драйвере Selenium?

Здесь у меня есть изображение моего кода и изображение моей ошибки. Может ли кто-нибудь помочь мне решить эту проблему?

7 ответов

Решение

Попробуйте использовать

Thread.sleep(10000);

При использовании этого веб-элементы на странице получают достаточно времени для загрузки

Что такое ElementNotInteractableException?

Согласно документации, ElementNotInteractableException это исключение W3C, которое выдается, чтобы указать, что хотя элемент присутствует на DOM TREE он не находится в состоянии, с которым можно взаимодействовать.

Причины и решения:

Причина для ElementNotInteractableException произойти может быть многочисленным.

  1. Временное наложение другого WebElement над WebElement нашего интереса:

    В этом случае прямым решением было бы побудить ExplicitWait т.е. WebDriverWait в комбинации с ExpectedCondition как invisibilityOfElementLocated как следует:

    WebDriverWait wait2 = new WebDriverWait(driver, 10);
    wait2.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("xpath_of_element_to_be_invisible")));
    driver.findElement(By.xpath("xpath_element_to_be_clicked")).click();
    

    Лучшим решением будет получить немного более детальный и вместо использования ExpectedCondition как invisibilityOfElementLocated мы можем использовать ExpectedCondition как elementToBeClickable следующее:

    WebDriverWait wait1 = new WebDriverWait(driver, 10);
    WebElement element1 = wait1.until(ExpectedConditions.elementToBeClickable(By.xpath("xpath_of_element_to_be_clicked")));
    element1.click();
    
  2. Постоянное наложение другого WebElement над WebElement нашего интереса:

    Если наложение является постоянным, в этом случае мы должны разыграть WebDriver пример как JavascriptExecutor и выполните операцию щелчка следующим образом:

    WebElement ele = driver.findElement(By.xpath("element_xpath"));
    JavascriptExecutor executor = (JavascriptExecutor)driver;
    executor.executeScript("arguments[0].click();", ele);
    

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

При попытке щелкнуть элемент ПОД другим элементом мы обычно получаем "... другой элемент получит щелчок", но не всегда:.(

На самом деле исключение Element Not Visible

Лучшая практика для пользователя Implicit wait ниже драйвера, таким образом, он получает достаточное время штрафного элемента, прежде чем через исключение

driver.get("http://www.testsite.com");
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); 

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

В вашем случае вы сталкиваетесь с элементом not visible exception затем используйте условие ожидания следующим образом

WebDriverWait wait = new WebDriverWait(driver, 120);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.your_Elemetnt));

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

  1. Попробуйте использовать неявное ожидание:

    driver.manage (). timeouts (). implicitlyWait (Время, TimeUnit.SECONDS);

  2. Если это не работает, используйте явное ожидание:

    WebDriverWait wait= новый WebDriverWait(драйвер, 20); WebElement input_userName; input_userName = wait.until(ExpectedConditions.elementToBeClickable(By.tagName("вход")));

    input_userName.sendkeys ("сурьяп");

Вы также можете использовать ExpectedCondition.visibilityOfElementLocated(). Вы можете увеличить время, например,

WebDriverWait wait=new WebDriverWait(driver, 90);

В моем случае проблема заключалась в том, что есть некоторая анимация, и этот элемент не виден в течение некоторого времени. И, следовательно, происходило исключение.

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

      from selenium.webdriver.support.ui import WebDriverWait


def explicit_wait_predicate(abc):
    return False


def explicit_wait(browser, timeout):
    try:
        Error = WebDriverWait(browser, timeout).until(explicit_wait_predicate)
    except Exception as e:
        None

И теперь я вызываю эту функцию manifest_wait везде, где хочу подождать, например

      from selenium import webdriver
from selenium.webdriver.common.by import By


browser = webdriver.Safari()
browser.get('http://localhost')

explicit_wait(browser,5)   # This will wait for 5 secs
elem_un = browser.find_element(By.ID, 'userName')  

Решение этой проблемы для Javascript выглядит следующим образом. Вам придется изменить время в соответствии с вашими потребностями.

driver.manage().setTimeouts({ implicit: 30000 });

Надеюсь, это кому-нибудь пригодится. см. документы для справки

Другие вопросы по тегам