2016-11-13 16 views
13

AWSラムダ関数を非常に楽しんでいます。私がここでやりたいことが可能かどうかは疑問です。protractor/seleniumブラウザの自動化スクリプトを実行するAWSラムダスクリプトを記述することはできますか?

// conf.js 
exports.config = { 
    framework: 'jasmine', 
    seleniumAddress: 'http://127.0.0.1:4444/wd/hub', 
    specs: ['automation-script.js'], 
    capabilities: { 
    browserName: 'chrome' 
    } 
} 

と特定のURLでブラウザウィンドウをロードするスクリプト:

describe('Protractor Demo App', function() { 
    it('should have a title', function() { 
    browser.driver.get('https://github.com/'); 

    // Click around and do things here. 

    }); 
}); 

目的は私のスクリプトは今黒にはありません、私のローカルマシン上で、私は、分度器の設定ファイルを持っています-boxは私が開発しているアプリケーションをテストするのではなく、私がやっているような気がしない一般的なブラウザのタスクを自動化することです。

現在、私はこのように私のローカルコマンドシェルを介して分度器のスクリプトを実行している:それは別のNode.jsスクリプト内から分度器を実行する可能性がある場合、私は思ったんだけど

protractor protractor.conf.js 

。私は、BrowserstackやSauce Labsから入手可能なブラウザを使用して、ラムダ関数を分度器の仕事を開始することができると考えていますが、Node.jsスクリプトから分度器を実行する方法を理解できません。

+1

私はよく分かりませんが、一般的にはlambdaはS3ストレージに出入りするファイルの変更やチェック、特定のhttp呼び出しへの応答などですか?これは、ノードなどのEC2インスタンスで実行するのに適したもののようです。 – adeneo

+2

Ec2で実行できることは、ラムダを使用したサーバーレスのアーキテクチャとしても可能だと思います。 – Jim

答えて

5

これは本当に興味深い質問です。私たちの組織では、CI/CDパイプラインのどれがサーバーレスで実行できるかを調査しています。これはその通りです。

残念ながら、私はエレガント別のノードスクリプトからprotractorを実行する方法はないと思います。つまり、protractorは、このような方法で簡単に使用できるAPIを公開していないようです。

been asked forですが、(protractorの相対新着者として)問題が解決される直前のコメントには、このアプローチをどのように行うかを知るための十分な詳細が含まれていません。だから、それほどエレガントなアプローチ:

前のコメントにもかかわらず

子プロセスが、あなたは確かにAWS」ラムダ環境で実行するノードのスクリプトを含む、他のノードのスクリプト内からprotractorを実行することができます。そこにこれを行うにはきれいに/より良い方法であることが、私はthis answerを取り、その上に、次のラムダ関数をベース可能性がありますテストに順番にポイントprotractor設定ファイルへ

'use strict'; 

module.exports.runtest = (event, context, callback) => { 

    var npm = require('npm'); 
    var path = require('path'); 
    var childProcess = require('child_process'); 
    var args = ['conf.js']; 

    npm.load({}, function() { 
    var child = childProcess 
    .fork(path.join(npm.root, 'protractor/bin/protractor'), args) 
    .on('close', function(errorCode) { 
     const response = { 
     statusCode: 200, 
     body: JSON.stringify({ 
      message: `Selenium Test executed on BrowserStack! Child process Error Code: ${errorCode}`, 
     }), 
     }; 
     callback(null, response); 
    }); 
    process.on('SIGINT', child.kill); 
    }); 
}; 

var args = ['conf.js'];ポイント(これでindex.jsケース):

exports.config = { 
    'specs': ['./index.js'], 
    'seleniumAddress': 'http://hub-cloud.browserstack.com/wd/hub', 
    'capabilities': { 
     'browserstack.user': '<BROWSERSTACK_USER>', 
     'browserstack.key': '<BROWSERSTACK_KEY>', 
     'browserName': 'chrome' 
    } 
    }; 

Repository here.

ノート

  • npmは、このアプローチを使用する実行時依存性です。つまり、展開可能パッケージにパッケージ化する必要があります。これは比較的大きなラムダ関数を作る。 〜20MBでは、AWSコンソールでコードをインラインで編集することはできません。実行時の依存関係としてnpmをパッケージ化していない方法は、 nicerです。
  • ラムダには5分の時間制限があります。あなたのテストはそれより短い時間で完了する必要があります。
  • 時計を見る多くの場合、私のおもちゃの例ではブラウザは数秒しか使用されませんが、オーバーヘッド(BrowserStackへの接続、ほとんどの場合、私は推測しています)では、Lambdaが12〜30秒かかることがあります。 2.5秒間ブラウザを使用して30秒間計算すると、勝利のようには聞こえません。テストのバッチが大きいほど無駄が少なくなります。
  • あなたdo自分で余分な配管をしなくても、子プロセスのCloudWatchログを取得できます。これは素晴らしいことです。
  • 免責事項:私の例ではハッピーパステストしか行われておらず、Nodeの子プロセスに関する専門家はいません。
関連する問題