How to pass PhantomJS path to Selenium Grid

2019-04-28 19:15发布

问题:

I'm getting an error when trying to set up a phantomjs node on Selenium Grid (https://wiki.jenkins-ci.org/display/JENKINS/Selenium+Plugin)

I've set up the following custom json configuration:

{
  "capabilities": [
    {
      "browserName": "phantomjs",
      "phantomjs.binary.path": "/usr/bin/phantomjs",
      "platform": "LINUX",
      "maxInstances": 5
    }
  ],
  "configuration": {
    "nodeTimeout":120,
    "port":5555,
    "hubPort":4444,
    "hubHost":"localhost",
    "nodePolling":2000,
    "registerCycle":10000,
    "register":true,
    "cleanUpCycle":2000,
    "timeout":30000,
    "maxSession":1
  }
}

But I get an error when I run webdriver against it:

WebDriverException: Message: The path to the driver executable must be set by the phantomjs.binary.path capability/system property/PATH variable; for more information, see https://github.com/ariya/phantomjs/wiki. The latest version can be downloaded from http://phantomjs.org/download.html
Stacktrace:
    at com.google.common.base.Preconditions.checkState (Preconditions.java:199)
    at org.openqa.selenium.phantomjs.PhantomJSDriverService.findPhantomJS (PhantomJSDriverService.java:236)
    at org.openqa.selenium.phantomjs.PhantomJSDriverService.createDefaultService (PhantomJSDriverService.java:181)
    at org.openqa.selenium.phantomjs.PhantomJSDriver.<init> (PhantomJSDriver.java:104)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0 (NativeConstructorAccessorImpl.java:-2)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance (Constructor.java:526)
    at org.openqa.selenium.remote.server.DefaultDriverProvider.callConstructor (DefaultDriverProvider.java:103)
    at org.openqa.selenium.remote.server.DefaultDriverProvider.newInstance (DefaultDriverProvider.java:97)
    at org.openqa.selenium.remote.server.DefaultDriverFactory.newInstance (DefaultDriverFactory.java:60)
    at org.openqa.selenium.remote.server.DefaultSession$BrowserCreator.call (DefaultSession.java:222)
    at org.openqa.selenium.remote.server.DefaultSession$BrowserCreator.call (DefaultSession.java:1)
    at java.util.concurrent.FutureTask.run (FutureTask.java:262)
    at org.openqa.selenium.remote.server.DefaultSession$1.run (DefaultSession.java:176)
    at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:615)
    at java.lang.Thread.run (Thread.java:745)
-------------------- >> begin captured logging << --------------------
selenium.webdriver.remote.remote_connection: DEBUG: POST http://127.0.0.1:4444/wd/hub/session {"desiredCapabilities": {"browserName": "phantomjs"}}
selenium.webdriver.remote.remote_connection: DEBUG: Finished Request

If I stop the node started by the plugin (and keep the plugin hub running), and manually run my own node as follows, it works fine:

java -jar selenium-server-standalone-2.53.0.jar -role webdriver 
    -browser browserName=phantomjs,platform=LINUX 
    -hub http://localhost:4444/grid/register

[edit] phantomjs is executable from the shell and lives at /usr/bin/phantomjs:

$ whereis phantomjs
phantomjs: /usr/bin/phantomjs

I can't find a canonical description online of a phantomjs setup and this isn't one of the default browser options provided by the plugin.


The problem with the above was the OS permissions on /usr/bin/phantomjs; I needed to do chmod a+x on it.


Cheekily adding this additional problem

This works (manually started by me):

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.111.x86_64/jre/bin/java -jar /var/lib/jenkins/selenium-server-standalone-2.53.0.jar -role webdriver -browser browserName=phantomjs,platform=LINUX -hub http://localhost:4444/grid/register

This doesn't (the process started by the selenium plugin):

/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.111.x86_64/jre/bin/java -cp /var/cache/jenkins/war/WEB-INF/lib/remoting-2.56.jar hudson.remoting.Launcher -cp /var/lib/jenkins/selenium-server-standalone-2.53.0.jar:/var/lib/jenkins/htmlunit-driver-standalone-2.20.jar -connectTo localhost:36322

Error I'm getting when running the test: PHPUnit_Extensions_Selenium2TestCase_WebDriverException: The process has not exited yet therefore no result is available

回答1:

Adding the answer just in case someone misses the comment.

Please check if phantomjs has 'x' (execute) access for all users. If it doesnt, then use the command to change the access.

chmod +x /usr/bin/phantomjs

The new error "The process has not exited yet therefore no result is available" mostly comes with selenium/driver version mismatch. You could try downgrading the version of selenium.

Btw, what version of phantomjs are you using.



回答2:

Try adding -Dphantomjs.binary.path=/usr/bin/phantomjs to your Java flags for Jenkins (typically look to /etc/default/jenkins or /etc/sysconfig/jenkins).



回答3:

juste add path in command line like this:

'/usr/bin/java' -Dphantomjs.binary.path='/home/john/.local/share/binman_phantomjs/linux64/2.1.1/phantomjs-2.1.1-linux-x86_64/bin/phantomjs' -jar '/home/john/.local/share/binman_seleniumserver/generic/3.0.1/selenium-server-standalone-3.0.1.jar'