I have a problem with "reading" an excel file, using testNG, Selenium WebDriver and Java. I've already tried:1. changing .xlsx to .xls (XSSF to HSSF)2. changing excel's data types to Text or to General3. adding ' to my test data
Here is the error message:
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)
Here is my excel-reading 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]);
}
}
and here is my testing 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;
}
}
An error occurs due to test data that does not match with the test method parameter.
Solution:
@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);
}
DataProiver:
@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 with return type 2d array use for executing the same test number of time with different data.
To make it clear,
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);
}
}
Output: