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