2014-10-10 16 views
5

Jestem (niedawno) przy użyciu kątomierza do uruchamiania testów ogórka e2e. Mam aplikację internetową opartą na angularJS. Używam appium do zdalnego uruchamiania testu na prawdziwym urządzeniu z Androidem. Oto wersje Używam:Kątomierz waitForAngular() kończy się niepowodzeniem w aplikacji webowej kątowej (appium/chrome na prawdziwym urządzeniu)

windows8.1 
[email protected] (with submodule [email protected]) 
[email protected] 
android device with 4.4.4 

moja konfiguracja kątomierz (ekstrakty), odpowiadające 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 
}; 

Jak widać, mam otrzymuje kątomierza webdriver URL z appium webdriver. I rozpocząć appium z poleceń z „appium &”, a następnie uruchomić test z „protactor cucumbertest.conf”

Telefon otwiera przeglądarkę Chrome i przejście do adresu URL daję z „browser.get (URL)”

problem jest następujący: waitForAngular call(), która jest asynchronicznie czekając na stronie internetowej, aby załadować i na wszystkich otwartych żądanie hTTP (o ile rozumiem), nie jest wykonywane z powodzeniem w telefonie. telefon nie reaguje na wezwanie i proxy webdriver zwraca 500.

Odpowiadający https://github.com/angular/protractor/issues/1358, i rozumie się, że funkcja waitForAngular() miesza się kątomierz do połączenia

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

Za waitForAngular () w protractor.js plików jest poniższa funkcja, która jest przekierowywane do telefonu:

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); 
    } 
}; 

Dodatkowe informacje: kiedy STIM zlokalizować błąd w obiekcie webdriver (przeglądarka), komunikat o błędzie wskazuje na chromeedriver.exe wewnątrz katalogu kątomierza. Nie rozumiem, dlaczego błąd nie pochodzi od chromedriver appium


tak tldr; bez udanego połączenia waitForAngular, nie mogę (stabilnie lub w ogóle) uzyskać dostęp do elementów na stronie telefonu, więc nie testuj. może nieporozumienie niektórych podstawowych szczegółów konfiguracji tutaj, wszystkie wskazówki są mile widziane.

edit: dodaje logi serwera appium tutaj: http://pastebin.com/vqBGUdXH

+1

Twoje możliwości są poprawne, a serwer Appium działa poprawnie. Zwrócone 500 jest po przetworzeniu wszystkich poleceń. Spróbuj opublikować na discuss.appium.io otrzymasz najlepszą odpowiedź tam – sheeptest

Odpowiedz

4

Zakładam, że zidentyfikowaliśmy problem. Appium i kątomierz działają dobrze.

Moja aplikacja angularJS powoduje problem. Używa $ timeout do odpytywania (im wymuszony na kancie 1.07, który nie ma interwału $). Powoduje to, że kątomierz oczekuje, że strona będzie nadal w fazie ładowania i nie zostanie ukończona. Dlatego wywołanie funkcji waitForAngular() nigdy nie wraca, a czas oczekiwania na test po określonym limicie czasu-czasu.

oczekuje i znane, również udokumentowane (lepiej czytać doc pierwszy;) To zachowanie) w http://angular.github.io/protractor/#/timeouts

doc sugeruje następujące ciągłego odpytywania: zastąpić $timeout z $interval:

Jeśli aplikacja ciągłe ankiety $timeout lub $http, to nigdy nie zostanie zarejestrowane jako całkowicie załadowane. Powinieneś używać usługi $interval (interval.js) dla wszystkiego, co sonduje w sposób ciągły (wprowadzone w Angular 1.2rc3).

Na razie Naprawiono problem w inny sposób: wyłączyć wbudowany kątową synchronizację i ręcznie zsynchronizować

this.Before(function(next){ 
    ptor = protractor.getInstance(); 
    ptor.ignoreSynchronization = true; //disables waitForangular() 
    next(); 
}); 
  1. Sync Metoda 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. metodę synchronizacji 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

muszę dodać tutaj, że możesz użyć $ timeout, o ile poprawnie uruchomisz funkcję .cancel na $ timeout. zastąpienie $ timeout interwał $ nie jest tak oczywiste, ponieważ nie mają one dokładnego zachowania. Sprawdź mój post http://stackoverflow.com/questions/40832962/angular-1-5-timeout-using-a-httpinterceptor i komentarz, jak anulować timeout, po tym można nadal kontynuować korzystanie z waitForAngular –