2

我正在使用 Selenium webdriver,但出现以下异常

org.openqa.selenium.ElementClickInterceptedException: Element <div id="nav-icon3"> is not clickable at point (21,37) because another element <div class="loader-section section-left"> obscures it
Build info: version: '3.141.59', revision: 'e82be7d358', time: '
Driver info: org.openqa.selenium.firefox.FirefoxDriver

Session ID: 868f9daa-dd6c-4b53-846d-7323e7b0408e
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)

我的代码如下。

driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
      WebElement element = driver.findElement(By.id("nav-icon3"));
      JavascriptExecutor executor = (JavascriptExecutor)driver;
      executor.executeScript("arguments[0].click()", element);
    driver.findElement(By.id("nav-icon3")).click();
      driver.findElement(By.xpath("//ul[@id='slide-out']/li/ul/li[2]/a")).click();
      driver.findElement(By.xpath("//ul[@id='slide-out']/li/ul/li[2]/div/ul/li/a")).click();
      driver.findElement(By.id("newTravelerLink")).click();
4

3 回答 3

1

我在做 adFly 机器人时遇到了这个问题。

使用等待或类似的方法通常是没用的,也不要依赖使用 elementobeclickable()。

解决它的唯一方法是获取该位置的所有元素并从页面中删除所有元素,除了您感兴趣的元素。

步骤1:

获取页面中每个 div、iframe、span 的 X 和 Y 点。首先尝试这三个 WebElement(使用 Point 的 getX() 和 getY() 方法(https://www.programcreek.com/java-api-examples/?class=org.openqa.selenium.Point&method=getX)循环。

把它们都放在一个 ArrayList 中,比如说,overlapElements,

然后从 ArrayList 中删除 obscuredElement。

第2步:

在另一个循环中删除与您的 WebElement 重叠的每个 WebElement。

JavaScriptExecutor jsExecutor = (JavaScriptExecutor) driver;

for(int i = 0; i < overlappingElements.size(); i++) {

jsExecutor.executeScript(
    "arguments[0].parentNode.removeChild(arguments[0])", overlappingElements.get(i));

}

第 3 步:只需在 obscuredElement 上单击()。

于 2020-09-14T15:08:51.107 回答
0

此错误消息...

org.openqa.selenium.ElementClickInterceptedException: Element <div id="nav-icon3"> is not clickable at point (21,37) because another element <div class="loader-section section-left"> obscures it

...意味着该元素<div id="nav-icon3">不能被单击,因为该元素<div class="loader-section section-left">会保护它。


解决方案

click()在元素上引入WebDriverWaitelementToBeClickable()您可以使用以下任一Locator Strategies

  • cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#nav-icon3"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='nav-icon3']"))).click();
    

如果仍然失败,click()您需要诱导WebDriverWaitinvisibilityOf()如下:

  • cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(driver.findElement(By.cssSelector("div.loader-section.section-left"))));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#nav-icon3"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOf(driver.findElement(By.xpath("//div[@class='loader-section section-left']"))));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='nav-icon3']"))).click();
    

invisibilityOfElementLocated()如下:

  • cssSelector

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.cssSelector("div.loader-section.section-left")));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div#nav-icon3"))).click();
    
  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//div[@class='loader-section section-left']")));
    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@id='nav-icon3']"))).click();
    

参考

您可以在以下位置找到一些相关的详细讨论:

于 2020-09-14T19:46:32.493 回答
0

如果您编写一个等待方法,您可以在项目中使用该等待方法

private static WebElement waitForElement(By locator, int timeout)
{
    WebElement element=new WebDriverWait(driver,timeout).until(ExpectedConditions.presenceOfElementLocated(locator));
    return element;
}

上面的代码是wait方法

如果你想使用这个方法


waitForElement(By.xpath("//button[@type='submit']"),50); 例如,您可以在此处使用您的网络元素

于 2020-09-14T10:29:23.143 回答