Всем привет. Кто-нибудь тестировал #angularjs and #selenium если до то не подскажете как вы ждали чтоб полностью страница загрузилась?
protractor - Это то что вам нужно.
Я сделаю допущение, что вопрос возник не просто потому что вы не гуглили, а потому что вы не пишите тесты на JS.
У меня подобная ситуация на проекте. 3 приложения написаны на GWT, 1 - на Angular. Долго думал, стоит ли мне браться за JS, или продолжать на ruby. Пришел к выводу что использовать ruby - это городить костыли для того что уже отлично работает изкоробки для JS.
Если ваш проект состоит ТОЛЬКО из angular приложения - я вам рекомендую использовать именно протрактор. Он удобен, и приятен, очень не много действий требуют каких то специфичных ожиданий, есть нюанс с дебагом и не привычной асинхронностью - но к этому быстро привыкаешь.
Не хотелось бы писать на JavaScript, да и не знаю его. Пытаюсь найти как люди имплементировали это на Selenium. нашел на Git как добрые лиди выташили из протрактора все методы которых нет в selenium и написали на Java все через JavaScriptExecutor Пытаюсь чтоб заработало на моем коде, пока тоже никак. и не только гуглил, у нас в компании уже сть проект на протракторе, но не хочется писать на JavaScript, Java ближе будет
Да, я вас понимаю. Но как по мне язык програмирования - это иструмент. А инструменты можно менять, для разных задач Что бы писать на нем тесты - в принципе достаточно курса на Codecademy. А также знание других языков и подходов - хороший и полезный опыт.
Если тебе ближе Java, то попробуй писать тесты с помощью Selenide - это удобная обёртка над селениумом, которая умеет умно ждать изменений на странице
Если что обращайся в скайп: newromik
И присоединяйся в Slack чат к опытным автоматизаторам, поможем всей кучей: https://software-testers.herokuapp.com/
Принципиально это делается по-другому.
Ты не ждёшь, пока загрузится страница, а ждёшь, пока загрузятся необходимые тебе элементы. Почитай про implicit и explicit waits. Используй Visible в качестве условия для завершения ожидания.
Если необходимо по какой-то причине дождаться, пока отработают все ajax запросы - используй ExecuteScript.
Если лень разбираться - используй Selenide. Он это всё умеет из коробки.
нету такого механизма, есть костили… например loadedCriteria написать для каждого пейдж обджекта и в Page Factory initElements засунуть, перед тем подождать пока js page load complete не отпашет и проверить что все собития подгрузились - есть такое вот еще решение Using the LoadableComponent pattern for better Page Object handling in Selenium | On Test Automation
Интересно как узнать какой aJax запрос мне надо ждать? Visible не помогает,потому что все элементы видны , а действия над ними призводить нельзя пока не зокончатся все запросы(примерно 1 сек) никогда не работал раньше с AngularJS… пробовал такое:
public void waitForJQuery(WebDriver driver) {
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
JavascriptExecutor js = (JavascriptExecutor) d;
return (Boolean) js.executeScript("return jQuery.active == 0");
}
});
}
но выдает exception
WebDriverException: unknown error: jQuery is not defined
и ругается на это return jQuery.active == 0
Есть соображения?
спасибо @Roma_Marinsky, @Defender, хотелось бы с Selenium сначало разобраться… а следующий проект можно и selenoidy учиться. хотя до этого selenium не подводил не разу)
Есть. Эксепшен возникает потому, что данная переменная не определена на странице в тот момент времени, когда ты её запрашиваешь.
Вот отсюда можно попробовать эту функцию как дополнительное условие:
userWindow.Ajax.activeRequestCount == 0;
Для того, чтобы избежать эксепшена, посмотри здесь
Есть ещё 1 идея. Посмотри реализацию waitForAngularRequestsToFinish()
Вот тут. Или можешь просто подключить данный фреймворк, если лень разбираться
На каждый элемент страницы будет свой вэйт, и это еще не все, в ангуляре то что элемент виден еще не значит что его можно использовать, придется строить цепочки из вэйтов…
Есть похожая проблема. На проекте идет обновление приложения и новый функционал во многом написан с использованием AngularJS. В итоге на наборе новых страниц при сохранении формы ChromeDriver просто вешается и чего-то бесконечно ждет, в то время как FirefoxDriver спокойно себе проходит дальше.
Кто-то встречался с чем-то подобным?
попробуйте java порт Protractor:
(GitHub - caarlos0-graveyard/jProtractor: An angular/protractor implementation for Java Selenium API)
и
GitHub - sergueik/jpagefactory: JPageFactory is a set of Selenium Java FindBy annotations that eases the usage of Selenium page factory pattern for automating Angular based web application. It is based on JProtractor project which is a Java wrapper of Protractor framework.
(GitHub - henrrich/jpagefactory: JPageFactory is a set of Selenium Java FindBy annotations that eases the usage of Selenium page factory pattern for automating Angular based web application. It is based on JProtractor project which is a Java wrapper of Protractor framework.)
все Angular локаторы по умолчанию
делают
this.driver.waitForAngular();
который делает
/* Wait until Angular has finished rendering and has
* no outstanding $http calls before continuing.
* arguments[0] {string} The selector housing an ng-app
* arguments[1] {function} callback
*/
var waitForAngular = function(rootSelector, callback) {
var el = document.querySelector(rootSelector);
try {
if (window.getAngularTestability) {
window.getAngularTestability(el).whenStable(callback);
return;
}
....
var rootSelector = arguments[0] || 'document';
var callback = arguments[1] || log;
waitForAngular(rootSelector, callback);
работает во всех браузерах
Этот код плох сразу с нескольких сторон:
- document.querySelector(‘document’) - это null, в случае, если rootSelector неизвестен, нужно брать “html”
- window.getAngularTestability не определено в Angular 1.x
Проще уж выдрать соответствующий JS из ngWebDriver, который был выше по треду.
и ngWebdriver и jProtractor используют пркатически одинаковый javascript
который изначально взят из Angulat Progractor
он работает хорошо с Angular 1.x (я один из разработчиков jProtractor).