Edge 浏览器中的 Selenium Web 驱动程序测试抛出空指针异常
Selenium web driver test in Edge browser throws null pointer exception
虽然 运行 下面的 Selenium Web driver
测试在 java 中用于 Edge 浏览器,它抛出 null pointer
异常。但是 chrome 浏览器的测试运行成功,有人可以在这里就这个问题提出建议吗?
java.lang.NullPointerException at
payment.tests.BaseTest.beforeMethod(BaseTest.java:33) at
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at
java.lang.reflect.Method.invoke(Unknown Source) at
org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135)
at
org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:64)
at
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(",772 / month*", resultText);
}
}
您的代码中几乎没有问题。
第一个:
这里:
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");
}
虽然 运行 下面的 Selenium Web driver
测试在 java 中用于 Edge 浏览器,它抛出 null pointer
异常。但是 chrome 浏览器的测试运行成功,有人可以在这里就这个问题提出建议吗?
java.lang.NullPointerException at payment.tests.BaseTest.beforeMethod(BaseTest.java:33) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:135) at org.testng.internal.MethodInvocationHelper.invokeMethodConsideringTimeout(MethodInvocationHelper.java:64) at 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(",772 / month*", resultText);
}
}
您的代码中几乎没有问题。
第一个:
这里:
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");
}