Почему ElementsCollection ... .size() может возвращать
element is not attached to the page document
В какой то момент коллекция становится фиксированной? Как это отследить?
В коде везде передается как ElementsCollection с самого начала и до конца.
Selenide 6.3.3, используется уже давно, как и size() ошибка подобного рода только возникла.
В других местах не проявляется, и сильно редкая, может за день пару раз выпасть, на сервере чаще возможно из за скорости работы. Чаще всего выпадает размер 0 так и должно быть.
Нет, коллекция не фиксированная, но проблема в том, что метод size() является по сути геттером. В отличие от методов типа $$.should*, он не знает, чего ждать - поэтому возвращает значение сразу, без всяких ожидалок.
Собственно, вопрос в том, а зачем вам вообще вызывать этот метод? Лучше его заменить на $$.shouldHave(что-нибудь).
Читал, всё прекрасно и проникся давно, ещё в других местах. Но тут не совсем то.
Изначально оно и было использовано, и будучи обёрнутым в try catch стало выдавать софт ассерт на xpath, а нужно оно было для ожидания элемента который не факт что появится, но подождать хочется так как если появился раньше то и дальше можно идти раньше.
Собственно сейчас .size() и использовался в if обёрнутым в цикл по времени, да ради бога пусть геттер мы всё равно заданное время дёргаем его как и в should но нам не нужна ошибка. И тем более не понятно откуда берётся not attached(Опять вернутся к try catch?).
Кажется если бы у коллекции был бы is было бы легче.
Может есть какой то другой вариант подождать но без ассерта?
Использовать один .shouldNot(a, b=многоВремени) невозможно так как что бы ждать исчезновения надо убедится что то-что должно исчезнуть появилось. Появится оно может допустим за 5 секунд(а может и не появится) а вот ждать исчезновения надо уже значительно дольше. А если не появилось за 5 то и ждать нечего.
Он самый, читал, доклад смотрел и в принципе согласен, но возможности разделить тесты на с появляющимся прелоадером и не появляющимся нет. Данные о его появлении брать неоткуда.
element is not attached to the page document кидается в случае, если был создан объект IWebElement после чего произошло изменение DOM-а(например рефреш страницы). Обращение к элементу по ранее созданному обхекту IWebElement невозможно. как вариант - или переинициализировать объект заново ли бо делать обёртку над IWebElement где храните локатор, а не сам объект IWebElement, и каждый раз через проперти\геттер возвращаете новый объект по локатору. Возможно, Вы это всё и так знаете и дело не в этом, конечно) но это то, что я встречал на практике