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

How Can I write an AWS Lambda Script that Runs a Protractor / Selenium Browser Automation Script?

本文关键字:脚本 自动化 AWS Lambda 浏览器 Selenium 何编写 运行 量角器      更新时间:2023-09-26

我非常喜欢AWS Lambda函数,我想知道我想在这里做的事情是否可行。在我的本地机器上,我有一个量角器配置文件:

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

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

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

protractor protractor.conf.js 

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

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

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

有人要求这样做,但是(作为protractor的相对较新的人(问题关闭前的评论没有包含足够的细节让我知道如何采取这种方法。 因此,不太优雅的方法:

子进程

尽管之前有评论,但您确实可以从另一个 Node 脚本中运行protractor,包括在 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);
  });
};

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

存储库在这里。

笔记

  • npm是使用此方法的运行时依赖项,这意味着必须将其打包到可部署对象中。 这使得 lambda 函数相对较大。 在 ~20mb 时,它足够大,以至于您不必再在 AWS 控制台中内联编辑代码。 不npm打包为运行时依赖项的方法会更好。
  • 不要忘记 Lambda 有严格的 5 分钟时间限制。 您的测试需要在比这更短的时间内完成。
  • 看时钟。 在许多情况下,我的玩具示例只使用浏览器几秒钟,但开销(我认为主要是连接到 BrowserStack(使 Lambda 总共需要 12-30 秒。 为使用浏览器 2.5 秒而支付 30 秒的计算费用听起来不像是赢家。 大批量测试可能更少浪费。
  • 确实可以获得子进程的 CloudWatch 日志记录,而无需自己进行任何额外的管道,这很好。
  • 免责声明:我的示例只经过快乐路径测试,我不是 Node 中子进程的专家。