Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Selenium JS, "cant find element". Пути решения.

webdriver
selenium
javascript
Теги: #<Tag:0x00007fedb82c5710> #<Tag:0x00007fedb82c3f78> #<Tag:0x00007fedb82c3c80>

(Pc User) #1

Здравствуйте.

function getByClass(element){
driver.sleep(2000);
return driver.findElement(webdriver.By.className(element));
};

Селением переодически не находит элемент и крешится с ошибкой.
Пробовал перехватывать через webDriver.Wait, expected conditions и в try/catch цикле.
Ничего не помогает, все равно 1 из 20, выпадает ошибка.

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


(Lev Yarushin) #2

Элемент не находится из-за его отсутствия на странице, или из-за того что с этим классом есть несколько элементов?
Sleep для чего? Может быть разумнее будет подождать наличия чего-то на странице:

function getByClass(element, timeout){
return driver.wait(until.elementLocated(By.className(element)), timeout * 1000);
};

А если есть возможность - воспользуйтесь фреймворком (например CodeceptionJS - CodeceptJS - приемочное тестирование для NodeJS) , где такие вещи реализованы “изкаропки”.


(Pc User) #3

Элемент на странице один и он видим.
Просто Селениум его как будто не схватывает иногда.
У меня была такая проблема и на джаве, но там мы “тыкали” в каждый элемент по 10 раз, пока он не возьмется.
JS Selenium API такого не позволяет сделать.


(Дмитрий Мирошник) #4

Скорее всего, элемент не успевает подгрузиться. Используйте waits, будет намного более грамотно.
Как вариант, если элемент появляется после каких-нибудь действий пользователя, то не успевает отработать ajax, который отвечает за его появление. Тогда необходимо через селениум выполнить JS вставку, которая вернёт признак окончания работы ajax скриптов и уже после этого искать данный элемент.