当前位置: 首页 > 知识库问答 >
问题:

Selenium WebDrive, TestNG-数据提供者试图传递2个参数,但方法取3,TestNG无法注入合适的对象

郎伟兆
2023-03-14

我试图从excel工作表中提取数据,并通过web应用程序的登录字段和密码字段中的测试数据,但我遇到了错误。

我得到以下错误:

org.testng.TestNGException: 
The data provider is trying to pass 2 parameters but the method     com.access.Curam#setUp takes 3 and TestNG is unable in inject a suitable object

以下是我保存在属性文件中的xpath:

URL = https://testexample.com
Email = //*[@id='j_username']
Pwd = html/body/div[2]/form/input[2]
Submit = html/body/div[2]/a/span/span/span
WellCometoTestingWorld = //*[@id='app-banner']/div[1]/div/h2

这就是我在excel文件中保存测试数据的方式:

Column1  Column2
UserName Password

以下是我的testng.xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="TestSuite" thread-count="2" parallel="tests" >

<test name="AllTest">

<classes>

<class name="com.Test1.StartTest">

</class>

</classes>

</test>

</suite>

以下是我的代码:

package com.access;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import jxl.Sheet;
import jxl.Workbook;

public class Curam {

    static WebDriver driver;
    Workbook wb;
    Sheet sh1;
    int numrow;
    String username;
    String password;


    @Test(dataProvider = "testdata")
    public void setUp(ArrayList<String> sqldata, String uname, String password1)
            throws InterruptedException, FileNotFoundException, IOException

    {
        System.setProperty("webdriver.chrome.driver", "C:\\Directory\\chromedriver.exe");
        driver = new ChromeDriver();

         Properties obj = new Properties();
         System.out.println("data>>>>>>"+sqldata);
         FileInputStream objfile = new FileInputStream(System.getProperty("user.dir") +"\\src\\com\\access\\Object.Properties");
         obj.load(objfile);
        driver.get(obj.getProperty("URL"));
        driver.manage().window().maximize();
        Thread.sleep(1000);
        driver.findElement(By.xpath(obj.getProperty("Email"))).clear();
        Thread.sleep(1000);
        driver.findElement(By.xpath(obj.getProperty("Email"))).sendKeys(uname);
//      Thread.sleep(1000);
//      driver.findElement(By.xpath("//*[@id='next']")).click();
        Thread.sleep(1000);
        driver.findElement(By.xpath(obj.getProperty("Pwd"))).clear();
        Thread.sleep(1000);
        driver.findElement(By.xpath(obj.getProperty("Pwd"))).sendKeys(password1);
        Thread.sleep(1000);
        driver.findElement(By.xpath(obj.getProperty("Submit"))).click();
        Thread.sleep(1000);
        Assert.assertEquals("Well Come to Testing World", driver.findElement(By.xpath(obj.getProperty("WellCometoTestingWorld"))).getText());
    }

    @DataProvider(name = "testdata")
    public Object[][] TestDataFeed() {

        try {

            // load workbook
            wb = Workbook.getWorkbook(new File("C://File//Book3.xls"));

            // load sheet in my case I am referring to first sheet only
            sh1 = wb.getSheet(0);

            // get number of rows so that we can run loop based on this
            numrow = sh1.getRows();
        } catch (Exception e)

        {
            e.printStackTrace();
        }

        // Create 2 D array and pass row and columns
        Object[][] logindata = new Object[numrow][sh1.getColumns()];

        // This will run a loop and each iteration it will fetch new row
        for (int i = 0; i < numrow; i++) {

            // Fetch first row username
            logindata[i][0] = sh1.getCell(0, i).getContents();
            // Fetch first row password
            logindata[i][1] = sh1.getCell(1, i).getContents();

        }

        // Return 2d array object so that test script can use the same
        return logindata;

    }

}

共有1个答案

何越
2023-03-14

TestNG尝试将测试数据从DataProvider方法(TestDataFeed)注入测试方法(setup)。在数据提供程序方法中,您配置了两列,即用户名和密码。TestNG通过检查二维对象数组来确定它。

当TestNG尝试向setupmethod注入2个参数时,它会看到3个参数,但失败了,所以请修改您的设置方法,如下所示

 public void setUp(String uname, String password1) throws InterruptedException, FileNotFoundException, IOException

希望这有帮助

 类似资料:
  • 我有一个测试班和测试方法。这取决于数据提供程序方法。数据提供程序方法位于不同的类中,而不是测试类或其基类之一。根据TestNG文件 如果要将数据提供程序放在不同的类中,则它需要是静态方法或具有非参数构造函数的类,并且指定可以在dataProviderClass属性中找到它的类 测试类: 数据提供程序类: Eclipse的测试输出: 它似乎不起作用。我正在使用TestNG 6.9.11并尝试从mav

  • Edit1:我有一个Excelutility.java类,可以从中获取单元格数据,并将其传递给我的测试类中的tests方法。 为了从excel文件中读取,我按照以下方式组织了测试方法: 我想做的是: > 从sheet1读取第一行数据,将其传递到test1,继续到test2 从工作表1读取第二行数据,将其传递到test1,继续到test2 并依此类推,具体取决于excel工作表中的行数。 结果是:

  • 我正在使用TestNG和Java运行测试 这是在https://www.tutorialspoint.com/testng/testng_parameterized_test.htm 错误是这样说的:[Utils][ERROR][错误]org.testng.TestNGExc0019:@Test on method addProjectWork需要参数'url',但未在C:\用户\SStaple\

  • 我的要求是对输入文件中给出的数据运行测试。为了实现,我正在使用 请帮助确定我做错了什么。

  • 有人知道TestNG如何根据为测试方法指定的数据提供者名称计算出数据提供者方法是什么吗? 我找到了这个解决方案:https://gist.github.com/ae6rt/3805639 但是,它没有考虑到数据提供者可能是: 在完全不同的类别中定义,或 在父类中定义,并且 该方法可以是静态的,也可以是非静态的 我试图自己破解一些东西,但后来我想我不可能是第一个试图解决这个问题的人,特别是因为显然T

  • 我用TestNG类创建了一个Maven项目。在TestNG。xml我已经给出了套件的名称。我使用了多个浏览器Chrome和Firefox来并行运行。仅使用setup类和一个以上的类就可以了,但是当我使用注释包含多个类时,我会得到一个注入错误,并给出一个错误。 我将提供我尝试过的代码 设置。JAVA 我得到的错误如下: 无法使用[class org.openqa.selenium.remote.De