t.me/atinfo_chat Telegram группа по автоматизации тестирования

Как побороть element click intercepted: Element is not clickable at point (590, 68) ?

Теги: #<Tag:0x00007f748892fe88> #<Tag:0x00007f748892fdc0> #<Tag:0x00007f748892fcf8> #<Tag:0x00007f748892fbe0>

Всем привет. Столкнулся с проблемой, парочка тестов всегда красные из-за ошибки element click intercepted: Element is not clickable at point . Вся проблема в скролле.
Сначала решил использовать селенидовский метод :
$("").scrollIntoView(false).click(); , но почему то не всегда помагает.Возможно иногда нужна ему задержка.
Далле решил через js написать скролл :

.executeScript(
            "arguments[0].scrollIntoView(true); window.scrollBy(0, -window.innerHeight / 4);",
            element);

Но через js, иногда тоже не срабатывает. Все из-за очень быстрых тестов. Если поставить sleep (1000), проходит. Но ждать в каждом тесте 1сек, думаю плохая идея.

Как вы решаете проблему скролла?

Скорее всего прелоадер перекрывает, нужно ждать пока не исчезнет или попап. Сделайте скриншот в момент ошибки

Нет, прелодера нету.Скриншоты есть. Просто скролл не успел исполниться, а клик уже отработал

вы эту ошибку добавьте в список игнорируемых в wait.Until и будет все ок

Не могу понять, что вы имеете в виду?

Я Selenide не использую, потому что пишу на C#, но у селениума есть явные ожидания (Explisit wait), почитайте про них, эти же ожидания под капотом у Selenide. Вы должны добавить эту ошибку в игнорируемые, я не знаю как это сделать, но скорее всего такая возможность есть. Думаю @asolntsev знает
Попробуйте использовать Condidtions https://selenide.gitbooks.io/user-guide/content/ru/selenide-api/condition.html
Вот тут описано про ожидания
https://www.guru99.com/implicit-explicit-waits-selenium.html

Пример игнорирования Exception

Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);
1 Симпатия

Так это же не решение.
Это поможет проигнорировать исключение, но ведь клик-то не сработает. Т.е. тест дальше будет работать некорректно.

Это позволит ждать до тех пор пока исключение не перестанет появляться при wait until clickable, а потом произойдет клик, просто я не знаю как это сделать в Selenide

 wait.until(ExpectedConditions.elementToBeClickable(By.xpath(""))).Click();

@asolntsev а в селениде, есть что-то похожее elementToBeClickable ?

Конечно.
В селениде есть всё, что есть в селениуме. :slight_smile:

Можно прямо так и написать:
Selenide.Wait().until(ExpectedConditions.elementToBeClickable(By.xpath(""))).Click();

Но обычно это не нужно, т.к. elementToBeClickable на самом деле проверяет только то, что элемент видимые и enabled. А селенидовский метод click() и так это проверяет.

а как туда прокинуть список исключений? По дефолту там NotFoundException

Я же говорю, не нужно это.
Селенид сам пытается кликнуть в течение 4 секунд, игнорируя любые исключения. А вот если после 4 секунд не получилось - тогда уже кидает ошибку.

Может, вам надо просто таймаут увеличить?

ок, поставлю Configuration.timeout = 10000;
И сколлить через scrollIntoView(false) ?

Ну да, наверное.
Откуда ж я знаю, как вам лучше скроллить. Попробуйте.

Если там прелоадер - то можно сделать нормально, вместо раздувания таймаута:

  1. Ждём появления лоадера (необходимо для того, чтобы тест не падал, если лоалер появляется не сразу).
  2. Ждём исчезновения лоадера.
  3. Продолжаем тест.
1 Симпатия