2015-10-30 17 views
5

Sto tentando di impostare test unitari e test e2e per un'applicazione che uso con utilizzando Protractor. Ho riferisco a molti posti diversi (this one ha aiutato), ma ancora ottengo un errore che non capisco:Utilizzo di goniometro in elettrone

Message: 
    Error while waiting for Protractor to sync with the page: "angular could not be found on the window" 
Stacktrace: 
    undefined 

miei conf.js file di simile a questo:

exports.config = { 
    directConnect : true, 
    seleniumAddress: 'http://localhost:4444/wd/hub', 
    baseUrl:"file://home/me/workspace/testing-project/main.js", 
    capabilities: { 
     browserName: "chrome", 
     chromeOptions: { 
      binary: "/home/me/.linuxbrew/lib/node_modules/electron-prebuilt/dist/electron", 
      args: ["--test-type=webdriver"] 
     } 
    }, 
    specs: ['todo-specs.js'], 
    onPrepare: function(){ 
     browser.resetUrl = "file://"; 
     browser.driver.get("file://"); 
    } 
}; 

Considerando la documentazione fornita su Protractor website, ho l'impressione che non sia necessario installare altro (Jasmine per esempio).
Quello che mi sorprende è che anche se il percorso per il main.js (che avvia l'applicazione in base alle specifiche di Electron) è corretto, non riesco a vedere nulla nella finestra dell'Electron che si apre.
Qualcuno di voi ha riscontrato questo problema? Sei riuscito a risolverlo?

risposta

2

Apparentemente, l'uso dell'elettrone binario non è sufficiente per avviare effettivamente l'applicazione. Tuttavia, per il edificio, il file binario della tua applicazione e il collegamento al tuo file conf.js funzionano.
Sono stato in grado di ridurre il mio file a questo:
conf.js

exports.config = { 
    seleniumAddress: 'http://localhost:4444/wd/hub', 
    specs: ['test-spec.js'], 
    capabilities: { 
     browserName: "chrome", 
     chromeOptions: { 
      binary: "./dist/myAwesomeApp/myAwesomeAppBinary" 
     } 
    }, 
    onPrepare: function() { 
     browser.resetUrl = "file://"; 
    } 
}; 

Facendo in questo modo, non c'è bisogno di descrivere un baseUrl o per usare browser.get()browser.driver.get() per avviare il app in Electron.
Tuttavia, avrei preferito non dover creare l'app binario, ma non penso sia possibile per ora.

0

Il goniometro è progettato per funzionare con le app angolari, ma è possibile utilizzarlo anche per le app "non angolari".

Se si utilizza l'angolare con l'app per elettroni, sarà sufficiente osservare lo ng-app e la sincronizzazione.

Se non si utilizza un'app angolare, è necessario impostare isAngularSite(false), quindi non tenterà di sincronizzarsi.

+1

L'applicazione utilizza 'ng-app' nel file ** index.html ** chiamato da ** main.js ** (' mainWindow.loadUrl ('file: //' + __dirname + '/ index.html '); ') ma fallisce anche prima: ** index.html ** non viene mai visualizzato. Ho provato la soluzione, corregge il problema della sincronizzazione di Angular, ma i test falliscono perché l'html non viene mai visualizzato. –

1

Il goniometro non funziona bene con Electron, poiché non ha accesso alle API specifiche di Electron e il renderer non può essere controllato correttamente. Spectron, d'altra parte, è progettato specificamente per Electron e ha un'API molto simile a Goniometro. Ti dà accesso per testare contemporaneamente sia i processi principali che i programmi di rendering.

Ho dovuto copiare del codice dal goniometro per farlo aspettare che Angular 2 si carichi correttamente. (. Ignorare se non si utilizza angolare) Ecco un esempio di lavoro:

const path = require('path'); 
const electron = require('electron-prebuilt'); 
var Application = require('spectron').Application 
var assert = require('assert') 

let appPath = path.join(__dirname, '..', 'dist'); 

function awaitAngular2(client) { 
    client.timeoutsAsyncScript(5000); 
    // From: https://github.com/angular/protractor/blob/master/lib/clientsidescripts.js 
    // Returns a promise that resolves when all of Angular 2's components are loaded and stable 
    return client.executeAsync(function(done) { 
    try { 
     var testabilities = window.getAllAngularTestabilities(); 
     var count = testabilities.length; 
     var decrement = function() { 
     count--; 
     if (count === 0) { 
      done(); 
     } 
     }; 
     testabilities.forEach(function(testability) { 
     testability.whenStable(decrement); 
     }); 
    } catch (err) { 
     done(err.message); 
    } 
    }); 
} 

describe('application launch', function() { 
    this.timeout(10000) 

    beforeEach(function() { 
    this.app = new Application({ 
     path: electron, 
     args: [appPath] 
    }); 
    return this.app.start().then(() => { 
     return awaitAngular2(this.app.client); 
    }) 
    }); 

    afterEach(function() { 
    if (this.app && this.app.isRunning()) { 
     return this.app.stop() 
    } 
    }); 

    it('shows an initial window', function() { 
    return this.app.client.getWindowCount().then(function (count) { 
     assert.equal(count, 1) 
    }) 
    }); 

    it('shows a headline', function() { 
    this.app.client.getText('app-banner h1').then(function (bannerText) { 
     assert.equal(bannerText, 'Tour of Heroes'); 
    }) 
    }); 
}); 

Se si dispone di più file .spec che si desidera eseguire automaticamente, è possibile integrare questo con Jasmine o Mocha Node.js corridori di prova.

0

Supponendo che si avvia goniometro dalla radice del vostro progetto in cui si trova main.js, si dovrebbe essere in grado di impostare il protractor.conf.js in questo modo:

exports.config = { 
    directConnect: true, 
    capabilities: { 
     browserName: 'chrome', 
     chromeOptions: { 
      binary: 'node_modules/.bin/electron', 
      args: ['app=main.js'] 
     } 
    }, 
    onPrepare: function() { 
     browser.resetUrl = "file://" 
    } 
} 

Le opzioni per capabilities.chromeOptions.args sono ciò che viene passato electron. Per ulteriore documentazione su capabilities, selenium has documentation on it here.