Элемент не доступен для клика в точке, потому что другой элемент закрывает его

Я использую веб-драйвер Selenium, и у меня есть следующее исключение

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();

person Vinay P V    schedule 14.09.2020    source источник
comment
Поместите явное ожидание вместо неявного ожидания и проверьте, чтобы элемент был активен. если это все еще не работает, проверьте вручную, не перекрывается ли элемент <div class="loader-section section-left"> <div id="nav-icon3"> в пользовательском интерфейсе.   -  person Dilip Meghwal    schedule 14.09.2020
comment
поделитесь html-кодом элемента, в котором сгенерировано это исключение.   -  person Dev    schedule 14.09.2020


Ответы (3)


Я столкнулся с этой проблемой при работе с ботом adFly.

Использование ожиданий или подобных методов часто бесполезно, не полагайтесь также и на elementobeclickable().

Единственный способ обойти это — получить все элементы в этой позиции и удалить все из них со страницы, кроме интересующего вас.

Шаг 1:

Получите точки X и Y КАЖДОГО div, iframe, span на странице. Сначала попробуйте эти три WebElements (используя методы getX() и getY() класса Point (https://www.programcreek.com/java-api-examples/?class=org.openqa.selenium.Point&method=getX) через цикл.

поместите их все в список ArrayList с именем, скажем, overppingElements,

затем удалите из 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.

person Edoardo Rosso    schedule 14.09.2020

Если вы кодируете метод ожидания, вы можете использовать этот метод ожидания в своем проекте.

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

Приведенный выше код является методом ожидания

Если вы хотите использовать этот метод


waitForElement(By.xpath("//button[@type='submit']"),50); Например, вы можете использовать свой веб-элемент здесь

person Justin Lambert    schedule 14.09.2020
comment
Джастин Ламберт Большое спасибо за ответ. Когда я помещаю код, он говорит, что синтаксическая ошибка, вставьте Enumbody, чтобы завершить блок. частный статический WebElement (driver.findElement(By.id(nav-icon3),50)); { Элемент WebElement = новый WebDriverWait (драйвер, время ожидания).until (ExpectedConditions.presenceOfElementLocated (driver.findElement (By.id (nav-icon3))))); возвращаемый элемент; } - person Vinay P V; 14.09.2020
comment
URL и ваша кодировка - person Justin Lambert; 14.09.2020

Это сообщение об ошибке...

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() на элементе вам нужно вызвать i/48990165#48990165">WebDriverWait для elementToBeClickable(), и вы можете использовать любой из следующих Стратегии поиска:

  • 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() по-прежнему не работает, вам нужно вызвать i/48990165#48990165">WebDriverWait либо для invisibilityOf() следующим образом:

  • 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();
    

Ссылка

Вы можете найти пару соответствующих подробных обсуждений в:

person DebanjanB    schedule 14.09.2020