Ошибка Selenium "Элемент не кликается в точке" в Firefox

Что касается ошибки Webdriver

Element is not clickable at point (X, Y). Another element would recieve the click instead.

Для ChromeDriver это адресовано в Отладка "Элемент не кликается в точке" ошибка, однако проблема может возникнуть и в Firefox.

Каковы наилучшие способы решения этой проблемы, когда это происходит в FirefoxDriver?

Ответ 1

Это происходит в следующих случаях:

  • Когда элемент загружается в DOM, но позиция не фиксированный в пользовательском интерфейсе. Могут быть некоторые другие div или изображения, которые не являются полностью загружен.

  • Страница обновляется до того, как щелкнет элемент.

Обход

  • Используйте Thread.sleep перед действиями для каждого веб-элемента в пользовательском интерфейсе, но это не очень хорошая идея.
  • Использовать WebDriverWait ExpectedConditions.

Я столкнулся с той же проблемой, время загрузки страницы было больше, и значок загрузки накладывался на всю веб-страницу.

Чтобы исправить это, я внедрил WebDriverWait ExpectedConditions, который ждет, когда значок загрузки исчезнет, ​​прежде чем выполнить действие click для элемента

Вызовите эту функцию перед выполнением действия (я использую структуру, управляемую данными)

public void waitForLoader () throws Exception  {
  try {
   String ObjectArray[]=ObjectReader.getObjectArray("LoadingIcon"); 
    if(checkElementDisplayed(ObjectArray[3],ObjectArray[2]))
    {
     WebDriverWait wait = new WebDriverWait(remotewebdriver,10); 
     wait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath(ObjectArray[3])));
    }
   } catch (NoSuchElementException e) {
   System.out.println("The page is loaded successfully");
   }
  }

Ответ 2

Моя же проблема решена с помощью Javascript, попробуйте использовать следующий код вместо щелчка селена

WebElement rateElement = driver.findElement(By.xpath(xpathContenRatingTab));
((JavascriptExecutor)driver).executeScript("arguments[0].click();", rateElement);

Ответ 3

Тщательное сопоставление версии Selenium jar с версией Firefox может решить проблему. Selenium должен автоматически прокручивать элемент в виде, если его нет на странице. Принуждение элемента к представлению с помощью JavaScript не требуется.

Мы никогда не увидим эту проблему в Firefox 31.5.0 с selenium-server-standalone-2.44.0.jar, однако при обновлении до Firefox 38.7.0 с помощью selenium-server-standalone-2.52. 0.jar, это стало проблемой.

См. https://github.com/seleniumhq/selenium/issues/1543

Ответ 4

Если ваша проблема в том, что элемент прокручивается с экрана (и, как результат, под чем-то вроде панели заголовка), вы можете попробовать прокрутить его обратно в виде следующим образом:

private void scrollToElementAndClick(WebElement element) { 
int yScrollPosition = element.getLocation().getY(); 
js.executeScript("window.scroll(0, " + yScrollPosition + ");"); 
element.click(); }

если вам нужно, вы также можете добавить статическое смещение (если, например, у вас заголовок страницы высотой 200px и всегда отображается):

public static final int HEADER_OFFSET = 200; 
private void scrollToElementAndClick(WebElement element) { 
int yScrollPosition = element.getLocation().getY() - HEADER-OFFSET; 
js.executeScript("window.scroll(0, " + yScrollPosition + ");"); 
element.click(); 
}

Вы можете направить щелчок, используя JavascriptExecutor (не рекомендуется)

WebElement element= driver.findElement(By."Your Locator"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

Надеюсь, это поможет вам:)

Ответ 5

У меня была та же проблема, и я решил ее с помощью определенных возможностей. Хотя вы используете FirefoxDriver, вы можете установить "overlappingCheckDisabled" на true, чтобы решить вашу проблему.

capabilities.setCapability("overlappingCheckDisabled", true);

Ответ 6

ActionBuilder может разрешить ошибку. Иногда перед объектом, который нужно щелкнуть, есть еще один элемент, поэтому щелчок ActionBuilder по местоположению элемента может работать в случаях, когда традиционный щелчок не работает

    Actions actions = new Actions(driver);
    actions.moveToElement(clickElement).click().perform();

или попробуйте посередине элемента

    Actions actions = new Actions(driver);
    Integer iBottom = clickElement.getSize().height;
    Integer iRight = clickElement.getSize().width;
    actions.moveToElement(clickElement, iRight/2, iBottom/2).click().perform();