如何在Selenium WebDriver中使用相同类中的相同DataProvider从2张相同的Excel中读取数据

时间:2017-07-19 13:15:23

标签: selenium selenium-webdriver testng-dataprovider

我尝试搜索此问题的相关信息,但无法找到。这是一个问题: 同一个excel有2张。我想在同一个类中使用TestNG DataProvider打印两张表中的数据。

Sheet 1中:

用户名 密码

administrator1 password1

administrator2 password2

Sheet 2中:

FirstName LastName

abc def

pqr xyz

String path=<filePath>;
String sheetName;
@Test (dataProvider="loginInfo")
public void loginVerification(String username, String password) throws InterruptedException
{
    sheetName="Sheet1";
    System.out.println("Username:"+username+" "+"Password:"+password);
    System.out.println("************");
}

@Test (dataProvider="loginInfo")
public void userNames(String firstName, String lastName)
{
    sheetName="sheet2";
    System.out.println("FirstName:"+firstName+" LastName:"+lastName);
    System.out.println("*******");
}


@DataProvider(name="loginInfo")
public Object[][] userFormData() throws BiffException, IOException
{
    Object[][] data = testData(path, sheetName);
    return data;
}

public Object[][] testData(String path, String sheetName) throws BiffException, IOException
{
    <code to read excel data>
        }
    }
    return inputData;
}

当我运行代码时,它只是跳过Null指针异常执行。 如果我在开头声明sheetName,就像我对filePath所做的那样,只选择第一张表中的数据。任何有关如何前进的帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

问题是dataProvider在运行测试之前获取数据,但是您在测试中设置了sheetname。因此,在这种情况下,sheetname为null。这就是为什么你得到一个nullpointer。工作表名称将在运行测试后获得值。

因此,如果您想使用相同的数据提供者,无论如何。然后我会在第一次测试后添加表单开关。

所以目前以下代码将如下工作。

  1. 使用sheetName =&#34; Sheet1&#34;
  2. 初始化Dataprovider
  3. 运行loginVerification测试并在测试之后将sheetName值更改为&#34; Sheet2&#34;。
  4. Dataprovider再次为userNames测试启动,但这次工作表名称为Sheet2。
  5. 使用从Sheet2获取的数据运行userNames测试。

    String path=<filePath>;
    String sheetName = "SheetName1";
                @Test (dataProvider="loginInfo")
                public void loginVerification(String username, String password) throws InterruptedException
    {
    
        System.out.println("Username:"+username+" "+"Password:"+password);
        System.out.println("************");
        sheetName="Sheet2";
    }
    
    @Test (dataProvider="loginInfo")
    public void userNames(String firstName, String lastName)
    {
    
        System.out.println("FirstName:"+firstName+" LastName:"+lastName);
        System.out.println("*******");
    }
    
    
    @DataProvider(name="loginInfo")
    public Object[][] userFormData() throws BiffException, IOException
    {
        Object[][] data = testData(path, sheetName);
        return data;
    }
    
    public Object[][] testData(String path, String sheetName) throws BiffException, IOException
    {
        <code to read excel data>
            }
        }
        return inputData;
    }
    

    使用此解决方案,测试容易出错。如果loginVerification测试失败,则表单名称不会更新,它将仍然使用Sheetname1。

    如果他们从不同的工作表中获取数据,我更愿意创建2个不同的数据提供者。