Как решить ElementNotInteractableException: элемент не отображается в веб-драйвере Selenium?
7 ответов
Попробуйте использовать
Thread.sleep(10000);
При использовании этого веб-элементы на странице получают достаточно времени для загрузки
Что такое ElementNotInteractableException
?
Согласно документации, ElementNotInteractableException
это исключение W3C, которое выдается, чтобы указать, что хотя элемент присутствует на DOM TREE
он не находится в состоянии, с которым можно взаимодействовать.
Причины и решения:
Причина для ElementNotInteractableException
произойти может быть многочисленным.
Временное наложение другого
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();
Постоянное наложение другого
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));
Это исключение мы получаем, когда элемент не находится в состоянии взаимодействия. Таким образом, мы можем использовать ожидание, пока элемент не будет размещен или станет интерактивным.
Попробуйте использовать неявное ожидание:
driver.manage (). timeouts (). implicitlyWait (Время, TimeUnit.SECONDS);
Если это не работает, используйте явное ожидание:
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 });
Надеюсь, это кому-нибудь пригодится. см. документы для справки