Error registering PhantomJS node in Selenium Grid

2020-06-03 04:27发布

问题:

I have the following problem

  • I successfully launched Selenium Grid hub with:

java -jar selenium-server-standalone-2.53.0.jar -role hub

  • After that I tried to launch PhantomJS node with:

phantomjs --webdriver=8090 --webdriver-selenium-grid-hub=http://localhost:4444


but got Error:

[INFO - 2016-03-25T13:56:28.397Z] GhostDriver - Main - running on port 8090 [INFO - 2016-03-25T13:56:28.397Z] GhostDriver - Main - registering to Selenium HUB 'http://localhost:4444' version: using '127.0.0.1:8090' with org.openqa.grid.selenium.proxy.DefaultRemoteProxy as remote proxy. [ERROR - 2016-03-25T13:56:28.400Z] GhostDriver - main.fail - {"line":97,"sourceURL":"phantomjs://platform/hub_register.js","stack":"register@phantomjs://platform/hub_register.js:97:79\nglobal code@phantomjs://code/main.js:78:37"}

phantomjs://platform/console++.js:263 in error

Standard node works ok, but PhantomJS failes. What I'm doing wrong?

回答1:

For anyone still looking, there are linux and windows x64 builds available here with the workaround of v2.1.1 (windows build is on a pull request - the hex editor workaround wont work for windows cos the .exe's are compressed)

https://github.com/mrorgues/PhantomJSCustomEdition



回答2:

workaround*** d/l source from phantomjs http://phantomjs.org/build.html and edit hub_register.js in the src/ghostdriver comment out lines as shown below:

//var ghostdriver = ghostdriver || {};

return {
    capabilities: [{
        browserName: "phantomjs",
        version: version,
        //platform: ghostdriver.system.os.name + '-' + ghostdriver.system.os.version + '-' + ghostdriver.system.os.architecture,
        maxInstances: 1,
        seleniumProtocol: "WebDriver"

compile and everything works!

shortcut: https://github.com/darwin10/phantomjs

Original Source : https://github.com/detro/ghostdriver/issues/394



回答3:

Try replacing localhost with local IP

phantomjs --webdriver=8090 --webdriver-selenium-grid-hub=http://localhost:4444

with

phantomjs --webdriver=8090 --webdriver-selenium-grid-hub=http://127.0.0.1:4444



回答4:

You can override part of binary file with the dd command.
I'm going to replace platform: with //atform::

$ cp /usr/local/bin/phantomjs .

$ ./phantomjs --version
2.1.1

$ xxd -c 16 phantomjs | grep -C 2 'platform:'
01c6aaa0: 7273 696f 6e3a 2076 6572 7369 6f6e 2c0a  rsion: version,.
01c6aab0: 2020 2020 2020 2020 2020 2020 2020 2020
01c6aac0: 706c 6174 666f 726d 3a20 6768 6f73 7464  platform: ghostd
01c6aad0: 7269 7665 722e 7379 7374 656d 2e6f 732e  river.system.os.
01c6aae0: 6e61 6d65 202b 2027 2d27 202b 2067 686f  name + '-' + gho

$ printf '//' | dd of=phantomjs conv=notrunc bs=1 seek=$((0x01c6aac0+0))
2+0 records in
2+0 records out
2 bytes transferred in 0.000117 secs (17085 bytes/sec)

$ xxd phantomjs | grep 'atform:'
01c6aac0: 2f2f 6174 666f 726d 3a20 6768 6f73 7464  //atform: ghostd

$ ./phantomjs --version
2.1.1

$ mv phantomjs /usr/local/bin/

If you cannot locate the string, try to increase octets per line (xxd -c 256).



回答5:

I have spent 2 months trying to fix this problem, trying everything possible, my main issue was that many solutions won't connect to the grid, and ones that do are in docker containers what can only connect to a local grid hosted on the same Docker host.

So... I finally built my own solution which works: https://github.com/madhavajay/selenium-node-phantomjs

Docker image is madhavajay/selenium-node-phantomjs

It uses PhantomJS 2.1.1 Custom Build with fixed Ghostdriver and then my own tweaks to the latest fork of Ghostdriver to allow a custom --remoteHost param all wrapped up in a Docker Container with configurable Environment Variables.

I hope this saves someone the lost weeks I suffered.



回答6:

I had the same issue. Instead of downloading the source code and compiling, as suggested by Ojen G., I used a fix posted by neuro-sys to make the change in the executable. My OS is Ubuntu 16.04.

  1. Download replacestrings.c program.

    wget https://gist.githubusercontent.com/neuro-sys/3bf00b6cf28a93e07e44/raw/52f715fd49fbd271a9450b61d5cd3cf29907a5a0/replacestring.c
    
  2. Compile program

    gcc replacestring.c -o replacestring
    
  3. Replace Java source code string in binary, creating fixed binary.

    ./replacestring "$(strings /usr/lib/phantomjs/phantomjs | grep "platform: ghostdriver")" " " < /usr/lib/phantomjs/phantomjs > f_phantomjs
    
  4. Make binary executable; and put as replacement

    chmod +x f_phantomjs
    sudo chown root:root f_phantomjs
    sudo mv f_phantomjs /usr/lib/phantomjs
    cd /usr/lib/phantomjs
    sudo echo "Fixed error in phantomjs; old file in e_phantomjs" > README.txt
    sudo mv phantomjs e_phantomjs
    sudo ln f_phantomjs phantomjs
    

After these steps, it runs fine (Selenium hub already running):

phantomjs --webdriver=8080 --webdriver-selenium-grid-hub=http://localhost:4444
[INFO  - 2016-05-07T16:33:35.534Z] GhostDriver - Main - running on port 8080
[INFO  - 2016-05-07T16:33:35.534Z] GhostDriver - Main - registering to Selenium HUB 'http://localhost:4444' version:  using '127.0.0.1:8080' with org.openqa.grid.selenium.proxy.DefaultRemoteProxy as remote proxy.
[INFO  - 2016-05-07T16:33:35.604Z] HUB Register - register - Registered with grid hub: http://localhost:4444/ (ok)


回答7:

Following this gist: https://gist.github.com/neuro-sys/41e368839a9b20dafb34

Editing the binary to put a // in front of the offending line worked for me, but not the string replace thing.

-> Follow the part about using hdex

Search for platform:

and replace with //atform:

by replacing the letters pl with // (2F2F in hex)