如何编写运行量角器/ Selenium浏览器自动化脚本的AWS Lambda脚本?

时间:2016-11-13 15:55:57

标签: javascript node.js selenium aws-lambda browserstack

我非常喜欢AWS Lambda功能,我想知道我想在这里做什么是可能的。在我的本地机器上,我有一个Protractor配置文件:

// 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.

  });
});

我的脚本现在的目的不是黑盒子测试我正在开发的应用程序,而是自动执行我不喜欢的常见浏览器任务。

目前,我正在通过我的本地命令shell运行量角器脚本,如下所示:

protractor protractor.conf.js 

我想知道是否可能从另一个node.js脚本中运行量角器。我的想法是,我可以通过使用Browserstack或Sauce Labs提供的浏览器来启动Lambda函数,但我无法弄清楚如何从Node.js脚本运行量角器。

1 个答案:

答案 0 :(得分:7)

这是一个非常有趣的问题。我们的组织一直在探索我们有多少CI / CD管道可以无服务器方式完成。这就是胡同。

不幸的是,我不认为有一种优雅的方式可以从另一个Node脚本运行protractor。也就是说,protractor似乎没有暴露出一种能够以这种方式轻松使用的API。

这是been asked for,但是(作为protractor的相对新人)在问题关闭之前的评论中没有足够的细节让我知道如何采用这种方法。所以,不那么优雅的方法:

子过程

尽管有先前的评论,但您确实可以从另一个Node脚本中运行protractor,包括在AWS'Lambda环境中执行的Node脚本。可能有更漂亮/更好的方法来执行此操作,但我使用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中子进程的专家。