Как написать AWS Lambda Script, который запускает автоматизацию браузера/селена? Script?

Мне очень нравятся функции 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'
  }
}

и script, который загружает окно браузера с определенным URL:

describe('Protractor Demo App', function() {
  it('should have a title', function() {
    browser.driver.get('https://github.com/');

   // Click around and do things here.

  });
});

Цель моих сценариев прямо сейчас не в черном ящике тестировать приложение, которое я разрабатываю, а вместо этого автоматизировать общие задачи браузера, которые я не чувствую.

В настоящее время я запускаю транспортир script через локальную командную оболочку следующим образом:

protractor protractor.conf.js 

Мне интересно, возможно ли запустить транспортир из другого node.js script. Мое мышление состоит в том, что я мог бы заставить функцию лямбда начать работу с транспортиром, возможно, используя браузеры, доступные из браузера или Sauce Labs, но я не могу понять, как запустить транспортир из node.js script.

Ответ 1

Это действительно интересный вопрос. Наша организация изучает, сколько из нашего конвейера CI/CD можно сделать без сервера. Это прямо вверх по этой аллее.

К сожалению, я не думаю, что есть элегантный способ запустить protractor из другого Node script. То есть, protractor, похоже, не предоставляет API, который позволяет легко потреблять таким образом.

было задано, но (как относительный новичок в protractor) комментарий перед закрытием вопроса не содержит достаточно подробностей для меня, чтобы знать, как принять такой подход. Итак, не очень элегантный подход:

Реальный процесс

Несмотря на предыдущие комментарии, вы действительно можете запустить protractor из другого Node script, включая Node script, выполняющийся в среде AWMS 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 - это зависимость от времени выполнения, использующая этот подход, то есть он должен быть упакован в ваш развертываемый. Это приводит к относительно большой лямбда-функции. В ~ 20 Мб он достаточно большой, чтобы вы больше не могли редактировать встроенный код в консоли AWS. Подход, который не упаковал npm в качестве зависимости от времени выполнения, был бы намного более приятным.
  • Не забывайте, что Lambda имеет жесткий 5-минутный срок. Ваши тесты нужно будет выполнить за меньшее время.
  • Смотрите часы. Во многих случаях мой пример с игрушкой использует только браузер в течение нескольких секунд, но накладные расходы (от подключения к BrowserStack, в основном, я полагаю) заставляют Лямбду принимать 12-30 секунд в целом. Уплата за 30 секунд вычисления для использования браузера в течение 2,5 секунд не похожа на выигрыш. Более крупные партии тестов могут быть менее расточительными.
  • Вы do получаете доступ к CloudWatch для регистрации дочернего процесса, не делая никаких дополнительных сантехнических работ, что приятно.
  • Отказ от ответственности: мой пример прошел проверку только на счастливом пути, и я не эксперт в отношении дочерних процессов в Node.