Search code examples
seleniumselenium-grid

Setting up Selenium Grid using Script


Setting up selenium Grid:

I was able to set up grid (hub & node) using below commands in command prompt and then able to launch browsers and execute test successfully.

    java -jar selenium-server-standalone-3.4.0.jar -role hub
    java -jar selenium-server-standalone-3.4.0.jar -role webdriver -hub "http://localhost:4444/grid/register" -port 5566

When trying to setup selenium grid via script, i was able to setup hub and node successfully, but not able to launch the browser.

Kindly help to resolve the issue.

Please find the code and console below:

    package config.HubNode;

    import java.net.MalformedURLException;  
    import java.net.URL;    
    import org.openqa.grid.common.RegistrationRequest;  
    import org.openqa.grid.internal.utils.SelfRegisteringRemote;  
    import org.openqa.grid.internal.utils.configuration.GridHubConfiguration;  
    import org.openqa.grid.internal.utils.configuration.GridNodeConfiguration;  
    import org.openqa.grid.web.Hub;  
    import org.openqa.selenium.Platform; 
    import org.openqa.selenium.WebDriver;  
    import org.openqa.selenium.remote.DesiredCapabilities;
    import org.openqa.selenium.remote.RemoteWebDriver;

    public class HubNodeConfig {

    public static void main(String[] args) throws Exception {

        HubNodeConfig objHubNodeConfig = new HubNodeConfig();
        objHubNodeConfig.HubConfig();
        System.out.println("Hub Configured Successfully");

        objHubNodeConfig.NodeConfig();
        System.out.println("Node Configured to Hub Successfully");
        objHubNodeConfig.InvokeBrowser();
    }

    public void HubConfig() throws Exception
    {
        GridHubConfiguration gridHubConfig = new GridHubConfiguration();
        gridHubConfig.role = "hub";
        gridHubConfig.host = "localhost";
        gridHubConfig.port = 4444;

        Hub myHub = new Hub(gridHubConfig);
        myHub.start();
    }

    public void NodeConfig()
    {
        GridNodeConfiguration gridNodeConfig = new GridNodeConfiguration();
        gridNodeConfig.hub = "http://localhost:4444/grid/register"
        gridNodeConfig.host = "192.xxx.xx.xx" //my ip address
        gridNodeConfig.port = 5566;
        gridNodeConfig.role = "webdriver";

        RegistrationRequest req = new RegistrationRequest(gridNodeConfig);
        req.getConfiguration();
        req.validate();
        RegistrationRequest.build(gridNodeConfig);

        SelfRegisteringRemote remote = new SelfRegisteringRemote(req);
        remote.startRegistrationProcess();
    }

    public void InvokeBrowser() throws MalformedURLException
    {
        System.setProperty("webdriver.chrome.driver", "E:\\chromedriver.exe");
        DesiredCapabilities capability = DesiredCapabilities.chrome();
        capability.setBrowserName("chrome");
        capability.setPlatform(Platform.WIN10);

        WebDriver driver = new RemoteWebDriver(new URL("http://"+gridNodeConfig.host+":"+gridNodeConfig.port+"/wd/hub"), capability);
        System.out.println("Driver Launched Successfully");
        driver.get("https://google.com");
    }
    }

Console error message and Screenshot of the Grid:



    2017-07-20 23:57:17.135:INFO::main: Logging initialized @2576ms to org.seleniumhq.jetty9.util.log.StdErrLog    
    Jul 20, 2017 11:57:17 PM org.openqa.grid.web.Hub initServer
    INFO: Will listen on 4444    
    2017-07-20 23:57:17.509:INFO:osjs.Server:main: jetty-9.4.3.v20170317     
    2017-07-20 23:57:17.569:INFO:osjs.session:main: DefaultSessionIdManager workerName=node0    
    2017-07-20 23:57:17.570:INFO:osjs.session:main: No SessionScavenger set, using defaults    
    2017-07-20 23:57:17.573:INFO:osjs.session:main: Scavenging every 600000ms    
    2017-07-20 23:57:17.592:INFO:osjsh.ContextHandler:main: Started o.s.j.s.ServletContextHandler@1a1d6a08{/,null,AVAILABLE}    
    2017-07-20 23:57:17.804:INFO:osjs.AbstractConnector:main: Started ServerConnector@77f99a05{HTTP/1.1,[http/1.1]}{0.0.0.0:4444}    
    2017-07-20 23:57:17.804:INFO:osjs.Server:main: Started @3245ms    
    Hub Configured Successfully    
    Jul 20, 2017 11:57:19 PM org.openqa.grid.internal.utils.SelfRegisteringRemote$1 run    
    INFO: Starting auto registration thread. Will try to register every 5000 ms.    
    Jul 20, 2017 11:57:19 PM org.openqa.grid.internal.utils.SelfRegisteringRemote registerToHub    
    INFO: Registering the node to the hub: http: //localhost:4444/grid/register    
    Node Configured to Hub Successfully    
    Jul 20, 2017 11:57:19 PM org.openqa.grid.internal.Registry add    
    INFO: Registered a node http: //192.xxx.xx.xx:5566    
    Jul 20, 2017 11:57:19 PM org.openqa.grid.internal.utils.SelfRegisteringRemote registerToHub   
    INFO: The node is registered to the hub and ready to use    

    Exception in thread "main" 
    org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.    
    Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
    System info: host: 'KRISH', ip: '192.xxx.xx.xx', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_131'    
    Driver info: driver.version: RemoteWebDriver
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:658)
        at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:250)
        at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:236)
        at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:137)
        at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:174)
        at config.HubNode.HubNodeConfig.InvokeBrowser(HubNodeConfig.java:71)
        at config.HubNode.HubNodeConfig.main(HubNodeConfig.java:29)
     Caused by: org.apache.http.conn.HttpHostConnectException: Connect to 192.xxx.xx.xx:5566 [/192.xxx.xx.xx] failed: Connection refused: connect 
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:159)
        at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:359)
        at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
        at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
        at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
        at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
        at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
        at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:72)
        at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
        at org.openqa.selenium.remote.internal.ApacheHttpClient.fallBackExecute(ApacheHttpClient.java:139)
        at org.openqa.selenium.remote.internal.ApacheHttpClient.execute(ApacheHttpClient.java:87)
        at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:343)
        at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:159)
        at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:142)
        at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
        ... 6 more
    Caused by: java.net.ConnectException: Connection refused: connect
        at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
        at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
        at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
        at java.net.PlainSocketImpl.connect(Unknown Source)
        at java.net.SocksSocketImpl.connect(Unknown Source)
        at java.net.Socket.connect(Unknown Source)
        at org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:75)
        at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
        ... 21 more

    >Jul 21, 2017 12:15:30 AM org.openqa.grid.selenium.proxy.DefaultRemoteProxy onEvent     
    INFO: Marking the node http: //192.xx.xx.xx:5566 as down: cannot reach the node for 2 tries    
    Jul 21, 2017 12:16:30 AM org.openqa.grid.selenium.proxy.DefaultRemoteProxy onEvent    
    INFO: Unregistering the node http: //192.xx.xx.xx:5566 because it's been down for 60077 milliseconds    
    Jul 21, 2017 12:16:30 AM org.openqa.grid.internal.Registry removeIfPresent    
    WARNING: Cleaning up stale test sessions on the unregistered node http: //192.xx.xx.xx:5566    
    Jul 21, 2017 12:16:34 AM org.openqa.grid.internal.utils.SelfRegisteringRemote registerToHub    
    INFO: Registering the node to the hub: http: //localhost:4444/grid/register    
    Jul 21, 2017 12:16:34 AM org.openqa.grid.internal.Registry add    
    INFO: Registered a node http: //192.xx.xx.xx:5566    
    Jul 21, 2017 12:16:34 AM org.openqa.grid.internal.utils.SelfRegisteringRemote registerToHub    
    INFO: The node is registered to the hub and ready to use    
    Jul 21, 2017 12:16:46 AM org.openqa.grid.selenium.proxy.DefaultRemoteProxy onEvent    
    INFO: Marking the node http: //192.xx.xx.xx:5566 as down: cannot reach the node for 2 tries    

Screenshot of Grid Console


Solution

  • Your code that starts the node has issues. Please fix it as below.

    The method nodeConfig() doesn't inject in a server into the SelfRegisteringRemote.

    Here's how it should look like:

    RegistrationRequest req = RegistrationRequest.build(gridNodeConfig);
    SelfRegisteringRemote remote = new SelfRegisteringRemote(req);
    remote.setRemoteServer(new SeleniumServer(gridNodeConfig));
    remote.startRemoteServer();
    remote.startRegistrationProcess();
    

    Also please change your RemoteWebDriver instantiation code to as below

    WebDriver driver = new RemoteWebDriver(new URL("http://" + gridHubConfig.host + ":" + gridHubConfig.port + "/wd/hub"), capability);
    

    Notice that we are connecting to the gridHubConfig host and its port and not that of the node (which is what your code was doing).

    Once you fix these issues, your code should work fine and you should see an embedded Grid spun off via your code.