【问题标题】:Selenium web driver test in Edge browser throws null pointer exceptionEdge 浏览器中的 Selenium Web 驱动程序测试引发空指针异常
【发布时间】:2020-08-27 01:57:24
【问题描述】:

在 Java 中为 Edge 浏览器运行以下 Selenium Web driver 测试时,它会引发 null pointer 异常。但是chrome浏览器的测试运行成功,有人可以在这里指教一下这个问题吗?

java.lang.NullPointerException 在 payment.tests.BaseTest.beforeMethod(BaseTest.java:33) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at 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);
    }

}

【问题讨论】:

  • 我已经在 BaseTest.java 中初始化了public EdgeDriver edgeDriver = null;。但仍然是它的抛出错误。
  • @arundeepchohan 我已经初始化了 public EdgeDriver edgeDriver = null;在 BaseTest.java 中。但仍然得到错误并且没有区别
  • @arundeepchohan 我已经设置了一个断点,我在 BaseTest > 边缘情况下得到边缘浏览器空值
  • 公共静态 WebDriver 驱动程序;尝试换成这个。

标签: java selenium-webdriver testng


【解决方案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");

}

【讨论】:

  • Alexey R ,非常感谢,我发现最后一天我的测试运行成功。感谢您的详细回答。赞成并接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多