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");

}