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

2024-02-22

我非常喜欢 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.

  });
});

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

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

protractor protractor.conf.js 

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


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

不幸的是,我认为没有elegant跑步的方式protractor来自另一个节点脚本。那是,protractor似乎没有公开一个可以轻松以这种方式使用的 API。

It's 被要求 https://github.com/angular/protractor/issues/2334,但是(作为一个相对较新的人protractor)问题关闭之前的评论没有包含足够的细节让我知道如何采取这种方法。所以,不太优雅的方法是:

子进程

尽管之前有评论,你确实可以运行protractor来自另一个节点脚本,包括在 AWS Lambda 环境中执行的节点脚本。可能有更漂亮/更好的方法来做到这一点,但我采取了这个答案 https://stackoverflow.com/a/33496694/2999566并在此基础上创建以下 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'
    }
  };

存储库在这里。 https://github.com/mikepatrick/protractor-browserstack-lambda

Notes

  • npm是使用此方法的运行时依赖项,这意味着它必须打包到您的可部署中。这使得 lambda 函数相对较大。大约 20mb,它足够大,您不再需要在 AWS 控制台中内联编辑代码。没有打包的方法npm作为运行时依赖项much nicer.
  • 不要忘记 Lambda 有 5 分钟的硬性时间限制。您的测试需要在比这更短的时间内完成。
  • 看时钟。在许多情况下,我的玩具示例仅使用浏览器几秒钟,但开销(我认为主要是连接到 BrowserStack)使 Lambda 总共需要 12-30 秒。支付 30 秒的计算费用来使用浏览器 2.5 秒听起来不太划算。大批量的测试可能会减少浪费。
  • You do无需自己进行任何额外的管道操作即可获取子进程的 CloudWatch 日志记录,这很好。
  • 免责声明:我的示例仅经过了愉快路径测试,而且我不是 Node.js 子进程方面的专家。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何编写运行 Protractor/Selenium 浏览器自动化脚本的 AWS Lambda 脚本? 的相关文章

随机推荐