2014-10-10 3 views
5

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

windows8.1 
[email protected] (with submodule [email protected]) 
[email protected] 
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 
}; 

Как вы можете видеть, я заменил WebDriver URL транспортира в с appium 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); 
    } 
}; 

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


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

редактирования: добавлен сервер журналы appium здесь: http://pastebin.com/vqBGUdXH

+1

Ваши возможности правильные, и сервер приложений работает правильно. 500 возвращенных после обработки всех команд. Попробуйте опубликовать на обсуждении.appium.io вы получите лучший ответ там – sheeptest

ответ

4

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

Мое угловое приложение JS вызывает проблему. Он использует $ timeout для опроса (im принудительно на угловом 1.07, который не имеет $ интервала). Это приводит к тому, что транспортир ожидает, что страница останется на стадии загрузки и не закончена. Поэтому вызов функции 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); 
    
+1

Я должен добавить здесь, что вы можете использовать $ timeout, пока вы правильно выполняете функцию .cancel в $ timeout. замена $ timeout на $ interval не так очевидна, потому что у них нет точного поведения. Проверьте мой пост http://stackoverflow.com/questions/40832962/angular-1-5-timeout-using-a-httpinterceptor и комментарий о том, как отменить $ timeout, после чего вы все равно можете продолжать использовать waitForAngular –

Смежные вопросы