Ошибка при клике на элемент в Chrome: Element is not clickable at point


(Руслан) #1

Всем привет,

столкнулся с такой проблемой, что на FF и ДАЖЕ IE выполняются действия, в отличие от хрома

public Expected Click_on_Sign_In (String searchText)
    {
        driver.findElement(By.linkText("Sign in")).click();
        driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        return new Expected(this.driver);
    }

Задача заключается в том, чтобы открыть всплывающую менюшку для авторизации...

на моё удивление, даже IE смог это сделать...хром не может frowning

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


Selenium обучение
(Антон) #2

Очень странный метод для клика, ну да ладно.
Вообще такая ошибка обычно означает что элемент перекрывается другим (обычно там дальше и пишут что-то типа Other element has received a click) - это может быть из-за того что в хроме верстка чуть отличается от верстки IE или FF.
При большом желании можно перехватить этот эксепшн и кликнуть с помощью JavascriptExecutor.

Ну и второй вариант - элемент невидим, для того чтобы проверить это хватит вызвать на элементе .isDisplayed().


(Руслан) #3

Привет,

да, есть всплывающая менюшка, я так понял и FF и IE её игнорируют

добавил smile

driver.findElement(By.xpath("//*[@id=\"cookie-label\"]/a/span")).click();
    driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

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


(Руслан) #4

нашёл кое-какое решение, но не уверен, что оно хорошее :))

driver.findElement(By.xpath("//*[@id=\"cookie-label\"]/a/span")).click();
Thread.sleep(1000);


(Антон) #5

Несколько непонятно зачем ты вообще каждый раз переназначаешь неявные ожидания

А Thread.sleep(1000); это просто секундная пауза в тесте.
Попробуй сделать метод для проверки видимости элемента через явные ожидания и запускать его перед кликом в таких случаях.


(Александр Таранков) #6

driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

Такое использование implicitlyWait неправильно и бесполезно. Это одноразовая настройка неявных ожиданий в WebDriver, и каждый раз переустанавливать это значение не даёт никакого эффекта.
Для явных ожиданий в WebDriver есть отдельный механизм Explicitly Wait-ов. Почитай про него.

Thread.sleep(1000);

Это как раз ближе к механизму явных ожиданий WebDriver-а, но использовать его - моветон. Бывают ситуации, когда использование sleep более эффективно, но это крайний случай. Обычно средств WebDriver достаточно и они лучше оптимизируют ожидание за счет того, что прекращают ожидать как только срабатывает заданное условие, в отличие от прямолинейного sleep.

По теме

Возможные проблемы уже упоминались:

  1. различие в верстке. Возможно в Chrome верстка другая (хотя, если поиск происходит не по xpath, то этот вариант маловероятен). Здесь помогает использование другого способа поиска элемента для клика
  2. различие в быстродействии. Chrome отрабатывает с другой скоростью, и поэтому элемент в момент клика ещё/уже невидим. Здесь помогут явные ожидания, либо sleep

(user) #7

Попробуйте:

WebElement element = driver.findElement(By.xpath("//*[@id=\"cookie-label\"]/a/span"));
		new WebDriverWait(driver, 15)).
                         until(ExpectedConditions.visibilityOf(element);
		element.click();

либо вынесите в отдельный метод ожидание видимости елемента.


(Антон) #8

А для особо тяжелых случаев (когда элемент появляется на странице не мгновенно) обычный findElement можно заменить на что-то в этом роде:

public WebElement findElement(By locator, int timeOut) {
	WebDriverWait wait = new WebDriverWait(driver, timeOut);
	WebElement webElement = null;

	try {
		webElement = wait.until(ExpectedConditions.presenceOfElementLocated(locator));
		LOG.debug("Find element: " + locator + " => true");
	} catch (Exception ex) {
		LOG.warn("Web element not found: " + locator);
	}
	return webElement;

}


(Руслан) #9

спасибо, попробую


(Jane Tymoschuk) #10

Не вижу конечно страктуры элементов, с которыми работаете, но попробуйте кликать на родительском/либо дочернем элементе, бывает, что для хрома вложенные элементы невидимы, и он как бы намекает, что клик будет отрабатывать не натом элементе, что вы просите.


(Руслан) #11

спасибо smile в общем дело обстояло так : появлялась всплывающее окно, предупреждающие об использовании кешов.. и только хром не видел элементы, которое оно накрывало smile решил просто закрывать, ожидать, пока не появится и кликать, всем спасибо