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

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

Теги: #<Tag:0x00007f7489ec38d0> #<Tag:0x00007f7489ec3790> #<Tag:0x00007f7489ec3600>

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

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

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

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

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

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

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

1 Симпатия

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

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