Непритязание вытяжного устройства для AngularApple () не работает на угловом webapp (appium / chrome на реальном устройстве)

Я (недавно), используя транспортир, чтобы запустить тесты e2e огурца. У меня есть веб-приложение с угловым основанием. Я использую appium для удаленного запуска теста на реальном устройстве Android. Вот версии, которые я использую:

windows8.1 protractor@1.3.1 (with submodule selenium-webdriver@2.43.5) appium@1.3.0beta1 android device with 4.4.4 

Конфигурацию моего вытяжка (выдержки), соответствующую https://github.com/angular/protractor/blob/master/docs/browser-setup.md :

 currentDeviceUDID = (...); var appToTestURL = 'http://my.website.com:9000/app/index.html'; exports.config = { seleniumAddress: 'http://localhost:4723/wd/hub'; chromeOnly: false, specs: ['features/sample.feature'], capabilities: { browserName: 'chrome', 'appium-version': '1.0', platformName: 'Android', platformVersion: '4.4.4', udid: currentDeviceUDID }, baseUrl: appToTestURL framework: 'cucumber', cucumberOpts: { require: 'features/stepDefinitionsSample.js', tags: '@dev', format: 'progress' }, // configuring wd in onPrepare onPrepare: function () { var wd = require('wd'), protractor = require('protractor'), wdBridge = require('wd-bridge')(protractor, wd); wdBridge.initFromProtractor(exports.config); }, allScriptsTimeout: 30000, getPageTimeout: 30000 }; 

Как вы можете видеть, я заменил url webdriver веб-сайта транспортира приложением webdriver. Я начинаю appium из командной строки с помощью «appium &», затем я запускаю тест с помощью «protactor cucumbertest.conf»,

Телефон открывает браузер Chrome и перемещается по URL-адресу, я предоставляю его с помощью «browser.get (url)»

Проблема заключается в следующем: вызов waitForAngular (), который асинхронно ожидает загрузки веб-сайта и по всему открытому HTTP-запросу (насколько я понимаю), не выполняется успешно на телефоне. Телефон не реагирует на вызов, а прокси-сервер webdriver возвращает 500.

В соответствии с https://github.com/angular/protractor/issues/1358 , я понял, что функция waitForAngular () смещается в транспортир в вызовы

 ['getCurrentUrl', 'getPageSource', 'getTitle']; 

За waitForAngular () в файле protractor.js есть функция ниже, которая проксирована на телефон:

 functions.waitForAngular = function(selector, callback) { var el = document.querySelector(selector); try { if (angular.getTestability) { angular.getTestability(el).whenStable(callback); } else { angular.element(el).injector().get('$browser'). notifyWhenNoOutstandingRequests(callback); } } catch (e) { callback(e); } }; 

Дополнительная информация: когда я возбуждаю ошибку в объекте webdriver (browser), сообщение об ошибке указывает на chromedriver.exe внутри каталога транспортировщика. Я не понимаю, почему ошибка не из хромированного ребра appium


Поэтому tldr; Без успешного вызова waitForAngular, я не могу (стабильный или вообще) доступ к элементам доступа на странице на телефоне, чтобы не тестировать. Возможно, я неправильно понимаю некоторые основные детали конфигурации здесь, все намеки приветствуются.

Edit: добавлены журналы сервера приложений: http://pastebin.com/vqBGUdXH

Я предполагаю, что я определил проблему. Appium и Protractor работают нормально.

Мое приложение angularJS вызывает проблему. Он использует $ timeout для опроса (im принудительно на угловой 1.07, который не имеет $ interval). Это приводит к тому, что транспортир ожидает, что страница будет оставаться на стадии загрузки и не закончена. Поэтому вызов функции waitForAngular() никогда не возвращается и тайм-ауты проверки после указанного таймаута-времени.

Такое поведение ожидается и известно, также документировано (лучше сначала прочитайте документ;)) по адресу http://angular.github.io/protractor/#/timeouts

Документ предлагает следующее для непрерывного опроса: заменить $timeout на $interval :

Если ваше приложение непрерывно проверяет $timeout или $http , оно никогда не будет зарегистрировано как полностью загруженное. Вы должны использовать услугу $interval (interval.js) для любого, что опроса непрерывно (введено в Angular 1.2rc3).

На данный момент я исправил проблему другим способом: отключить встроенную угловую синхронизацию и синхронизацию вручную

 this.Before(function(next){ ptor = protractor.getInstance(); ptor.ignoreSynchronization = true; //disables waitForangular() next(); }); 
  1. Метод синхронизации 1:

     //at a testcase, wait for an element to be visible with a promise/then browser.wait(function () { element.all(by.css('.myCssClass')).then(function (items) { items[0].getText().then(function (text) { console.log(text); }); }); return true; } 
  2. Метод синхронизации 2:

     // "eventually" (chai-as-promised) internally uses "promise" (and therefore acts like "then") browser.get(url); expect(browser.getTitle()).to.eventually.equal("connect me").and.notify(next);