WiniumDriverを介して電卓を起動するために次のクラスコードを使用しています。 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.Desktop.Driver.exeへのパスを再確認しましたが、それでもWiniumDriverServiceを起動できません。このサービスを開始する他の方法はありますか? winiumはWindows10をサポートしていますか?
ここでの問題は、'startDriver'
はsetupEnvironment
メソッドの前に実行されており、変数service
とoptions
は初期化されていません。したがって、nullポインタ例外をスローしています。
testNG
での実行順序は以下のとおりです。
@BeforeSuite
@BeforeTest
@BeforeClass
@BeforeMethod
@Test
@AfterMethod
@AfterClass
@AfterTest
@AfterSuite
3つの解決策があります。
以下のメソッドのアノテーションを以下のように変更します。そのため、起動ドライバーはセットアップ環境メソッドの後に実行されます。
@BeforeMethod
public void startDriver(){
driver = new WiniumDriver(service,options);
}
@AfterMethod
public void stopDriver(){
driver.close();
}
以下のように注釈を変更します。
@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();
}
以下のように注釈を変更します。これが最適な解決策になると思います。
@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();
}