Почему ElementsCollection .size() может возвращать element is not attached to the page document

Почему ElementsCollection ... .size() может возвращать

element is not attached to the page document

В какой то момент коллекция становится фиксированной? Как это отследить?
В коде везде передается как ElementsCollection с самого начала и до конца.

Selenide 6.3.3, используется уже давно, как и size() ошибка подобного рода только возникла.
В других местах не проявляется, и сильно редкая, может за день пару раз выпасть, на сервере чаще возможно из за скорости работы. Чаще всего выпадает размер 0 так и должно быть.

А читали javadoc к этому методу?
Там написано: “NOT RECOMMENDED” со ссылкой на пояснение: Do not use getters in tests · selenide/selenide Wiki · GitHub

Нет, коллекция не фиксированная, но проблема в том, что метод size() является по сути геттером. В отличие от методов типа $$.should*, он не знает, чего ждать - поэтому возвращает значение сразу, без всяких ожидалок.

Собственно, вопрос в том, а зачем вам вообще вызывать этот метод? Лучше его заменить на $$.shouldHave(что-нибудь).

1 лайк

Читал, всё прекрасно и проникся давно, ещё в других местах. Но тут не совсем то.

Изначально оно и было использовано, и будучи обёрнутым в try catch стало выдавать софт ассерт на xpath, а нужно оно было для ожидания элемента который не факт что появится, но подождать хочется так как если появился раньше то и дальше можно идти раньше.

Собственно сейчас .size() и использовался в if обёрнутым в цикл по времени, да ради бога пусть геттер мы всё равно заданное время дёргаем его как и в should но нам не нужна ошибка. И тем более не понятно откуда берётся not attached(Опять вернутся к try catch?).

Кажется если бы у коллекции был бы is было бы легче.

Может есть какой то другой вариант подождать но без ассерта?

Использовать один .shouldNot(a, b=многоВремени) невозможно так как что бы ждать исчезновения надо убедится что то-что должно исчезнуть появилось. Появится оно может допустим за 5 секунд(а может и не появится) а вот ждать исчезновения надо уже значительно дольше. А если не появилось за 5 то и ждать нечего.

Это тот самый случай, который был описан здесь: Как надругаться над Селенидом

Единственный надёжный костыль - это try/catch.

1 лайк

Он самый, читал, доклад смотрел и в принципе согласен, но возможности разделить тесты на с появляющимся прелоадером и не появляющимся нет. Данные о его появлении брать неоткуда.

element is not attached to the page document кидается в случае, если был создан объект IWebElement после чего произошло изменение DOM-а(например рефреш страницы). Обращение к элементу по ранее созданному обхекту IWebElement невозможно. как вариант - или переинициализировать объект заново ли бо делать обёртку над IWebElement где храните локатор, а не сам объект IWebElement, и каждый раз через проперти\геттер возвращаете новый объект по локатору. Возможно, Вы это всё и так знаете и дело не в этом, конечно) но это то, что я встречал на практике