Исключение NoSuchElement в методе isDisplayed

Всем привет. Использую цикл, в котором ввожу данные пользователя и сохраняю документ.
Если введённое значение почты уже имеется в системе, выскакивает модальное окно с предупреждением.
Отображение данного окна я вынес в блок while(…isDisplayed);
Но, в моменте , когда данное окно не возникает, данный блок while ловит исключение NoSuchElementException.
Почему так может происходить? Ведь, по идее, условие, при котором цикл работал, должно выполниться в блоке while (окно уже НЕ отображается) , и выйти из цикла… Как можно обойти данную ситуацию без обработки исключений?

Код

do {
                driver.findElement(By.xpath("/html/body/div[4]/div/div/div[3]/button")).click();
                i++;
                driver.findElement(By.name("email")).clear();
                driver.findElement(By.name("email")).sendKeys("ads" + i + "@ads.com");
                driver.findElement(By.name("name")).clear();
                driver.findElement(By.name("name")).sendKeys("ads" + i + "");
                driver.findElement(By.xpath("/html/body/div[3]/div[6]/div/div[2]/form/div[16]/button[1]")).click();
            } while (driver.findElement(By.xpath("/html/body/div[6]/div/div/div[3]/button")).isDisplayed());

ну так у вас в while найти элемент, тут вы и падаете, даже до isDisplayed не доходите

Используйте
try
catch

Но это опять же, костыль! Зачем такая сложная логика?

Смотрю на ваши локаторы и плачу горькими слезами! Вы бы сначала их научились нормально составлять

ну так у вас в while найти элемент, тут вы и падаете, даже до isDisplayed не доходите

то есть элемент должен быть уже найден, чтобы применять к нему isDisplayed ?
как правильно в данной ситуации выйти из цикла, когда окно не отображается?

Я уже отвечал на ваш вопрос! Вы упорно не хотите писать нормальные тесты? работа try catch при потоковом тестировании - #2 от пользователя pbezpal5

Зачем вам здесь вообще цикл и проверка isDisplayed? Проверяйте элемент на видимость через ожидания.

с чего вы взяли, что элемент найден?
у вас ошибка, что элемент не существует

вы пытаетесь получить свойство displayed у пустого места, это как пытаться понять, включен ли телевизор, которого нет в комнате

вы сначала должны понять, существует ли элемент, и если да, то displayed он или нет

хотя простой проверки существования уже достаточно будет

Во-первых, качество локаторов к вопросу не относится. Это тестовый пример. Я мог бы их и пустые оставить, не знал, что тут такие токсичные пользователи сидят.
Во-вторых, цикл нужен для автоматизации, при вызове тестового метода каждый раз будут создаваться уникальные пользователи. Так надо. Это не обсуждается. Все виды ожиданий используются в других кейсах. Поэтому вопрос про цикл.
Если не можете помочь с ответом или не желаете, лучше ничего не пишите в теме, пусть она будет пустой. Учитесь корректно взаимодействовать с пользователями, и люди к вам потянутся.

да, вопрос неправильно прочитал
у вас должен быть найден элемент, чтобы получать всего его свойства и атрибуты

по-хорошему, вам надо написать экстеншн метод типо Exist(), который будет возвращать булевое наличие элемента, и просто его пихать в while

1 лайк

Так и сделал, с методом Exist(), Вы верно направили меня) Теперь работает. Спасибо Вам большое!