Ошибка Selenium Grid на GitLab CI: ошибка пересылки нового сеанса пустой пул виртуальной машины для возможностей установки

поскольку документация по конфигурации GitLab CI и Selenium, как правило, плохая, я прошу о помощи.

конфигурация как пунктом интереса:

gitlab.ci.yml:

image: node:7

variables:
  HUB_PORT_4444_TCP_ADDR: "selenium__hub"
  HUB_PORT_4444_TCP_PORT: "4444"

services:
  - selenium/hub:latest
  - selenium/node-phantomjs:latest

stages:
  - test

test:
  stage: test
  before_script:
    - apt-get update
    - apt-get install -y default-jdk default-jre
    - npm install -s -g @angular/cli@1.0.6
    - npm install -s
    - node ./node_modules/protractor/bin/webdriver-manager update
  script:
    - ./node_modules/.bin/protractor protractor.ci.conf.js

protractor.ci.conf.js:

/*global jasmine */
const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'phantomjs',
    'phantomjs.binary.path': './node_modules/phantomjs-prebuilt/bin/phantomjs'
  },
  directConnect: false,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  beforeLaunch: function() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
  },
  onPrepare: function() {
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  },
  seleniumAddress: 'http://selenium__hub:4444/wd/hub'
};

С вышеуказанной конфигурацией, GitLab терпит неудачу с:

$ ./node_modules/.bin/protractor protractor.ci.conf.js
(node:3702) DeprecationWarning: os.tmpDir() is deprecated. Use os.tmpdir() instead.
[09:53:27] I/launcher - Running 1 instances of WebDriver
[09:53:27] I/hosted - Using the selenium server at http://selenium__hub:4444/wd/hub
[09:53:28] E/launcher - Error forwarding the new session Empty pool of VM for setup Capabilities [{phantomjs.binary.path=./node_modules/phantomjs-prebuilt/bin/phantomjs, count=1, browserName=phantomjs}]
[09:53:28] E/launcher - WebDriverError: Error forwarding the new session Empty pool of VM for setup Capabilities [{phantomjs.binary.path=./node_modules/phantomjs-prebuilt/bin/phantomjs, count=1, browserName=phantomjs}]
    at Object.checkLegacyResponse (/builds/netaachen/operator-app/node_modules/selenium-webdriver/lib/error.js:505:15)
    at parseHttpResponse (/builds/netaachen/operator-app/node_modules/selenium-webdriver/lib/http.js:509:13)
    at doSend.then.response (/builds/netaachen/operator-app/node_modules/selenium-webdriver/lib/http.js:440:13)
    at process._tickCallback (internal/process/next_tick.js:109:7)
From: Task: WebDriver.createSession()
    at Function.createSession (/builds/netaachen/operator-app/node_modules/selenium-webdriver/lib/webdriver.js:777:24)
    at createDriver (/builds/netaachen/operator-app/node_modules/selenium-webdriver/index.js:167:33)
    at Builder.build (/builds/netaachen/operator-app/node_modules/selenium-webdriver/index.js:632:14)
    at Hosted.getNewDriver (/builds/netaachen/operator-app/node_modules/protractor/lib/driverProviders/driverProvider.ts:60:29)
    at Runner.createBrowser (/builds/netaachen/operator-app/node_modules/protractor/lib/runner.ts:225:39)
    at q.then.then (/builds/netaachen/operator-app/node_modules/protractor/lib/runner.ts:391:27)
    at _fulfilled (/builds/netaachen/operator-app/node_modules/protractor/node_modules/q/q.js:834:54)
    at self.promiseDispatch.done (/builds/netaachen/operator-app/node_modules/protractor/node_modules/q/q.js:863:30)
    at Promise.promise.promiseDispatch (/builds/netaachen/operator-app/node_modules/protractor/node_modules/q/q.js:796:13)
    at /builds/netaachen/operator-app/node_modules/protractor/node_modules/q/q.js:556:49
[09:53:28] E/launcher - Process exited with error code 199
ERROR: Build failed: exit code 1

2 ответов


Я neved использовать Гитлаб ки, но есть опыт селен. Поэтому позвольте мне сначала описать некоторые важные соображения:--14-->

  1. ошибка, которую вы получаете, означает, что в концентраторе нет запрошенного браузера. Вероятно, это связано с тем, что PhantomJS не удалось зарегистрироваться.
  2. вам не нужно устанавливать ни Java, ни Selenium server для работы с PhantomJS. Это отдельная бинарных реализации протокола селен. Поэтому для работы с PhantomJS-просто запустите контейнер с PhantomJS. Например, я бы использовал это:selenoid/phantomjs:2.1.1 файл (сборки здесь) - он просто работает phantomjs --webdriver=4444. PhantomJS по умолчанию прослушивает порт 8910 но из-за команды выше мы все еще можем использовать 4444.
  3. я думаю, что вам также не нужно использовать webdriver-manager который является инструментом Javascript для загрузки Selenium server или двоичных файлов webdriver. Это не нужно для работы с PhantomJS.
  4. не уверен, почему переменные среды, такие как HUB_PORT_4444_TCP_ADDR были добавлен. Поэтому я бы убрал их все.

сказав, что давайте попробуем изменить ваши файлы.

gitlab-ci.yml будет:

image: node:7

services:
  - selenoid/phantomjs:2.1.1

stages:
  - test

test:
  stage: test
  before_script:
    - npm install -s -g @angular/cli@1.0.6
    - npm install -s
  script:
    - ./node_modules/.bin/protractor protractor.ci.conf.js

protractor.ci.conf.js становится (только изменено имя контейнера в seleniumAddress):

/*global jasmine */
const { SpecReporter } = require('jasmine-spec-reporter');

exports.config = {
  allScriptsTimeout: 11000,
  specs: [
    './e2e/**/*.e2e-spec.ts'
  ],
  capabilities: {
    'browserName': 'phantomjs',
    'phantomjs.binary.path': './node_modules/phantomjs-prebuilt/bin/phantomjs'
  },
  directConnect: false,
  baseUrl: 'http://localhost:4200/',
  framework: 'jasmine',
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 30000,
    print: function() {}
  },
  beforeLaunch: function() {
    require('ts-node').register({
      project: 'e2e/tsconfig.e2e.json'
    });
  },
  onPrepare: function() {
    jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
  },
  seleniumAddress: 'http://selenoid__phantomjs:4444/wd/hub'
};

не уверен, что это baseUrl - кажется, некоторые вещи транспортира, поэтому я думаю, что не нужно менять. Пожалуйста, задайте больше вопросов, если таковые имеются.


ключ должен использовать Xvfb на GitLab CI. Это вращает дисплей так --headless Chrome может запускать спецификации.

я завернул больше информации и куски кода в блогекак запустить AngularJS сквозные тесты на GitLab CI.