2016-05-26 8 views
12

Ci sono altre domande su SO con lo stesso problema, ma le soluzioni non hanno funzionato per me. Qui miei spec.jsng: test non trovato nessun injector per argomento elemento per getTestability

describe('Protractor Demo App', function() { 
    it('should have a title', function() { 
    browser.driver.get('http://rent-front-static.s3-website-us-east-1.amazonaws.com/'); 

    expect(browser.getTitle()).toEqual('How It Works'); 
    }); 
}); 

Ed ecco i miei conf.js

exports.config = { 
    framework: 'jasmine', 
    rootElement: 'body', 
    seleniumAddress: 'http://localhost:4444/wd/hub', 
    specs: ['spec.js'] 
} 

Così, quando si tenta di eseguire il mio test im ottenere l'errore

Message: 
    Failed: Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.5.0/ng/test" 
    Stack: 
    Error: Failed: Error while waiting for Protractor to sync with the page: "[ng:test] no injector found for element argument to getTestability\nhttp://errors.angularjs.org/1.5.0/ng/test" 
     at C:\Users\ShapeR\PycharmProjects\ratest\node_modules\jasminewd2\index.js:101:16 
     at Promise.invokeCallback_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:1329:14) 
     at TaskQueue.execute_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:2790:14) 
     at TaskQueue.executeNext_ (C:\Users\ShapeR\PycharmProjects\ratest\node_modules\selenium-webdriver\lib\promise.js:2773:21) 

1 spec, 1 failure 

ho un bootstrapping manuale per body element e imposta rootElement al body in config, ma non ha aiutato. Ho anche provato a rimuovere il boostraping manuale e aggiungere semplicemente ng-app = 'rentapplicationApp' all'elemento body, ma non cambia nulla, sempre lo stesso errore.

Quindi cosa c'è che non va?

+1

Penso che un'applicazione "bootstrap manuale" sia ancora impegnativa per essere sincronizzata con il goniometro. Ti andrebbe bene disattivando la sincronizzazione con 'browser.ignoreSynchronization = true'? – alecxe

+0

Inoltre, prova a sostituire '$ timeout' con' $ interval', ovunque tu lo usi. Quindi, avvia regolarmente l'app con 'ng-app' definita su' body'. Ancora lo stesso problema? – alecxe

+0

@alecxe Sì, come ho detto che la sostituzione del bootstrap manuale con ng-app non ha cambiato nulla. Sostituendo $ timeout con $ intervallo non cambierà nulla. ignoreSynchronization = true fai questo semplice test, ma non penso davvero che sia una soluzione, dato che da ciò che ho letto in http://www.protractortest.org/#/timeouts è usato per pagine senza angoli, quindi credo che altre funzioni del goniometro non funzionerà neanche con esso .. – Aldarund

risposta

0

Il problema era nel riavviare la mia app. Per qualche motivo, non funziona con il tag ng-app. L'unica soluzione di lavoro è stato quello di bootstrap manuale,

angular.bootstrap(document, ["rentapplicationApp"]); 

E primo argomento dovrebbe essere nodo DOM, non una stringa, come è stato nel mio caso, anche se con uno spago l'applicazione funziona, ma getTestability fallirà.

1

Il valore fondamentale di Goniometro è che gestisce il caricamento angolare per te, inclusa la sincronizzazione, quindi hai perfettamente ragione a non voler usare: browser.ignoreSynchronization = true.

Il messaggio di errore che si ottiene è che il goniometro non è in grado di individuare l'angolazione per sincronizzarsi. Questo è a causa di una combinazione di due questioni:

  • La pagina non è pronto, angolare non è caricato
  • E 'in grado di individuare il ng-app, anche una volta che la pagina viene caricata

In primo luogo, da Protractor setup page.

Se la tua pagina non esegue il bootstrap manuale, il goniometro non sarà in grado di caricare la pagina utilizzando browser.get. Utilizzare invece l'istanza webdriver di base: browser.driver.get. Ciò significa che il goniometro non sa quando la pagina è completamente caricata e potrebbe essere necessario aggiungere una dichiarazione di attesa per assicurarsi che i test evitino le condizioni della gara.

Soluzione 1

aggiungere un'istruzione wait.

Soluzione 2

Se non si dispone di un buon motivo per l'avvio manuale, o non si vuole aspettare:

  • arresto bootstrapping manualmente l'applicazione
  • Usa browser.get over browser.driver.get
+0

Grazie per la risposta ma. La soluzione 2 non funziona. ho provato sia driver.get che browser.get - non cambia nulla. E l'ho provato senza bootstrap manuale, lo stesso errore. Anche la soluzione 1 non ha funzionato. Ho anche provato ad aggiungere browser.sleep per 10 secondi per quale app è stata caricata di sicuro. Ancora lo stesso errore. Vedi questo frammento. http://pastebin.com/cK3HfB5w – Aldarund

1

[ng : Test] no iniettore trovato per argomento elemento getTestability

Ho il sospetto che ci sia qualcosa di sbagliato con l'applicazione stessa, il modo in cui viene bootstrap, poiché Protractor trova in realtà l'elemento principale (è possibile impostare in modo esplicito la rootElement: "body.root" anche all'interno della tua configurazione), ma non riesce a setup the injector per l'elemento radice.

Vorrei provare a capire cosa sta succedendo passo dopo passo - prima, prova a eseguire il test del goniometro su un'applicazione non creata avviata direttamente dalla sorgente per assicurarti che non si tratti del webpack o di altre parti del creare un difetto

Quindi, proverei ad aggiornare all'ultima versione 1.x Angolare e Goniometro (la versione 3.3.0 è la più recente).


Il più semplice soluzione in questo momento sarebbe quella di girare la sincronizzazione tra goniometro e angolare Senza, utilizzando browser.ignoreSynchronization = true:

describe("Strange Protractor/Angular problem", function() { 
    beforeEach(function() { 
     browser.ignoreSynchronization = true; 
     browser.get("https://dl.dropboxusercontent.com/u/597502/vxcv/index.html"); 

     var elm = $(".navbar-brand"); 
     browser.wait(EC.presenceOf(elm), 5000); 
    }); 

    it("should have an expected title", function() { 
     expect($(".navbar-brand").getText()).toEqual('RENT APPLICATION'); 
    }); 
}); 

Naturalmente, ci sono aspetti negativi di questo approccio - si avrebbe dovuto utilizzare le chiamate browser.wait qui e là per affrontare il problema di temporizzazione. Il flusso di test non sarebbe così naturale e semplice come sarebbe quando la sincronizzazione è attiva.

+0

Non posso correre contro non costruito dal momento che la mia app richiede webpack, altrimenti non funziona, inoltre uso l'ultima versione 1.5.5 e il glicometro 3.3.0. Non ha aiutato. Ma la mia app funziona bene, non ha errori js, funziona. Solo il goniometro può provarlo. Non è un bug nel proctoricatore? Per quanto riguarda la disattivazione della sincronizzazione, l'intero punto di utilizzo del goniometro viene perso per me. – Aldarund

+0

@Aldarund si, ho capito che disabilitare la sincronizzazione non è la soluzione più desiderata qui. Ho provato più cose fino ad ora, ma non sono riuscito a risolverlo con sync on..it è una specie di strana situazione che non ho mai visto prima mentre testavo altre app con Protractor. A proposito, vedo errori js sulla console [qui] (https://dl.dropboxusercontent.com/u/597502/vxcv/index.html/). – alecxe

+0

@alexce ci sono errori a causa di cors, non stanno accadendo nella situazione normale, ma sempre lo stesso errore. Ho aperto un ticket nel repository dei goniometri ma è stato appena chiuso senza alcun controllo, perché la sua "richiesta di supporto per stackoverflow" ... – Aldarund