Ожидание кликабельности элемента Selenide+Java

Здравствуйте, возникает проблема с ожиданием элемента. Есть кнопка “сохранить”, которая при активации вызывает всплывающее окно с подтверждением сохранения. Окно видно 10 секунд и ещё 2 тратит на появление/исчезновение, итого 12. У меня должно пройти 7 сохранений подряд, следовательно, надо ждать, пока станет активной кнопка “Сохранить”. Использовала три варианта ожидания, ориентируясь на подсказки из Сети:
1.

                $x("//span[contains(text(), 'Сохранить')]").waitUntil(enabled, 300000);
                $x("//span[contains(text(), 'Сохранить')]").shouldBe().isDisplayed();
                $x("//span[contains(text(), 'Сохранить')]").click();
                $x("//span[contains(text(), 'Сохранить')]").waitUntil(appear, 300000);
                $x("//span[contains(text(), 'Сохранить')]").shouldBe().isDisplayed();
                $x("//span[contains(text(), 'Сохранить')]").click();
                $x("//span[contains(text(), 'Сохранить')]").shouldBe(appear).click();

Но ни один из вариантов не ждёт больше 5 секунд, через 5 секунд в консоль падает ошибка:

Искомый элемент уникален. Запуск производился под Ubuntu и Windows 10 с браузером Firefox v68.0.2 / v72.0.3 соответственно. Среда разработки - IntelliJ IDEA.

Читала на этом же форуме похожие темы, но как-то не особо помогло. На аналогичные вопросы были ответы “используйте shoulBe вместо waitUntil” и наоблорот - “используйте waitUntil вместо shouldBe”.

Для второго варианта укажите какая именно ошибка получается, и на какой именно строчке. К цифрам надо еще добавит L - это же лонг.

$$("html span").findBy(text("Сохранить")).waitUntil(visible, 30000).click();

В shouldBe надо указывать параметры. Так как вы написали он не работает. isDisplayed() бесполезно использовать после shouldBe, если не найден элемент он кидает исключение.

Я использую всегда waitUntil, если нужно ждать больше 4 секунд.

2 лайка

300000L - так?

Ошибка на всех вариациях кода одна и та же, и в 1, и во 2 случае спотыкается на первой строке из указанных 3х

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

Значит, локатор неправильный.

Локатор точно правильный.
У меня этот код отрабатывает 7 раз, кнопка скрывается полностью после 2х повторений, то есть два всплывающих уведомления. Они идут со смещением вниз. Первые два повторения отрабатывают корректно, а потом кнопка скрывается за всплывающим окном и через 5 секунд код падает с ошибкой, что элемент скрыт за другим элементом и некликабелен.

Никаких букв указывать в количестве миллисекунд не нужно.
Вот вам ссылка на документацию от selenide как работать с should

А почему дольше? Покажите, как вы это делаете?

Просто у меня теперь в каждой итерации ожидание по 12 секунд, подозреваю, что можно сократить до 6, т.к. у меня место для 2х всплывающих окон есть, но это уже не важно, оно работает, хвала богам, лучше это не пытаться ковырять больше…

Тут есть опасность.

Если вы написали что-то вроде $("#saving").shouldNot(exist), и локатор всё-таки неправильный (или когда-нибудь поменяется), то эта строчка всегда будет зелёной. А вы даже не заметите.

Я указываю уникальные данные, локатор определённо точно верный. И в поиске в инструментах разработчиков только одну строку всегда находит :slight_smile:
Если очень грубо и условно, то структура такая:

input // рабочий, туда всё вставляется, он виден изначально
input // скрытый, при клике на него возникает ошибка, что элемент должен быть виден; таких элементов у меня 3 
span // скрытая искомая кнопка с уникальным текстом внутри себя, находится ниже всех остальных элементов 

Мне нужны все input, активация каждого из них. А само оно не скроллится вниз.

На всякий случай убедитесь, что такая строка одну не в devtools, а в тесте. Вот так:

$$x("//span[contains(text(), 'Сохранить')]").shouldHave(size(1));

1 лайк

x после $$ это опечатка или есть такая конструкция?

Ну так проверить же легче, чем здесь комментарий написать. :slight_smile:

Есть такая инструкция. $$x(...) - это то же самое, что $$(By.xpath(...)).

1 лайк

Согласен, не подумал

Спасибо. Не знал о такой фичи