【问题标题】:DataProvider using TestNG,Java and InteliJ IdeaTestNG、Java 和 IntelliJ Idea 中的 DataProvider
【发布时间】:2021-03-04 10:58:32
【问题描述】:

我已经使用 DataProvider 实现了简单的 Login selenium 框架。 我创建了一个包含用户名和密码的简单登录页面。我还创建了带有登录数据和 excel 阅读器类的 excel 文件。似乎我的测试类中的 DataProvider 错误。 我得到信息“java.lang.NullPointerException”。我知道DataProvider中的String有问题,但如果我改为Object,问题仍然如上。

这是我的测试代码:

package com.insurance.testCases;

import com.insurance.pageObjects.loginPage;
import com.insurance.utilities.excelReader;
import org.openqa.selenium.NoAlertPresentException;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import java.io.IOException;

public class TC_LoginDdt_002 extends baseClass{

    @Test(dataProvider = "loginData")
    public void loginDDT(String user,String pwd){

        driver.get(baseUrl);

        loginPage lp=new loginPage(driver);
        lp.setUserName(user);
        lp.setPassword(pwd);
        lp.clickSubmit();

        if (isAlertPresent()==true){
            driver.switchTo().alert().accept();
            driver.switchTo().defaultContent();
            Assert.assertTrue(false);
        }
        else {
            Assert.assertTrue(true);
            lp.clickLogout();
            driver.switchTo().alert().accept();
            driver.switchTo().defaultContent();
        }

    }
    public boolean isAlertPresent(){
        try {
            driver.switchTo().alert();
            return true;
        }
        catch (NoAlertPresentException e){
            return false;
        }
    }

    @DataProvider(name="loginData")
    String [][] getData() throws IOException {

        String path="C:/Users/lachi/IdeaProjects/InetBanking_v1/target/DataSet.xls";


        int rownum = excelReader.getRowCount(path,"DataSet");
        int colcount = excelReader.getCellCount(path,"DataSet",1);

        String logindata[][]=new String[rownum][colcount];

        for (int i=1;i<=rownum;i++){

            for (int j=0;j<colcount;j++){

                logindata[i-1][j]=excelReader.getCellData(path,"DataSet",i,j);
            }
        }
        return logindata;

    }
}

以下例外:

java.lang.NullPointerException
    at com.insurance.testCases.TC_LoginDdt_002.loginDDT(TC_LoginDdt_002.java:17)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:109)

基类:

package com.insurance.testCases;

import com.insurance.utilities.Log;
import com.insurance.utilities.readConfig;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.junit.After;
import org.junit.Before;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.testng.annotations.Parameters;

import java.util.concurrent.TimeUnit;

public class baseClass {
    readConfig readconfig = new readConfig();

    public String baseUrl = readconfig.getApplicationUrl();
    public String username = readconfig.getUsername();
    public String password = readconfig.getPassword();
    public static WebDriver driver;

    public static Logger logger;

    @Parameters("browser")
    @Before
    public void SetUp(){

        Log.startLog("Test is Starting");
        logger = Logger.getLogger("einsurance");

        System.setProperty("webdriver.chrome.driver","Drivers/chromedriver.exe");
        driver = new ChromeDriver();


        //System.setProperty("webdriver.edge.driver","Drivers/msedgedriver.exe");
       // driver = new EdgeDriver();

        driver.manage().window().maximize();
        driver.manage().deleteAllCookies();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }

    @After
    public void tearDown(){
        Log.endLog("Test is Ending!");

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
        }
        driver.quit();
    }
    public String randomestring(){
        String generatedstring = RandomStringUtils.randomAlphanumeric(20);
        return (generatedstring);
    }
    public static String randomeNum(){
        String generatestring2 = RandomStringUtils.randomNumeric(8);
        return (generatestring2);
    }
}

【问题讨论】:

  • 对不起,我忘了提供结果:java.lang.NullPointerException
  • 添加总异常跟踪以查看其抛出的位置或哪一行。还提供baseClass
  • 请根据stacktrace提及导致异常的语句。
  • 我添加了基类和异常

标签: java selenium intellij-idea testng testng-dataprovider


【解决方案1】:

问题的根本原因在于您的基类。

  1. 您正在通过BeforeAfter 提供的单元初始化/清理WebDriver 对象。
  2. TestNG 无法识别 JUnit 设置和拆卸注释

要解决这个问题,你需要做的就是使用

  • 而不是Before 使用org.testng.annotations.BeforeClass(或)BeforeMethod
  • 而不是After 使用org.testng.annotations.AfterClass(或)AfterMethod

【讨论】:

    【解决方案2】:

    根据 TC_LoginDdt_002 第 17 行的 NPE,我怀疑您的 baseUrl 似乎为空。在调试模式下运行以确保您的 public String baseUrl = readconfig.getApplicationUrl(); 实际上正在检索 baseUrl 并将其初始化为您想要的 URL

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多