Search code examples
windowsseleniumautomationui-automationdesktop

How to build a winium Driver service on Windows 10?


I am using the following class code for launching calculator via WiniumDriver. Before creating an instance of WiniumDriver, I am starting a winium driver service.

import java.io.File;
import java.io.IOException;

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.winium.DesktopOptions;
import org.openqa.selenium.winium.WiniumDriver;
import org.openqa.selenium.winium.WiniumDriverService;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;

public class CalculatorTest {

    static WiniumDriver driver = null;
    static WiniumDriverService service = null;
    static DesktopOptions options = null;

    @BeforeClass
    public static void setupEnvironment(){
        options = new DesktopOptions(); //Instantiate Winium Desktop Options
        options.setApplicationPath("C:\\Windows\\System32\\calc.exe");
        File driverPath = new File("C:\\Winium\\Winium.Desktop.Driver.exe");
        System.setProperty("webdriver.winium.desktop.driver","C:\\Winium\\Winium.Desktop.Driver.exe");
        service = new WiniumDriverService.Builder().usingDriverExecutable(driverPath).usingPort(9999).withVerbose(true)
                .withSilent(false).buildDesktopService();
        try {
            service.start();
        } catch (IOException e) {
            System.out.println("Exception while starting WINIUM service");
            e.printStackTrace();
        }
    }

    @BeforeTest
    public void startDriver(){
        driver = new WiniumDriver(service,options);
    }

    @AfterTest
    public void stopDriver(){
        driver.close();
    }

    @AfterClass
    public void tearDown(){
        service.stop();
    }

After running the test class as TestNG item, following exception is observed.

FAILED CONFIGURATION: @BeforeTest startDriver
java.lang.NullPointerException
    at org.openqa.selenium.winium.WiniumDriverCommandExecutor.<init>(WiniumDriverCommandExecutor.java:59)
    at org.openqa.selenium.winium.WiniumDriver.<init>(WiniumDriver.java:75)
    at com.bravura.automation.CalculatorTest.startDriver(CalculatorTest.java:41)

I double checked the path to calc.exe and Winium.Desktop.Driver.exe, still I am not able to launch the WiniumDriverService. Is there any other way to start this service? Does winium support windows 10?


Solution

  • The problem here is that, 'startDriver' is executing before setupEnvironment method and the variables service and options are not initialized. Hence it is throwing null pointer exception.

    because the order of execution in testNG is given below.

    @BeforeSuite
    @BeforeTest
    @BeforeClass
    @BeforeMethod
    @Test
    @AfterMethod
    @AfterClass
    @AfterTest
    @AfterSuite
    

    There are three solutions.

    1. change the annotation for the following methods as given below. so that, the start driver will run after the setup environment method.

       @BeforeMethod
       public void startDriver(){
          driver = new WiniumDriver(service,options);
       }
      
      @AfterMethod
      public void stopDriver(){
         driver.close();
      }
      
    2. change the annotations as given below.

      @BeforeTest
      public static void setupEnvironment(){
          options = new DesktopOptions(); //Instantiate Winium Desktop Options
          options.setApplicationPath("C:\\Windows\\System32\\calc.exe");
          File driverPath = new File("C:\\Winium\\Winium.Desktop.Driver.exe");
          System.setProperty("webdriver.winium.desktop.driver","C:\\Winium\\Winium.Desktop.Driver.exe");
          service = new WiniumDriverService.Builder().usingDriverExecutable(driverPath).usingPort(9999).withVerbose(true)
                  .withSilent(false).buildDesktopService();
          try {
              service.start();
          } catch (IOException e) {
              System.out.println("Exception while starting WINIUM service");
              e.printStackTrace();
          }
      }
      
      @BeforeClass
      public void startDriver(){
          driver = new WiniumDriver(service,options);
      }
      
      @AfterClass
      public void stopDriver(){
          driver.close();
      }
      
      @AfterTest
      public void tearDown(){
          service.stop();
      }
      
    3. change the annotations as given below. I believe, this one will be optimal solution.

      @BeforeTest
      public static void setupEnvironment(){
          options = new DesktopOptions(); //Instantiate Winium Desktop Options
          options.setApplicationPath("C:\\Windows\\System32\\calc.exe");
          File driverPath = new File("C:\\Winium\\Winium.Desktop.Driver.exe");
          System.setProperty("webdriver.winium.desktop.driver","C:\\Winium\\Winium.Desktop.Driver.exe");
          service = new WiniumDriverService.Builder().usingDriverExecutable(driverPath).usingPort(9999).withVerbose(true)
                  .withSilent(false).buildDesktopService();
          try {
              service.start();
          } catch (IOException e) {
              System.out.println("Exception while starting WINIUM service");
              e.printStackTrace();
          }
      }
      
      @BeforeMethod
      public void startDriver(){
          driver = new WiniumDriver(service,options);
      }
      
      @AfterMethod
      public void stopDriver(){
          driver.close();
      }
      
      @AfterTest
      public void tearDown(){
          service.stop();
      }