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

Jim*_*Jim 13 javascript selenium node.js browserstack aws-lambda

我非常喜欢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'
  }
}
Run Code Online (Sandbox Code Playgroud)

和一个用某个url加载浏览器窗口的脚本:

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

   // Click around and do things here.

  });
});
Run Code Online (Sandbox Code Playgroud)

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

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

protractor protractor.conf.js 
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ick 7

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

不幸的是,我认为没有一种优雅的方式可以protractor从另一个Node脚本运行.也就是说,protractor似乎没有公开一种API,使其易于以这种方式使用.

被要求,但(作为一个相对较新的人protractor)在问题关闭之前的评论没有包含足够的细节让我知道如何采取这种方法.所以,不那么优雅的方法:

儿童过程

尽管有先前的评论,但您确实可以protractor在另一个Node脚本中运行,包括在AWS'Lambda环境中执行的Node脚本.可能有更漂亮/更好的方法来做到这一点,但我接受了这个答案并基于以下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);
  });
};
Run Code Online (Sandbox Code Playgroud)

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'
    }
  };
Run Code Online (Sandbox Code Playgroud)

存储库在这里.

笔记

  • npm是使用此方法的运行时依赖项,这意味着它必须打包到您的可部署中.这使得lambda函数相对较大.大约20mb,它足以让你不再在AWS控制台中内联编辑代码.未封装的方法npm作为运行时的依赖将是漂亮.
  • 不要忘记Lambda有5分钟的时间限制.您的测试需要在更短的时间内完成.
  • 看时钟.在许多情况下,我的玩具示例仅使用浏览器几秒钟,但开销(连接到BrowserStack,主要是,我认为)使Lambda完全耗费12-30秒.支付30秒的计算使用浏览器2.5秒听起来并不像是一场胜利.更大批量的测试可能不那么浪费.
  • 确实得到了子进程的CloudWatch日志记录而没有自己做任何额外的管道,这很好.
  • 免责声明:我的例子只是快乐路径测试,我不是Node中子进程的专家.