如何解决 ElementNotInteractableException:元素在 Selenium webdriver 中不可见?
Posted
技术标签:
【中文标题】如何解决 ElementNotInteractableException:元素在 Selenium webdriver 中不可见?【英文标题】:How to resolve ElementNotInteractableException: Element is not visible in Selenium webdriver? 【发布时间】:2022-01-23 19:49:34 【问题描述】:这里有我的代码图像和错误图像。谁能帮我解决这个问题?
【问题讨论】:
您应该尝试隔离要与之交互的元素。在您的代码中有多个元素具有 标签;因此,如果您使用该元素的特定路径会更好 请不要张贴文字图片,而是保留为文字。 【参考方案1】:ElementNotInteractableException
ElementNotInteractableException 是 W3C 异常,抛出该异常表示虽然 html DOM 上存在元素,但它不处于可以交互的状态。
原因及解决方案:
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
strong> 为 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
并执行如下点击操作: p>
WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
【讨论】:
这应该被标记为正确答案,但对于#2,需要说明的是,覆盖层的存在可能是有原因的。在这种情况下,需要考虑使用 javascript 执行器绕过它是否实际上并没有绕过应用程序的意外行为。 对于该线程的未来读者:@DebanjanB 声明的“多种可能性”的示例,在我的情况下,一个 链接位于ExpectedConditions
吗?【参考方案2】:
我得到这个是因为我想与之交互的元素被另一个元素覆盖。在我的情况下,它是一个不透明的覆盖层,使所有内容都成为 r/o。
当试图点击另一个元素下的一个元素时,我们通常会得到“......其他元素会收到点击”,但并非总是如此:.(
【讨论】:
【参考方案3】:当元素不处于可交互状态时,我们会得到这个异常。所以我们可以使用等到元素被定位或变为可点击。
尝试使用隐式等待:
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);
【讨论】:
【参考方案4】:Javascript 的解决方案如下所示。您必须根据需要修改时间。
driver.manage().setTimeouts( implicit: 30000 );
希望这对某人有所帮助。 参考docs
【讨论】:
永远不要使用 sleep() 或 setTimeout() 来等待事件。这是一种不好的做法,您最终会遇到这样的情况:当您将代码部署到新机器上时,它会随机停止工作,但在此之前它一直运行良好。事件应由等待操作处理,旨在在满足条件或发生超时时立即唤醒您的代码。【参考方案5】:其实例外是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));
【讨论】:
我也那个也。但它不起作用。你能告诉我其他解决这个问题的方法吗? 隐式等待不是最佳实践。事实上,Selenium 贡献者不推荐使用它。官方文档中也警告不要混合隐式和显式等待。 等待不是解决方案...在我的情况下,我需要单击 ant UI 时间选择器组件。等待不是解决方案,我仍在寻找解决方法 @user1767083 显然等待并不是每个问题的解决方案。发布一个单独的问题,其中包含有关 SO 的适当详细信息。你肯定会得到解决方案。谢谢 @NarendraR 这是我面临的问题,***.com/questions/62907372/…【参考方案6】:在我的情况下,问题是因为有一些动画,并且该元素在一段时间内不可见。因此发生了异常。
由于某种原因,我无法使 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')
【讨论】:
以上是关于如何解决 ElementNotInteractableException:元素在 Selenium webdriver 中不可见?的主要内容,如果未能解决你的问题,请参考以下文章