代码之家  ›  专栏  ›  技术社区  ›  Manmohan_singh

如何在Windows 10上构建winium驱动程序服务?

  •  7
  • Manmohan_singh  · 技术社区  · 7 年前

    我使用下面的类代码通过WiniumDriver启动calculator。在创建WiniumDriver实例之前,我正在启动winium驱动程序服务。

    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();
        }
    

    在将测试类作为TestNG项运行之后,观察到以下异常。

    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)
    

    我仔细检查了calc.exe和Winium的路径。桌面驾驶员exe,我仍然无法启动WiniumDriversService。是否有其他方法启动此服务?winium是否支持windows 10?

    2 回复  |  直到 7 年前
        1
  •  7
  •   Murthi    7 年前

    问题是, 'startDriver' 之前正在执行 setupEnvironment 方法和变量 service options 未初始化。因此,它会引发空指针异常。

    因为执行顺序 testNG 如下所示。

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

    有三种解决方案。

    1. 更改以下方法的注释,如下所示。因此,启动驱动程序将在setup environment方法之后运行。

       @BeforeMethod
       public void startDriver(){
          driver = new WiniumDriver(service,options);
       }
      
      @AfterMethod
      public void stopDriver(){
         driver.close();
      }
      
    2. 更改注释,如下所示。

      @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. 更改注释,如下所示。我相信,这将是最佳的解决方案。

      @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();
      }
      
        2
  •  0
  •   Tarun Goswami    3 年前
    1. 以下是正确的使用方法
    public class SimpleTest
    {
        DesktopOptions options;
        WiniumDriverService service;
        WiniumDriver driver;
    
        @BeforeTest
        public void bt()
        {
            //Instantiate Winium Desktop Options
            options = new DesktopOptions();
            
            // Path of application you want to run and test
            options.setApplicationPath("C:\\Windows\\System32\\calc.exe");
            
            //Path for Winium Desktop Driver
            File driverPath = new File(System.getProperty("user.dir")+File.separator+"drivers"+File.separator+"Winium.Desktop.Driver.exe");
            
            //Port is 9999, you can change it
            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();
            }
            driver = new WiniumDriver(service,options);
        }
    
        @AfterTest
        public void at()
        {
            service.stop();
        }
    }
    
    1. 如果需要其他配置,可以参考 this link . 然而,我不建议您使用Winium for Windows automation,即使对于基本的计算器程序,它也不会正常工作,Winium的上一个版本是在2016年,我认为现在不会定期维护它。取而代之的是使用WinAppDriver,这是一种更好的工具,并且有很好的文档。以参考开始 this link