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

标签 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'
  }
}

以及一个使用特定 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 protractor.conf.js 

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

最佳答案

这是一个非常有趣的问题。我们的组织一直在探索我们的 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 子进程方面的专家。

关于javascript - 如何编写运行 Protractor/Selenium 浏览器自动化脚本的 AWS Lambda 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40575780/

相关文章:

python - 在 Selenium/Python 中迭代 WebElements

javascript - 转译代码给出 TypeError :is not a constructor

javascript - Node xmpp 消息未发送到正确的目的地

javascript - 电子邮件黑名单和验证

javascript - 为什么我的 Mongo 查询不起作用?

node.js - Socket.io - 如何使用监听器

python - 使用 Selenium : How to keep logged in after closing Driver in Python

javascript - .net core 2.2 和 3.0 中的差异帖子结构

javascript - "Evaluate"存储在MongoDB服务器中的函数

selenium - 在 Windows Server 2008 上运行 selenium