2016-11-13 43 views
13

我非常享受AWS Lambda功能,我想知道我想在这里做什么是可能的。在我的本地机器上,我有一个量角器配置文件:如何编写运行量角器/ Selenium浏览器自动化脚本的AWS Lambda脚本?

// 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. 

    }); 
}); 

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

目前,我通过我的本地命令shell中运行量角器这样的脚本:

protractor protractor.conf.js 

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

+1

我不确定,但通常lambda是用于更改/检查文件进出S3存储,响应某些http调用等?这似乎是更适合在节点等EC2实例上运行的东西。 – adeneo

+2

我认为使用Ec2可以完成的任何事情都可以作为无服务器体系结构与Lambda一起完成。 – Jim

回答

5

这是一个非常有趣的问题。我们的组织一直在探索我们的CI/CD管道可以以无服务器的方式完成多少工作。这是胡同。

不幸的是,我不认为有优雅方式从另一个节点脚本运行protractor。也就是说,protractor似乎没有公开使得以这种方式消费容易的API。

这是been asked for,但(作为一个相对较新的protractor)注释权面前的问题是关闭,并不包含足够的细节让我知道如何采取这种做法。所以,不那么优雅的方法:

子进程

此前评论尽管如此,你的确可以从另一个节点脚本中运行protractor,包括AWS的lambda环境中执行节点脚本。有可能是更漂亮/更好的方式来做到这一点,但我还是把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中子进程的专家。
相关问题