如何解决 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 的临时覆盖

    在这种情况下,直接的解决方案是诱导 ExplicitWaitWebDriverWait 结合 ExpectedConditioninvisibilityOfElementLocated如下:

    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 声明的“多种可能性”的示例,在我的情况下,一个 链接位于
块中被“关闭”被点击; '点击'
块打开,然后'点击' 链接解决了问题!
有人知道如何在Javascript中实现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 中不可见?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决包冲突问题

如何解决包冲突问题

如何解决ajax跨域问题

MySQL 的 10048问题,如何解决?

如何解决smartgit的冲突问题

如何解决https传输图片的问题