如何编写运行量角器/Selenium 浏览器自动化脚本的 AWS Lambda 脚本
How Can I write an AWS Lambda Script that Runs a Protractor / Selenium Browser Automation Script?
我非常喜欢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 中子进程的专家。
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- 不显示带有本地json文件数据的谷歌地图脚本
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 从远程脚本获取用户IP
- 如何根据时间运行不同的脚本
- 如何将字符串值从php页面发送到java脚本页面
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 运行IOS自动化脚本时需要查找崩溃
- 使用JavaScript调用Shell脚本以实现自动化
- 如何使用 JavaScript 实现自动化登录到脚本编辑器中的消息窗口
- 在web上使用脚本注入的自动化测试
- 如何编写运行量角器/Selenium 浏览器自动化脚本的 AWS Lambda 脚本
- 如何搜索在iOS自动化脚本字符串中的子字符串?indexOf()和search()方法不工作
- 自定义脚本和css版本控制的最佳实践和gruntjs自动化
- 使用外部VB脚本在网页中调用Java脚本(IE自动化)
- 如何以编程方式获得我的自动化脚本中的UI层次结构
- 自动化脚本记录屏幕与QuickTime使用JavaScript