2015-10-30 8 views
5

Próbuję skonfigurować testy jednostkowe i testy e2e dla aplikacji, którą uruchomiłem z Electron przy użyciu Protractor. Byłem odnosząc się do wielu różnych stanowisk (this one pomogło), ale nadal pojawia się błąd nie rozumiem:Używanie kątomierza w elektronach

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

Moi conf.js plik wygląda tak:

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://"); 
    } 
}; 

Biorąc pod uwagę dokumentację podaną na Protractor website, mam wrażenie, że nie muszę instalować niczego innego (na przykład Jasmine).
Co mnie zaskakuje to, że mimo iż ścieżka do main.js (która uruchamia aplikację zgodnie ze specyfikacją Electrona) jest poprawna, nic nie widzę w wyskakującym okienku elektronu.
Czy któryś z Państwa napotkał ten problem? Czy udało ci się go rozwiązać?

Odpowiedz

2

Wygląda na to, że użycie binarnego elektronu nie jest wystarczające do uruchomienia aplikacji. Jednakże, przez buduje się plik binarny dla twojej aplikacji i łączący go z twoim plikiem conf.js działa.
byłem w stanie zmniejszyć mój plik do tego:
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://"; 
    } 
}; 

Robiąc to w ten sposób, nie ma potrzeby, aby opisać baseUrl lub użyć browser.get() ani browser.driver.get(), aby rozpocząć aplikacja w Electron.
Jednak wolałbym nie budować binarnej aplikacji, ale na razie nie sądzę, że jest to możliwe.

0

Kątomierz jest przeznaczony do pracy z kątowymi aplikacjami, ale można go również używać do aplikacji "niearamatycznych".

Jeśli używasz kanciastości z aplikacją elektronów, to po prostu spojrzysz na ng-app i zsynchronizujesz.

Jeśli nie używasz aplikacji kątowej, powinieneś ustawić isAngularSite(false), wtedy nie spróbujesz zsynchronizować.

+1

Aplikacja używa 'ng-app' w pliku ** index.html **, która jest wywoływana przez ** main.js ** (' mainWindow.loadUrl ('file: //' + __dirname + '/ index.html '); '), ale nie powiedzie się jeszcze przed: ** index.html ** nigdy nie jest wyświetlany. Wypróbowałem twoje rozwiązanie, naprawiłem problem z synchronizacją Angular, ale testy się nie powiodły, ponieważ html nigdy nie jest wyświetlany. –

1

Kątomierz nie działa dobrze z Electron, ponieważ nie ma dostępu do interfejsów API specyficznych dla elektronów, a renderer nie może być właściwie kontrolowany. Spectron, z drugiej strony, jest zaprojektowany specjalnie dla Electron i ma API bardzo podobne do kątomierza. Daje ci dostęp do przetestowania zarówno procesów głównych, jak i renderer w tym samym czasie.

Musiałem skopiować kod z Kątomierza, aby uzyskać oczekiwanie na prawidłowe załadowanie Angular 2. (. Lekceważenie jeśli nie używasz kątowa) Oto przykład roboczych:

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

Jeśli masz wiele plików .spec, które mają być uruchamiane automatycznie, to można zintegrować z Jasmine lub Mocha node.js biegaczy testowych.

0

Zakładając, że uruchomienie kątomierz z korzenia projekcie gdzie main.js znajduje się, powinno być możliwe, aby ustawić protractor.conf.js tak:

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

Możliwości capabilities.chromeOptions.args to co jest przekazywane electron. Aby uzyskać więcej dokumentacji na temat capabilities, selenium has documentation on it here.

Powiązane problemy