32

在这里,我有我的代码的图像和我的错误的图像。谁能帮我解决这个问题?

在此处输入图像描述

在此处输入图像描述

4

6 回答 6

64

ElementNotInteractableException

ElementNotInteractableException 是 W3C 异常,它被抛出以指示虽然元素存在于HTML DOM上,但它不处于可以交互的状态。

原因及解决方案:

发生ElementNotInteractableException的原因可能很多。

  1. 其他我们感兴趣WebElement的临时覆盖WebElement

    在这种情况下,直接的解决方案是诱导ExplicitWaitieWebDriverWaitExpectedConditionas结合,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();
    

    更好的解决方案是获得更细粒度的,而不是ExpectedConditioninvisibilityOfElementLocated我们可以使用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);
    
于 2017-10-06T08:24:36.357 回答
3

我得到这个是因为我想与之交互的元素被另一个元素覆盖。在我的情况下,它是一个不透明的覆盖,使所有内容都成为 r/o。

当尝试单击另一个元素下的元素时,我们通常会得到“......其他元素会收到点击”但并非总是如此:.(

于 2019-06-11T20:31:45.797 回答
2

当元素不处于可交互状态时,我们会得到这个异常。所以我们可以使用等到元素被定位或变为可点击。

  1. 尝试使用隐式等待:

    driver.manage().timeouts().implicitlyWait(Time, TimeUnit.SECONDS);
    
  2. 如果这不起作用,请使用显式等待:

    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);
于 2020-07-15T05:23:02.633 回答
0

实际上例外是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));
于 2017-05-09T11:44:53.140 回答
0

Javascript 的解决方案如下所示。您将不得不修改时间以满足您的需要。

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

希望这对某人有帮助。请参阅文档以供参考

于 2019-06-05T18:23:56.703 回答
0

在我的情况下,问题是因为有一些动画,并且该元素在一段时间内不可见。因此发生了异常。

出于某种原因,我无法让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')  
于 2022-01-10T11:45:03.410 回答