У меня есть веб-приложение для тестирования с Selenium. При загрузке страницы выполняется много JavaScript.
Этот код JavaScript не очень хорошо написан, но я ничего не могу изменить. Так что ждать появления элемента в DOM с помощью findElement()
метода не вариант.
Я хочу создать универсальную функцию в Java для ожидания загрузки страницы, возможное решение:
- запустите сценарий JavaScript из формы WebDriver и сохраните результат
document.body.innerHTML
в строковой переменнойbody
. - сравните
body
переменную с предыдущей версиейbody
. если они одинаковы, установите приращение счетчика,notChangedCount
иначе установитеnotChangedCount
нулевое значение. - подождите некоторое время (например, 50 мс).
- если страница не менялась в течение некоторого времени (например, 500 мс),
notChangedCount >= 10
тогда выйдите из цикла, в противном случае перейдите к первому шагу.
Как вы думаете, это верное решение?
findElement
ожидает, пока элемент будет доступен, но иногда элемент доступен до того, как код javascript будет полностью инициализирован, поэтому это не вариант.Ответы:
Если бы кто-нибудь действительно знал общий и всегда применимый ответ, он был бы реализован повсюду много веков назад и сделал бы нашу жизнь НАСТОЛЬКО проще.
Вы можете сделать много вещей, но у каждого из них есть проблема:
Как сказал Ашвин Прабху, если вы хорошо знаете сценарий, вы можете наблюдать за его поведением и отслеживать некоторые из его переменных на
window
иdocument
т. Д. Это решение, однако, не для всех и может использоваться только вами и только на ограниченном наборе страниц.Ваше решение, наблюдая за HTML-кодом и независимо от того, был ли он изменен или не изменен в течение некоторого времени, неплохо (также есть способ получить исходный и неотредактированный HTML напрямую
WebDriver
), но:setTimeout()
) и работают снова и снова, и, возможно, могут изменять HTML каждый раз при запуске. Серьезно, каждая страница «Web 2.0» делает это. Даже переполнение стека. Вы можете перезаписать наиболее распространенные используемые методы и считать сценарии, которые их используют, завершенными, но ... вы не можете быть уверены.innerHTML
развлекаться.Есть инструменты, которые помогут вам в этом. А именно Progress Listeners вместе с nsIWebProgressListener и некоторыми другими. Однако поддержка браузером для этого ужасна. Firefox начал пытаться поддерживать его с FF4 и далее (все еще развивается), IE имеет базовую поддержку в IE9.
И я думаю, что скоро смогу придумать другое ошибочное решение. Дело в том, что нет однозначного ответа на вопрос, когда сказать «теперь страница завершена», потому что бесконечные скрипты делают свою работу. Выберите тот, который вам лучше всего подходит, но остерегайтесь его недостатков.
источник
Спасибо, Эшвин!
В моем случае мне нужно дождаться выполнения плагина jquery в каком-то элементе ... в частности, "qtip"
исходя из вашего намека, это отлично сработало для меня:
Примечание: я использую Webdriver 2
источник
Вам нужно дождаться завершения загрузки Javascript и jQuery. Выполнить Javascript , чтобы проверить , если
jQuery.active
это0
иdocument.readyState
естьcomplete
, это означает , что JS и JQuery загрузка завершена.источник
document.readyState == 'complete' && jQuery.active == 0
отлично работает, но есть ли что-то подобное для React? Поскольку эти проверки не улавливают все еще загружаемые данные / компонент реакции?Определяет / инициализирует ли библиотека JS какие-либо известные переменные в окне?
Если да, вы можете дождаться появления переменной. Ты можешь использовать
((JavascriptExecutor)driver).executeScript(String script, Object... args)
чтобы проверить это условие (что-то вроде :)
window.SomeClass && window.SomeClass.variable != null
и вернуть логическое значениеtrue
/false
.Оберните это в
WebDriverWait
и дождитесь, пока скрипт вернетсяtrue
.источник
У меня была такая же проблема. Это решение работает для меня от WebDriverDoku:
http://www.seleniumhq.org/docs/04_webdriver_advanced.jsp
источник
Если все, что вам нужно сделать, это подождать, пока html на странице станет стабильным, прежде чем пытаться взаимодействовать с элементами, вы можете периодически опрашивать DOM и сравнивать результаты, если DOM одинаковы в течение заданного времени опроса, вы золотой. Что-то вроде этого, где вы передаете максимальное время ожидания и время между опросами страниц перед сравнением. Просто и эффективно.
источник
Приведенный ниже код отлично работает в моем случае - моя страница содержит сложные java-скрипты.
Источник - как дождаться загрузки / готовности страницы в Selenium WebDriver
источник
Чтобы проверить, загружена ли страница перед обнаружением любого элемента на странице, можно использовать два условия:
Использование нижеприведенного readyState будет ждать загрузки страницы
Ниже JQuery будет ждать, пока данные не будут загружены
После этого JavaScriptCode попробуйте найти webElement.
источник
Я попросил своих разработчиков создать переменную JavaScript "isProcessing", к которой я могу получить доступ (в объекте "ae"), которую они устанавливают, когда что-то начинает работать, и очищать, когда что-то сделано. Затем я запускаю его в аккумуляторе, который проверяет его каждые 100 мс, пока он не получит пять подряд, всего 500 мс без каких-либо изменений. По прошествии 30 секунд я генерирую исключение, потому что к тому времени что-то должно было произойти. Это на C #.
источник
Чтобы сделать это правильно, вам нужно обработать исключения.
Вот как я жду iFrame. Для этого требуется, чтобы ваш тестовый класс JUnit передавал экземпляр RemoteWebDriver в объект страницы:
ПРИМЕЧАНИЕ. Здесь вы можете увидеть весь мой рабочий пример .
источник
Для
nodejs
библиотеки Selenium я использовал следующий фрагмент. В моем случае, я искал двух объектов, которые добавляются к окну, которое в этом примере<SOME PROPERTY>
,10000
является таймаут миллисекунд,<NEXT STEP HERE>
то , что происходит после того, как свойства находятся на окне.источник
Вы можете написать логику, чтобы справиться с этим. Я написал метод, который вернет,
WebElement
и этот метод будет вызываться три раза, или вы можете увеличить время и добавить нулевую проверку дляWebElement
Вот примеристочник
Вот из моего собственного кода:
Window.setTimeout выполняется только тогда, когда браузер простаивает.
Таким образом, рекурсивный вызов функции (42 раза) займет 100 мс, если в браузере нет активности, и многое другое, если браузер занят чем-то другим.
В качестве бонуса счетчик может быть сброшен на document.readyState или на вызовах jQuery Ajax, или если запущены какие-либо анимации jQuery (только если ваше приложение использует jQuery для вызовов ajax ...)
...
...
РЕДАКТИРОВАТЬ: я заметил, что executeAsyncScript не работает, если загружается новая страница и тест может перестать отвечать неопределенно, лучше использовать это вместо этого.
источник
Не знаю, как это сделать, но в моем случае конец загрузки страницы и рендеринг совпадают с FAVICON, отображаемым на вкладке Firefox.
Итак, если мы можем получить изображение значка в веб-браузере, веб-страница будет полностью загружена.
Но как это сделать ....
источник
У меня работает неявное ожидание.
Обратитесь к этому ответу Selenium c # Webdriver: подождите, пока не появится элемент
источник
Вот как я это делаю:
источник
Мне нравится ваша идея опросить HTML, пока он не станет стабильным. Я могу добавить это к своему собственному решению. Следующий подход основан на C # и требует jQuery.
Я разработчик тестового проекта SuccessFactors (SaaS), в котором мы не имеем никакого влияния на разработчиков или характеристики модели DOM, лежащей в основе веб-страницы. Продукт SaaS потенциально может изменять свой основной дизайн DOM 4 раза в год, поэтому постоянно ведется охота за надежными и производительными способами тестирования с помощью Selenium (включая НЕ тестирование с помощью Selenium, где это возможно!)
Вот что я использую для слова «страница готова». В настоящее время он работает во всех моих собственных тестах. Тот же подход работал и для большого собственного веб-приложения на Java пару лет назад, и к тому моменту, когда я покинул проект, он был надежным более года.
Driver
это экземпляр WebDriver, который взаимодействует с браузеромDefaultPageLoadTimeout
значение тайм-аута в тиках (100 нс за тик)В дальнейшем обратите внимание на порядок ожидания в методе
PageReady
(готовность документа Selenium, Ajax, анимация), который имеет смысл, если вы задумаетесь:Что-то вроде вашего подхода к сравнению DOM можно использовать между 1 и 2, чтобы добавить еще один уровень надежности.
источник