java - Selenium 与 TestNG 和 Java 中的数据提供程序不匹配错误 | org.testng.internal.reflect.MethodMatcherException

标签 java selenium selenium-webdriver testng testng-dataprovider

我在使用 testNG、Selenium WebDriver 和 Java“读取”Excel 文件时遇到问题。我已经尝试过: 1.将.xlsx更改为.xls(XSSF更改为HSSF) 2.将Excel的数据类型更改为文本或常规 3. 将 ' 添加到我的测试数据

这是错误消息:

org.testng.internal.reflect.MethodMatcherException: 
    [public void com.travelers.tests.SearchHotelTest.searchHotelTest(java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String,java.lang.String)] has no parameters defined but was found to be using a data provider (either explicitly specified or inherited from class level annotation).
    Data provider mismatch
    Method: searchHotelTest([Parameter{index=0, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=1, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=2, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=3, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=4, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=5, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=6, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=7, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=8, type=java.lang.String, declaredAnnotations=[]}])
    Arguments: [(java.lang.String) Dubai,(java.lang.String) test,(java.lang.String) test,(java.lang.String) Jumeirah Beach Hotel,(java.lang.String) test,(java.lang.String) Oasis Beach Tower,(java.lang.String) test,(java.lang.String) Rose Rayhaan Rotana,(java.lang.String) test,(java.lang.String) test,(java.lang.String) test]

        at org.testng.internal.reflect.DataProviderMethodMatcher.getConformingArguments(DataProviderMethodMatcher.java:43)
        at org.testng.internal.Parameters.injectParameters(Parameters.java:909)
        at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:34)
        at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:816)
        at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)
        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1507)
        at org.testng.TestRunner.privateRun(TestRunner.java:766)
        at org.testng.TestRunner.run(TestRunner.java:587)
        at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)
        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)
        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)
        at org.testng.SuiteRunner.run(SuiteRunner.java:286)
        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)
        at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)
        at org.testng.TestNG.runSuites(TestNG.java:1039)
        at org.testng.TestNG.run(TestNG.java:1007)
        at com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
        at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:110)

这是我的 Excel 阅读类(class):

package com.travelers.helpers;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;

public class ExcelHelper {

    public static Object[][] readExcelFile(File file) throws IOException {

        InputStream inputStream = new FileInputStream(file);
        XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0);
        int rowNumbers = sheet.getLastRowNum();
        int colNumbers = sheet.getRow(0).getLastCellNum();
        String[][] data = new String[rowNumbers][colNumbers];

        for(int i=0;i<rowNumbers;i++) {
            Row row = sheet.getRow(i+1);
            for(int j=0;j<row.getLastCellNum();j++) {
                data[i][j] = row.getCell(j).getStringCellValue();
            }
        }

        return data;

    }

    public static void main(String[] args) throws IOException {
        Object[][] data = readExcelFile(new File("src//main//resources//files//Dane.xlsx"));
        System.out.println(data[0][0]);
        System.out.println(data[0][1]);
    }

}

这是我的测试类(class):

package com.travelers.tests;

import com.travelers.helpers.ExcelHelper;
import com.travelers.helpers.TestListener;
import com.travelers.pages.HomePage;
import com.travelers.pages.ResultPage;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Listeners;
import org.testng.annotations.Test;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Listeners(TestListener.class)
public class SearchHotelTest extends BaseSeleniumTest {

    @Test(dataProvider = "getData")
    public void searchHotelTest(String city, String checkInDate, String checkOutDate, String fHotel, String fPrice, String sHotel, String sPrice, String tHotel, String tPrice) {
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
        driver.get("http://www.kurs-selenium.pl/demo/");
        HomePage homePage = new HomePage(driver);
        homePage.setCityHotel(city);
        homePage.setDateRange(checkInDate, checkOutDate);
        homePage.openTravellersModal();
        homePage.addAdult();
        homePage.addChild();
        homePage.performSearch();

        ResultPage resultPage = new ResultPage(driver);

        List<String> hotelNames = resultPage.getHotelNames();

        //SeleniumHelper.takeScreenshot(driver);

        //Assert.assertEquals("Jumeirah Beach Hotel",hotelNames.get(0));
        Assert.assertEquals(fHotel, hotelNames.get(0));
        Assert.assertEquals(sHotel, hotelNames.get(1));
        Assert.assertEquals(tHotel, hotelNames.get(2));
        //Assert.assertEquals(hotelNames.get(3),"Hyatt Regency Perth");

        List<String> prices = resultPage.getHotelPrices();
        Assert.assertEquals(prices.get(0),fPrice);
        Assert.assertEquals(prices.get(1),sPrice);
        Assert.assertEquals(prices.get(2),tPrice);
        //Assert.assertEquals(prices.get(3),"$151");
    }

    @DataProvider
    public Object[][] getData() {
        Object[][] data = null;
        try {
            data = ExcelHelper.readExcelFile(new File("src//main//resources//files//Dane.xlsx"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }
}

最佳答案

测试数据与测试方法参数不匹配导致错误。

解决方案:

@Test(dataProvider = "getData")
    public void searchHotelTest(String city, String checkInDate, String checkOutDate, String fHotel, String fPrice,
            String sHotel, String sPrice, String tHotel, String tPrice) {

        System.out.println("City:" + city);
    }

数据提供者:

@DataProvider
    public Object[][] getData() {
        Object[][] data = null;

        String city = "Bilimora";
        String checkInDate = "checkInDate";
        String checkOutDate = "checkOutDate";
        String fHotel = "fHotel";
        String fPrice = "fPrice";
        String sHotel = "sHotel";
        String sPrice = "sPrice";
        String tHotel = "tHotel";
        String tPrice = "tPrice";
        data = new Object[][] { { city, checkInDate, checkOutDate, fHotel, fPrice, sHotel, sPrice, tHotel, tPrice } };
        return data;
    }

返回类型为二维数组的 DataProvider 用于使用不同的数据执行相同的测试次数。

为了说清楚,

public class DP
{
 @DataProvider (name = "data-provider")
 public Object[][] dpMethod(){
 return new Object[][] {{"First-Value"}, {"Second-Value"}};
 }

    @Test (dataProvider = "data-provider")
    public void myTest (String val) {
        System.out.println("Passed Parameter Is : " + val);
    }
}

输出:

PASSED: myTest("First-Value")
PASSED: myTest("Second-Value")

关于java - Selenium 与 TestNG 和 Java 中的数据提供程序不匹配错误 | org.testng.internal.reflect.MethodMatcherException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62334674/

相关文章:

java - 如何抑制服务器端记录冒泡到客户端的 EJBException?

java - Selenium Web 驱动程序 Java 代码无法从存储在包文件夹下的 src 文件夹中的 "Object.Properties"文件中读取 xpath/Class id/link id

java - 使用先前使用 Selenium 2 选择器选择的 Jquery 选择元素

java - 如何使用带有 selenium webdriver 的 Windows 文件资源管理器选择多个文件

java - Java程序构建

java - 将 Apache Camel 执行器指标发送到 Prometheus

java - 从 SQL 插入查询字符串中提取带引号的值

javascript - 如何在 Java 中使用 Selenium 访问弹出元素

javascript - 使用 Selenium 和 python 抓取 javascript 生成的内容时出现问题

java - 如何使用 UIAutomator 查看器在 Android 应用程序中查找 ID