Перейти к содержимому

Фотография

Element not clickable


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 34

#1 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 20 августа 2013 - 12:57

Добрый день! Очень часто натыкаюсь на ситуации, когда элемент проходит проверку isDisplayed, но при клике вылетает эта ошибка. Как можно обойти это?

Допустим есть метод
public void ElementPolling(String elementPath, int timeout) throws MyBugException, InterruptedException { 
    	 
    	 
	       (new WebDriverWait(driver, timeout))
	       .until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(elementPath)));
	       
	       List<WebElement> tasksList = driver.findElements(By.xpath(elementPath));
	       
	       long start = System.currentTimeMillis();    	 
	       int size=tasksList.size();
	       System.out.println(size);
    	 
    	 while (System.currentTimeMillis()<start+timeout){
    		 
	  	     (new WebDriverWait(driver, timeout))
	  	     .until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath(elementPath)));//Проверяет на наличие хотябы 1 элемента, работает криво приходится использовать свою проверку
	  	     tasksList = driver.findElements(By.xpath(elementPath));
	  	     size=tasksList.size();
	  	     if (size>0) {Thread.sleep(3000); break;}	  	    
    		 
    	 } if (size==0) throw new MyBugException("Timeout");
    	 
     }

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

Никакие стандартные решения не помогают.
  • 0

#2 Petrov.Sergey

Petrov.Sergey

    Опытный участник

  • Members
  • PipPipPipPip
  • 446 сообщений
  • ФИО:Petrov Sergey
  • Город:МО, Лобня


Отправлено 20 августа 2013 - 13:10

Добрый день! Очень часто натыкаюсь на ситуации, когда элемент проходит проверку isDisplayed, но при клике вылетает эта ошибка. Как можно обойти это?

Допустим есть метод

Скрытый текст


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

Никакие стандартные решения не помогают.

Трассировку дайте.
Я сталкивался с подобной проблемой, когда элемент находится, но при клике говорит, что не может найти.
Моё решение проблемы:
WebElement fancyboxClose = fancybox.findElement(By.id("fancybox-close"));
((JavascriptExecutor) driver).executeScript("window.scrollTo(0," + fancyboxClose.getLocation().y + ")");
try {
	fancyboxClose.click();
} catch (WebDriverException e) { }

  • 0
Форум читаю набегами. По возникшим вопросам можно в скайп (в профиле).

#3 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 20 августа 2013 - 13:26

Не помогает, та же ошибка,
org.openqa.selenium.WebDriverException: unknown error: Element is not clickable at point (1105, 260). Other element would receive the click: <div class="k-loading-image"></div>

Так же не поможет условие на пропадание этого элемента, он в дом буквально секунду, условие отрабатывает но клика не происходит.

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

try { 
        	  
        	   driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
	           WebElement kload=driver.findElement(By.xpath("//div[@class='k-loading-image']"));
	           System.out.println(kload.isDisplayed());
	          if (kload.isDisplayed()){ 		
	          (new WebDriverWait(driver, Pause))
	          .until(ExpectedConditions.stalenessOf(kload));
	          } 
          }
          catch (NoSuchElementException e) {}        
          driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

  • 0

#4 Snap

Snap

    Специалист

  • Members
  • PipPipPipPipPip
  • 980 сообщений
  • ФИО:Роман
  • Город:Москва


Отправлено 20 августа 2013 - 13:56

У меня такая ошибка, даже когда все элементы подгрузились. Причем только в браузере Chrome. Может проблемы в верстке, может в браузере...
  • 0

#5 PavelLobashov

PavelLobashov

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 20 августа 2013 - 14:04

У меня такая ошибка, даже когда все элементы подгрузились. Причем только в браузере Chrome. Может проблемы в верстке, может в браузере...

isDisplay как я понимаю - показывает только то, что в собранном css стили элемента все параметры указывают на то, что элемент видим, но не обозначает что элемент перекрыт другим элементов
Есть такое дело, что chromedriver не позволяет кликать на элементы, если поверх него отображаются другие элементы.

В качестве примера могу привести такую ситуацию
У вас есть кнопка на странице, а чуть выше расположено длинное раскрывающееся меню.
Так в Firefox клик на кнопку корректно отработается, если даже меню раскрыто и список перекрывается кнопку.
А хром выдаст как раз ошибку
Element is not clickable at point (1105, 260). Other element would receive the click: <div class="k-loading-image"></div>
И <div class="k-loading-image"> - это и есть элемент, который перекрывает кнопку (в моем примере - список в меню).

Особенно этим любят грешить всякие тултипы и подсказки, отключаю их сразу удаляя элемент через JS

В свое время неслабо перерабатывали фреймфорк тестов, когда интегрировали поддержку хрома изза такой особенности, которая впрочем, как я считаю - очень логична
  • 1

#6 appmen

appmen

    Опытный участник

  • Members
  • PipPipPipPip
  • 408 сообщений
  • ФИО:Victor

Отправлено 21 августа 2013 - 08:27

была та же проблема в Хроме, решил таким способом "//span[@id='ta-da']/ul/li" заменил на "//*[@id='ta-da']/ul/li" (поставил звёздочку). Но, в вашем слечае, это может не сработать
  • 0

#7 BabyRoot

BabyRoot

    Специалист

  • Members
  • PipPipPipPipPip
  • 833 сообщений


Отправлено 21 августа 2013 - 08:57

В фаерфаиндере или фаерпасе сколько элементов находится по вашему elementPath на полностью загрузившейся странице?
Если больше 1, то надо уточнять elementPath.
  • 0

#8 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 21 августа 2013 - 15:23

По этому пути располагается 1 элемент. Вся проблема в другом элементе, который его перекрывает буквально 1-2 секунды. Нужно какое-то работающее ожидание на пропадание его, но вот какое - хрен знает, мое не работает
  • 0

#9 PavelLobashov

PavelLobashov

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 21 августа 2013 - 18:50

По этому пути располагается 1 элемент. Вся проблема в другом элементе, который его перекрывает буквально 1-2 секунды. Нужно какое-то работающее ожидание на пропадание его, но вот какое - хрен знает, мое не работает

Так просто удалить через JavaScript перекрывающий элемент нельзя? Он критичен для кейса?
  • 0

#10 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 26 августа 2013 - 09:12


По этому пути располагается 1 элемент. Вся проблема в другом элементе, который его перекрывает буквально 1-2 секунды. Нужно какое-то работающее ожидание на пропадание его, но вот какое - хрен знает, мое не работает

Так просто удалить через JavaScript перекрывающий элемент нельзя? Он критичен для кейса?


Не критичен. Где можно почитать про удаление элеементов?
  • 0

#11 PavelLobashov

PavelLobashov

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 26 августа 2013 - 10:31



По этому пути располагается 1 элемент. Вся проблема в другом элементе, который его перекрывает буквально 1-2 секунды. Нужно какое-то работающее ожидание на пропадание его, но вот какое - хрен знает, мое не работает

Так просто удалить через JavaScript перекрывающий элемент нельзя? Он критичен для кейса?


Не критичен. Где можно почитать про удаление элеементов?

Где почитать не подскажу, я использую такую конструкцию (Ruby)
xpath_value - xpath элмента, что нужно удалить
@driver.execute_javascript("element = document.evaluate(\"" + xpath_value + "\", document, null, XPathResult.ANY_TYPE, null).iterateNext();if (element !== null) {element.parentNode.removeChild(element);};")

  • 1

#12 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 26 августа 2013 - 11:04

Осталось понять как это сделать на java
  • 0

#13 PavelLobashov

PavelLobashov

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 26 августа 2013 - 11:15

Осталось понять как это сделать на java

Ну такие вопросы гуглятся в два счета.

JavascriptExecutor js;
if (driver instanceof JavascriptExecutor) {
    js = (JavascriptExecutor)driver;
}
js.executeScript("element = document.evaluate(\"" + xpath_value + "\", document, null, XPathResult.ANY_TYPE, null).iterateNext();if (element !== null) {element.parentNode.removeChild(element);};");

  • 0

#14 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 26 августа 2013 - 12:13

У человека проблема с элементарными вещами -

Нужно какое-то работающее ожидание на пропадание его, но вот какое - хрен знает, мое не работает

.
А вы, как в том анекдоте -

- Доктор, у меня лицо синее! - Ампутировать! Следующий!

.
Вот так и зарождаются тесты/фреймворки, в которых js на js'е и js'ом погоняет. Сложности надо решать, а не обходить.
  • 0

#15 PavelLobashov

PavelLobashov

    Новый участник

  • Members
  • Pip
  • 23 сообщений

Отправлено 26 августа 2013 - 13:00

У человека проблема с элементарными вещами -

Нужно какое-то работающее ожидание на пропадание его, но вот какое - хрен знает, мое не работает

.
А вы, как в том анекдоте -

- Доктор, у меня лицо синее! - Ампутировать! Следующий!

.
Вот так и зарождаются тесты/фреймворки, в которых js на js'е и js'ом погоняет. Сложности надо решать, а не обходить.

Я не претендую, что мое решение самое правильное и элегантное. Но если оно решает проблему, то почему бы и нет
  • 0

#16 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 26 августа 2013 - 13:38

А удаление не помогло, или я опять что-то не понял. Этот элемент присутствует в дом только короткий промежуток времени, пока грузится список. Получается, что вызывать JS и удалять этот элемент нужно имеено в этот момент? Иначе элемента нет в дом и непонятно что удаляется
  • 0

#17 Keiga

Keiga

    Постоянный участник

  • Members
  • PipPipPip
  • 174 сообщений
  • ФИО:Евгений
  • Город:Москва


Отправлено 26 августа 2013 - 13:49

А удаление не помогло, или я опять что-то не понял. Этот элемент присутствует в дом только короткий промежуток времени, пока грузится список. Получается, что вызывать JS и удалять этот элемент нужно имеено в этот момент? Иначе элемента нет в дом и непонятно что удаляется

Может стоит решить задачу по другому? Неужели стандартных функций WebDriver'a недостаточно чтобы дождаться появления\пропадания нужного элемента и кликнуть по нему? Обязательно городить через циклы и thread.sleep? Помимо isDisplayed, есть же еще такой ExpectedConditions как elementToBeClickable.
  • 0

#18 vmaximv

vmaximv

    Опытный участник

  • Members
  • PipPipPipPip
  • 350 сообщений

Отправлено 26 августа 2013 - 14:00

1. Ждем и находим элемент <div class="k-loading-image">
2. Ждем пока он застейлится
3. ???
4. Profit

В предыдущем посте уже все сказали.

Сообщение отредактировал vmaximv: 26 августа 2013 - 14:05

  • 0

#19 lokofc

lokofc

    Активный участник

  • Members
  • PipPip
  • 78 сообщений
  • ФИО:Pavel

Отправлено 26 августа 2013 - 14:10


А удаление не помогло, или я опять что-то не понял. Этот элемент присутствует в дом только короткий промежуток времени, пока грузится список. Получается, что вызывать JS и удалять этот элемент нужно имеено в этот момент? Иначе элемента нет в дом и непонятно что удаляется

Может стоит решить задачу по другому? Неужели стандартных функций WebDriver'a недостаточно чтобы дождаться появления\пропадания нужного элемента и кликнуть по нему? Обязательно городить через циклы и thread.sleep? Помимо isDisplayed, есть же еще такой ExpectedConditions как elementToBeClickable.


Ни один из стандартных методов мне не помогает. Написанное мною ожидание:
    try { 
        	  
        	   driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);//Делаю чтобы метод find не так долго искал элемент
	           WebElement kload=driver.findElement(By.xpath("//div[@class='k-loading-image']"));
	           System.out.println(kload.isDisplayed());//Проверяем видимость
	          if (kload.isDisplayed()){ 		//если элемент виден - ждем до пропадания из дом
	          (new WebDriverWait(driver, Pause))
	          .until(ExpectedConditions.stalenessOf(kload));
	          } 
          }
          catch (NoSuchElementException e) {}        
          driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
//возвращаем стандартный тайм аут

Работает это хреново
  • 0

#20 Keiga

Keiga

    Постоянный участник

  • Members
  • PipPipPip
  • 174 сообщений
  • ФИО:Евгений
  • Город:Москва


Отправлено 26 августа 2013 - 14:31

Работает это хреново

У меня работает так:
protected WebDriverWait wait;
wait = new WebDriverWait(driver, 30);

WebElement load = driver.findElement(By.cssSelector(""));
wait.until(stalenessOf(load));
А в некоторых местах даже просто так:
protected WebDriverWait wait;
wait = new WebDriverWait(driver, 30);

wait.until(invisibilityOfElementLocated(By.cssSelector("")));

  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных