Ошибка 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();