Selenium Web Driver и Java. Элемент не кликается в точке (36, 72). Другой элемент получит клик:

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

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.

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


О вашей индивидуальной usecase, ошибка говорит все:

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) error 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. Элемент не получает щелчок, поскольку он отсутствует в Viewport

Попробуйте использовать JavascriptExecutor для добавления элемента в Viewport:

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

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

В этом случае вызывают ExplicitWait т.е. WebDriverWait как указано в пункте 4.

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

В этом случае вызывать ExplicitWait с ExpectedConditions установленным на elementToBeClickable для элемента, который можно щелкнуть:

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

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

В этом случае вызывать ExplicitWait с ExpectedConditions установленным для invisibilityOfElementLocated чтобы Overlay был невидимым.

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() для имитации операции щелчка.

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

Ответ 3

Можешь попробовать

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

Ответ 4

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

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

Надеюсь, это поможет кому-то!

Ответ 5

Прокрутка страницы до ближайшей точки, упомянутой в исключении, сделала трюк для меня. Ниже приведен фрагмент кода:

$wd_host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

ПРИМЕЧАНИЕ. Я использую PHP php webdriver