在针对Edge浏览器的Java中运行以下Selenium Web driver
测试时,它会抛出null pointer
异常。但是该测试在chrome浏览器上成功运行了,有人可以在这里提出问题的建议吗?
java.lang.NullPointerException在 payment.tests.BaseTest.beforeMethod(BaseTest.java:33)在 sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源)位于 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知源)位于 java.lang.reflect.Method.invoke(来源未知) org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135) 在 org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:64) 在 org.testng.internal.ConfigInvoker.invokeConfigurationMethod(ConfigInvoker.java:364)
testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" thread-count="1" parallel="tests" >
<test name="RepayCalculatorTestChrome">
<parameter name="browser" value="Chrome" />
<packages>
<package name="payment.tests" />
</packages>
</test>
<test name="RepayCalculatorTestEdge">
<parameter name="browser" value="Edge" />
<packages>
<package name="payment.tests"/>
</packages>
</test>
</suite>
BaseTest.java
public class BaseTest {
public WebDriver driver;
public EdgeDriver edgeDriver;
@BeforeMethod
@Parameters("browser")
public void beforeMethod(String browser) {
//Check if parameter passed from TestNG is 'Edge'
String localDir = System.getProperty("user.dir");
if(browser.equalsIgnoreCase("edge")){
//set path to msedgedriver.exe
System.setProperty("webdriver.edge.driver",localDir + "\\resources\\msedgedriver.exe");
System.out.println("Edge Driver started...");
edgeDriver.manage().window().maximize();
edgeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
edgeDriver.get("test_url_here");
}
//Check if parameter passed from Testng is 'chrome'
else if(browser.equalsIgnoreCase("chrome")){
//set path to chromedriver.exe
System.setProperty("webdriver.chrome.driver",localDir + "\\resources\\chromedriver.exe");
System.out.println("Chrome Driver started...");
ChromeOptions options = new ChromeOptions();
//options.addArguments("--headless");
driver = new ChromeDriver(options);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("test_url_here");
}
}
@AfterMethod
public void tearDown() {
if (driver != null || edgeDriver !=null) {
driver.quit();
System.out.println("Driver get instantiated. Quitting..");
} else {
System.out.println("Driver is null so nothing to do");
}
}
}
RepayCalculatorTest.java
public class RepayCalculatorTest extends BaseTest {
String borrowAmount = "750000";
String interestAmount = "2";
String loanTerm = "30";
@Test(enabled = true)
public void loanRepayCalculator() throws InterruptedException {
RepayCalculatorPage repayCalculator = new RepayCalculatorPage(driver);
repayCalculator.setBorrowAmount(borrowAmount);
WebElement webElement1 = driver.findElement(By.xpath("//input[@placeholder='Enter interest rate']"));
webElement1.clear();
repaymentCalculator.setInterestAmount(interestAmount);
WebElement webElement2= driver.findElement(By.xpath("//input[@placeholder='Enter loan term']"));
webElement2.clear();
repaymentCalculator.setLoanTerm(loanTerm);
repaymentCalculator.getCalculateLoanPaymentBtn();
//driver.manage().timeouts().implicitlyWait(7, TimeUnit.SECONDS);
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement resultElement = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@id='calculatedresult']//div[@class='_3Kmts']//div[@class='ant-row _2kHnl']//div[contains(@class,'z-k7K ant-col-xs-24')]//p[@class='_3TRls _2fRgA']")));
String resultText = resultElement.getText();
System.out.println("EMI amount:"+resultText);
Assert.assertEquals("$2,772 / month*", resultText);
}
}
答案 0 :(得分:1)
您的代码中几乎没有问题。
第一
这里:
if(browser.equalsIgnoreCase("edge")){
//set path to msedgedriver.exe
System.setProperty("webdriver.edge.driver",localDir + "\\resources\\msedgedriver.exe");
System.out.println("Edge Driver started...");
edgeDriver.manage().window().maximize();
edgeDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
edgeDriver.get("test_url_here");
}
您致电edgeDriver.manage()
,但是edgeDriver
字段尚未初始化。
第二:
即使您使用edgeDriver
字段初始化来修复错误,也是如此。您的测试适用于driver
字段。当您将其用于Chrome浏览器时,请初始化driver
字段,以便您的测试正常进行。
为Edge运行代码时,代码将初始化edgeDriver
,而使driver
字段引用null
。由于您的测试使用的是driver
字段,而该字段仍然指向null
,因此您得到NullPointerException
。
此代码应更好地工作:
@BeforeMethod
@Parameters("browser")
public void beforeMethod(String browser) {
//Check if parameter passed from TestNG is 'Edge'
String localDir = System.getProperty("user.dir");
if(browser.equalsIgnoreCase("edge")){
//set path to msedgedriver.exe
System.setProperty("webdriver.edge.driver",localDir + "\\resources\\msedgedriver.exe");
System.out.println("Edge Driver started...");
driver = new EdgeDriver();
}
//Check if parameter passed from Testng is 'chrome'
else if(browser.equalsIgnoreCase("chrome")){
//set path to chromedriver.exe
System.setProperty("webdriver.chrome.driver",localDir + "\\resources\\chromedriver.exe");
System.out.println("Chrome Driver started...");
ChromeOptions options = new ChromeOptions();
//options.addArguments("--headless");
driver = new ChromeDriver(options);
}
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
driver.get("test_url_here");
}