1

我有一个 Node 脚本,我想使用该child_process模块来让Selenium服务器与 PhantomJS 的GhostDriver 一起运行。

我需要模块: 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}

一些注意事项:

  • Selenium jar 文件实际上位于 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到同样的错误
  • 如果我在脚本之外单独运行这些命令,一切正常
4

1 回答 1

2

如果其他遇到此问题,我们使用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

如果您遇到困难,我们很乐意提供帮助!

于 2016-06-14T13:49:16.103 回答