2015-10-30 14 views
5

Electronを使用して実行しているアプリケーションのユニットテストとe2eテストをProtractorを使用して設定しようとしています。私は(this oneが助けをしました)多くの異なったポストに参照のうえしてきたが、私はまだ、私は理解していないエラーが表示されます。電子機器で分度器を使用する

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

マイconf.jsファイルは次のようになります。

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

Protractor websiteに記載されているドキュメントを考慮して、私は何か他のもの(ジャスミンなど)をインストールする必要はないという印象を受けています。
main.js(Electronの仕様に従ってアプリケーションを起動する)へのパスが正しいとはいえ、私はポップアップするElectronウィンドウに何も表示されません。
この問題が発生しましたか?あなたはそれを解決することができましたか?

答えて

2

明らかに、電子バイナリを使用して実際にアプリケーションを起動するには不十分です。しかし、建物あなたのアプリケーションのバイナリとあなたのconf.jsファイルにそれをリンクすることによって動作します。
私はこれに私のファイルを削減することができました:
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://"; 
    } 
}; 

それをこのようにすることで、baseUrlを記述するか、起動にbrowser.get()browser.driver.get()を使用する必要はありませんアプリ内のアプリ。
しかし、私はアプリのバイナリをビルドする必要はありませんでしたが、私は今は可能だとは思わない。

0

分度器は角型アプリケーションで動作するように設計されていますが、角度のないアプリでも使用できます。

電子アプリで角度を使用している場合は、ng-appと同期するだけです。

角度アプリを使用していない場合は、isAngularSite(false)を設定する必要があります。同期しようとしません。

+1

** main.js **によって呼び出される** index.html **ファイルで 'ng-app'を使用しています(' mainWindow.loadUrl( 'file://' + __dirname + '/ index.html ');)、それ以前にも失敗します:** index.html **は決して表示されません。 解決方法を試しましたが、Angularの同期の問題を修正しましたが、htmlが表示されないためテストが失敗します。 –

1

分度器はElectron固有のAPIにアクセスすることができず、レンダラーを適切に制御することができないため、Electronではうまく機能しません。一方、Spectronは、電子専用に設計されており、分度器に非常に似たAPIを備えています。これにより、メインプロセスとレンダラープロセスの両方を同時にテストするためのアクセス権が与えられます。

角度2が正しく読み込まれるのを待つために、いくつかのコードを分度器からコピーする必要がありました。 (。無視しますが、アンギュラ使用していない場合)ここでは実施例である:

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

あなたが自動的に実行したい複数の.specファイルがある場合、あなたはJasmineやモカのNode.jsでこれを統合することができますテストランナー。あなたはmain.jsが配置されているプロジェクトのルートから分度器を起動し、あなたがそうのようなあなたのprotractor.conf.jsを設定することができるはずと仮定すると

0

capabilities.chromeOptions.argsため

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

オプションはelectron渡されているものです。 capabilitiesの詳細については、selenium has documentation on it hereを参照してください。