2016-11-13 72 views
13

我非常享受AWS Lambda功能,我想知道我想在這裏做什麼是可能的。在我的本地機器上,我有一個量角器配置文件:如何編寫運行量角器/ Selenium瀏覽器自動化腳本的AWS Lambda腳本?

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

,並在瀏覽器窗口中出現了某些網址加載了一個腳本:

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

    // Click around and do things here. 

    }); 
}); 

目的,我的劇本,現在是不是黑-box測試我正在開發的應用程序,而是自動執行我不想做的常見瀏覽器任務。

目前,我通過我的本地命令shell中運行量角器這樣的腳本:

protractor protractor.conf.js 

我想知道它是否可能從另一個node.js的腳本中運行量角器。我的想法是,我可以使用Lambda函數啓動量角器作業,可能通過使用Browserstack或Sauce Labs提供的瀏覽器,但我無法弄清楚如何從Node.js腳本運行量角器。

+1

我不確定,但通常lambda是用於更改/檢查文件進出S3存儲,響應某些http調用等?這似乎是更適合在節點等EC2實例上運行的東西。 – adeneo

+2

我認爲使用Ec2可以完成的任何事情都可以作爲無服務器體系結構與Lambda一起完成。 – Jim

回答

5

這是一個非常有趣的問題。我們的組織一直在探索我們的CI/CD管道可以以無服務器的方式完成多少工作。這是衚衕。

不幸的是,我不認爲有優雅方式從另一個節點腳本運行protractor。也就是說,protractor似乎沒有公開使得以這種方式消費容易的API。

這是been asked for,但(作爲一個相對較新的protractor)註釋權面前的問題是關閉,並不包含足夠的細節讓我知道如何採取這種做法。所以,不那麼優雅的方法:

子進程

此前評論儘管如此,你的確可以從另一個節點腳本中運行protractor,包括AWS的lambda環境中執行節點腳本。有可能是更漂亮/更好的方式來做到這一點,但我還是把this answer和基於它下面的lambda函數:

'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'];指向protractor配置文件,這在本回合點測試(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是使用此方法的運行時依賴項,這意味着它必須打包到您的可部署項中。這使得一個相對較大的lambda函數。在〜20mb左右,它足夠大,您不再需要在AWS控制檯內聯編輯代碼。沒有將npm作爲運行時依賴包進行打包的方法是,其中更好。
  • 不要忘記Lambda有5分鐘的時間限制。您的測試需要在比此更少的時間內完成。
  • 看鐘。在許多情況下,我的玩具示例僅使用瀏覽器幾秒鐘,但開銷(連接到BrowserStack,大部分我認爲)使Lambda完全耗時12-30秒。支付30秒計算使用瀏覽器2.5秒聽起來不像是一場勝利。大批量的測試可能會減少浪費。
  • 得到CloudWatch的子進程日誌記錄,而不用自己做任何額外的管道工程,這很好。
  • 聲明:我的例子只有經過快樂路徑測試,並且我不是Node中子進程的專家。
相關問題