Не удается запустить Selenium + PhantomJS/GhostDriver в качестве дочерних процессов

У меня есть скрипт Node, с которым я хочу использовать модуль child_process, чтобы заставить сервер Selenium работать с GhostDriver PhantomJS.

Мне нужен модуль: Child = require "child_process"

А вот как я пытаюсь запустить сервер и привязать к нему GD (в Coffeescript):

@Selenium = new Child.exec "java -jar selenium/selenium-server-standalone-2.44.0.jar -role hub -port 4444", (error, stdout, stderr) =>
    console.log stdout
    console.log error if error
@PhantomJS = new Child.exec "phantomjs --webdriver=8080 --webdriver-selenium-grid-hub=http://127.0.0.1:4444", (error, stdout, stderr) =>
    console.log stdout
    console.log error if error

stdout для @PhantomJS это:

PhantomJS is launching GhostDriver...
[ERROR - 2014-12-10T18:51:27.587Z] GhostDriver - main.fail - {"message":"Could not start Ghost Driver","line":82,"sourceId":4469911104,"sourceURL":":/ghostdriver/main.js","stack":"Error: Could not start Ghost Driver\n    at :/ghostdriver/main.js:82","stackArray":[{"sourceURL":":/ghostdriver/main.js","line":82}]}

Кроме того, я получаю эту ошибку от этой команды: {"killed": false, "code": 1, "signal": null}

Некоторые примечания:

  • Файл jar Selenium фактически находится по адресу selenium/selenium-server-standalone-2.44.0.jar.
  • Я пробовал npm updateing просто посмотреть, будет ли это иметь значение
  • Мне пришло в голову, что что-то еще может работать на порту 4444, поэтому я пошел дальше и запустил "PORT_NUMBER=4444 | lsof -i tcp:${PORT_NUMBER} | awk 'NR!=1 {print $2}' | xargs kill" безрезультатно.
  • Я попытался установить PhantomJS из исходного кода в соответствии с этим предложением с той же ошибкой
  • Если я запускаю эти команды отдельно, вне скрипта, все работает нормально

person Jody Heavener    schedule 10.12.2014    source источник
comment
Вы когда-нибудь догадывались об этом? Я имею ту же самую проблему.   -  person Taylor Evanson    schedule 06.02.2015
comment
Неа. Я сжег компьютер. Это исправило это очень хорошо.   -  person Jody Heavener    schedule 06.02.2015


Ответы (1)


Если у кого-то еще есть эта проблема, мы решили ее, используя daemon для запуска дочернего процесса в фоновом режиме, чтобы терминал мог свободно выполнять другие команды/скрипты.

Примечание: вам потребуется установить модуль daemon из NPM: npm install daemon --save-dev
(у него есть тесты + достойная статистика использования, и он делает то, что вам нужно/ожидается)

Создайте файл с именем selenium_child_process.js и вставьте следующий код:

console.log('Starting Selenium ...');
require('daemon')(); // this will run everything after this line in a daemon:
const exec = require('child_process').exec;
// note: your path to the selenium.jar may be different!
exec('java -jar ./bin/selenium.jar', (error, stdout, stderr) => {
  if (error) {
    console.error(`exec error: ${error}`);
    return;
  }
  if (stdout) {
    console.log(`> ${stdout}`); 
  }
  if (stderr) {
    console.log(`>> ${stderr}`); // handle errors in your preferred way.
  }
});

Затем запустите файл с помощью node selenium_child_process.js (в терминале).

Теперь у вас есть selenium, работающий как дочерний (фоновый) процесс на TCP-порту 4444.


Если вы хотите отключить сервер Selenium, вам потребуется kill этот процесс. Мы используем следующую команду:

lsof -n -iTCP:4444 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9

Если вы застряли, мы будем рады помочь!

person nelsonic    schedule 14.06.2016