我非常喜欢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'
}
}
和一个用某个网址加载浏览器窗口的脚本:
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脚本中运行量角器。我的想法是,我可以通过使用Browserstack或Sauce Labs提供的浏览器来启动Lambda函数,但我无法弄清楚如何从Node.js脚本运行量角器。
答案 0 :(得分:7)
这是一个非常有趣的问题。我们的组织一直在探索我们有多少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'
}
};
备注强>
npm
是使用此方法的运行时依赖项,这意味着它必须打包到您的可部署中。这使得lambda函数相对较大。大约20mb,它足以让你不再在AWS控制台中内联编辑代码。未将npm
打包为运行时依赖关系的方法将更多更好。