在这里,我有我的代码的图像和我的错误的图像。谁能帮我解决这个问题?
6 回答
ElementNotInteractableException
ElementNotInteractableException 是 W3C 异常,它被抛出以指示虽然元素存在于HTML DOM上,但它不处于可以交互的状态。
原因及解决方案:
发生ElementNotInteractableException的原因可能很多。
其他我们感兴趣
WebElement
的临时覆盖WebElement
:在这种情况下,直接的解决方案是诱导
ExplicitWait
ieWebDriverWait
与ExpectedCondition
as结合,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);
我得到这个是因为我想与之交互的元素被另一个元素覆盖。在我的情况下,它是一个不透明的覆盖,使所有内容都成为 r/o。
当尝试单击另一个元素下的元素时,我们通常会得到“......其他元素会收到点击”但并非总是如此:.(
当元素不处于可交互状态时,我们会得到这个异常。所以我们可以使用等到元素被定位或变为可点击。
尝试使用隐式等待:
driver.manage().timeouts().implicitlyWait(Time, TimeUnit.SECONDS);
如果这不起作用,请使用显式等待:
WebDriverWait wait=new WebDriverWait(driver, 20); WebElement input_userName; input_userName = wait.until(ExpectedConditions.elementToBeClickable(By.tagName("input"))); input_userName.sendkeys("suryap");
你也可以使用ExpectedCondition.visibilityOfElementLocated()
。您可以增加时间,例如,
WebDriverWait wait=new WebDriverWait(driver, 90);
实际上例外是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));
Javascript 的解决方案如下所示。您将不得不修改时间以满足您的需要。
driver.manage().setTimeouts({ implicit: 30000 });
希望这对某人有帮助。请参阅文档以供参考
在我的情况下,问题是因为有一些动画,并且该元素在一段时间内不可见。因此发生了异常。
出于某种原因,我无法让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
现在我在任何我想等待的地方调用这个explicit_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')