Вопрос-ответ

Selenium Web Driver & Java. Element is not clickable at point (x, y). Other element would receive the click

Веб-драйвер Selenium и Java. Элемент недоступен для клика в точке (x, y). Другой элемент получит щелчок

Я использовал явное ожидание, и у меня появилось предупреждение:


org.openqa.selenium.Исключение WebDriverException: элемент недоступен для клика в точке (36, 72). Другой элемент получит щелчок: ... Длительность команды или тайм-аут: 393 миллисекунды


Если я использую Thread.sleep(2000), я не получаю никаких предупреждений.

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
WebDriverWait wait = new WebDriverWait(driver, 10);
driver.findElement(By.id("navigationPageButton")).click();

try {
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
} catch (Exception e) {
System.out.println("Oh");
}
driver.findElement(By.cssSelector(btnMenu)).click();
Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}
Переведено автоматически
Ответ 1

WebDriverException: Элемент недоступен для клика в точке (x, y)

Это типичное org.openqa.selenium.Исключение WebDriverException, которое расширяет исключение java.lang.RuntimeException.

Поля этого исключения следующие :


  • BASE_SUPPORT_URL : protected static final java.lang.String BASE_SUPPORT_URL

  • DRIVER_INFO : public static final java.lang.String DRIVER_INFO

  • SESSION_ID : public static final java.lang.String SESSION_ID


Что касается вашего индивидуального варианта использования, ошибка говорит сама за себя :

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

Из вашего блока кода ясно, что вы определили wait как WebDriverWait wait = new WebDriverWait(driver, 10);, но вы вызываете click() метод для элемента до того, как ExplicitWait вступит в действие , как в until(ExpectedConditions.elementToBeClickable).

Решение

Ошибка Element is not clickable at point (x, y) может быть вызвана различными факторами. Вы можете устранить их с помощью любой из следующих процедур:

1. Элемент не кликается из-за присутствия вызовов JavaScript или AJAX

Попробуйте использовать Actions класс:

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2. Элемент не щелкается, поскольку его нет в области просмотра

Попробуйте использовать JavascriptExecutor, чтобы переместить элемент в область просмотра:

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement);

3. Страница обновляется до того, как элемент станет доступным для клика.

В этом случае индуцируется явное ожидание, т.е. WebDriverWait, как упомянуто в пункте 4.

4. Элемент присутствует в DOM, но не доступен для клика.

В этом случае вызовите ExplicitWait с ExpectedConditions значением elementToBeClickable , чтобы элемент был доступен для клика:

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5. Элемент присутствует, но имеет временное наложение.

В этом случае индуцируйте ExplicitWait с ExpectedConditions значением invisibilityOfElementLocated, чтобы наложение было невидимым.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6. Элемент присутствует, но имеет постоянное наложение.

Используйте JavascriptExecutor для отправки щелчка непосредственно по элементу.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
Ответ 2

На случай, если вам нужно использовать его с Javascript

Мы можем использовать аргументы[0].click() для имитации операции click .

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);
Ответ 3

Я столкнулся с этой ошибкой при попытке щелкнуть какой-либо элемент (или его наложение, мне было все равно), и другие ответы у меня не сработали. Я исправил это, используя elementFromPoint DOM API, чтобы найти элемент, на который Selenium хотел, чтобы я щелкнул вместо этого:

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
"return document.elementFromPoint(arguments[0], arguments[1]);",
loc['x'],
loc['y'])
element_to_click.click()

У меня также были ситуации, когда элемент перемещался, например, потому, что элемент над ним на странице выполнял анимированное развертывание или сворачивание. В этом случае помог этот класс ожидаемых условий. Вы указываете ему элементы, которые анимированы, а не те, на которые вы хотите щелкнуть. Эта версия работает только для анимации jQuery.

class elements_not_to_be_animated(object):
def __init__(self, locator):
self.locator = locator

def __call__(self, driver):
try:
elements = EC._find_elements(driver, self.locator)
# :animated is an artificial jQuery selector for things that are
# currently animated by jQuery.
return driver.execute_script(
'return !jQuery(arguments[0]).filter(":animated").length;',
elements)
except StaleElementReferenceException:
return False
Ответ 4

Вы можете попробовать

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
java selenium selenium-webdriver