在 Selenium 中从数据提供者 class 传递值时出现 'argument type mismatch' 错误

Getting 'argument type mismatch' error while passing values from a dataprovider class in Selenium

我在尝试使用@dataprovider class 将来自 excel sheet 的少数值传递给页面对象 [=45] 中的少数方法时遇到 'argument type mismatch' 错误=].依次在@test class 中调用这些方法。你能帮我解决这个问题吗?下面已经提到了代码。

数据提供者

@DataProvider(name="ProductInfo")
  public static Object[][] productInfoDataprovider() throws Throwable {
    
   File file = new File("C:/Users/chetan.k.thimmanna/Documents/Selenium/Resources/QAToolsECommerce/ECommerce_Data.xlsx");
   FileInputStream fis = new FileInputStream(file);
   XSSFWorkbook wb = new XSSFWorkbook(fis);
   XSSFSheet sheet = wb.getSheet("Sheet1");
   int lastRowNum = sheet.getLastRowNum();
   Object[][] obj = new Object[lastRowNum][5];
   for(int i=0; i<lastRowNum; i++){
    
    XSSFRow row = sheet.getRow(i+1);
    obj[i][0]= row.getCell(0).getNumericCellValue();
    obj[i][1]= row.getCell(1).getStringCellValue();
    obj[i][2]= row.getCell(2).getNumericCellValue();
    obj[i][3]= row.getCell(3).getStringCellValue();
    obj[i][4]= row.getCell(4).getStringCellValue();
   }
  fis.close();
   return obj;
  }

页面对象

public class QaToolsECommercePageObjects {
 
 WebDriver driver;
 
 /*Method to launch the browser and select the browser type */
 public void setBrowser(int browser){
  
  if(browser == '1'){
   driver = new FirefoxDriver();
  }else if(browser == '2'){
   System.setProperty("webdriver.chrome.driver", "C:/Users/chetan.k.thimmanna/Documents/Selenium/Resources/chromedriver.exe");
   driver = new ChromeDriver();
  }else if(browser == '3'){
   System.setProperty("webdriver.ie.driver", "C:/Users/chetan.k.thimmanna/Documents/Selenium/Resources/IEDriverServer.exe");
   driver = new InternetExplorerDriver();
  }
  //Maximize the window
  driver.manage().window().maximize();
  
  driver.get("http://store.demoqa.com/");
  //driver.get("http://toolsqa.com/");
  
  //browser load time
  driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
 }



 
 /* Searches the product required to purchase */
 public void searchProduct(String product){
  
  driver.findElement(By.name("s")).sendKeys(product);
  driver.findElement(By.name("s")).sendKeys(Keys.ENTER);
  //driver.findElement(By.linkText("Product Category")).click(); 
 }
 

 
 /* Verifies the product name in the product search result and adds the product to the cart*/
 public void productVerify(String product){
  
  String productValue = driver.findElement(By.id("grid_view_products_page_container")).getText();
  boolean val = productValue.contains(product); //Value from excel sheet
  if(val == true){
   
   System.out.println("The product searched is found :" +productValue);
   //Click on add to cart  
   driver.findElement(By.name("Buy")).click();
   //Click on Go to check out
   driver.findElement(By.className("go_to_checkout")).click(); 
  }else
  {
   System.out.println(" The product searched is not found :" +productValue);
  }
  
 }
 
 
 /* Verifies the product name, quantity, price and total price of the product */
 
 public void checkoutCartVerify(String product, int quantity, String prices, String totalPrices){
  
  WebElement cartTable = driver.findElement(By.className("checkout_cart"));
  List<WebElement> cartRows = cartTable.findElements(By.tagName("tr"));
  
  //Product name
  WebElement prodRow = cartRows.get(1);
  List<WebElement> prodCols = prodRow.findElements(By.tagName("td"));
  WebElement prodName = prodCols.get(1);
  String oriProdName = prodName.findElement(By.tagName("a")).getText();
  
  //Comparing product name 
  if(oriProdName.equals(product)){
   System.out.println("The Product searched and added to the cart is correct: "+oriProdName);
  }else
  {
   System.out.println("The product searched and added to the cart is incorrect: "+oriProdName);
  }
  
  
  //Quantity
  WebElement quantityCombo = prodCols.get(2).findElement(By.tagName("form"));
  List<WebElement> quantityVals = quantityCombo.findElements(By.tagName("input"));
  String prodQuantity = quantityVals.get(0).getAttribute("value");
  int pq = Integer.parseInt(prodQuantity);
  //Comparing product quantity 
  if(pq == quantity){
   System.out.println("The Product quantity added to the cart is correct: "+pq);
  }else
  {
   System.out.println("The product quantity added to the cart is incorrect: "+pq);
  }
  
  //Price
  String price = prodCols.get(3).getText();
  String[] priceSplit = price.split("\.");
  String prodPrice = priceSplit[0];
  String priceFrac = priceSplit[1];
  System.out.println(price);
  
  
  //Comparing price of the quantity 
  if(priceFrac.equals("00")){
   if(prodPrice.equals(prices)){
    System.out.println("The Product price added to the cart is correct: "+prodPrice);
   }else{
    System.out.println("The product price added to the cart is incorrect: "+prodPrice);
   }
   
  }else
  {
   if(price.equals(prices)){
    System.out.println("The Product price added to the cart is correct: "+price);
   }else{
    System.out.println("The product price added to the cart is incorrect: "+price);
   }
   
  }
  
  //Total Price
  String totalPrice = prodCols.get(4).getText();
  String[] totalpriceSplit = totalPrice.split("\.");
  String prodTotalprice = totalpriceSplit[0];
  String prodpriceFrac = totalpriceSplit[1];
  System.out.println(totalPrice);
  
  //Comparing Total Price of the quantity
  if(prodpriceFrac.equals("00")){
   if(prodTotalprice.equals(totalPrices)){
    System.out.println("The Product Total price added to the cart is correct: "+prodTotalprice);
   }else{
    System.out.println("The product Total price added to the cart is incorrect: "+prodTotalprice);
   }
  }else
  {
   if(totalPrice.equals(totalPrices)){
    System.out.println("The Product Total price added to the cart is correct: "+totalPrice);
   }else{
    System.out.println("The product Total price added to the cart is incorrect: "+totalPrice);
   }
  }
  
 }

测试Class

public class QaToolsECommerceTest {
  @Test(dataProvider = "ProductInfo", dataProviderClass = QaToolsECommerceDataProvider.class)
  
  public void eCommerceProduct(int browser, String product, int quantity, String prices, String totalPrices) {
   QaToolsECommercePageObjects qaEpo = new QaToolsECommercePageObjects();
   
   qaEpo.setBrowser(browser);
   qaEpo.searchProduct(product);
   qaEpo.productVerify(product);
   qaEpo.checkoutCartVerify(product, quantity, prices, totalPrices);

  }

}

错误:

FAILED: eCommerceProduct(2.0, "Magic Mouse", 1.0, "0", "0") java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source)

FAILED: eCommerceProduct(2.0, "Magic Mouse", 1.0, "0", "0") java.lang.IllegalArgumentException: argument type mismatch

实际上,在方法 eCommerceProduct() 中,您期望参数为 intStringintStringString 而实际参数作为 doubleStringdoubleStringString 传递。

因此,您应该将方法 eCommerceProduct() 更改为预期参数:-

public void eCommerceProduct(double browser, String product, double quantity, String prices, String totalPrices) {
   -------
   -------
}

已编辑:-

Running: C:\Users\chetan.k.thimmanna\AppData\Local\Temp\testng-eclips‌​e--1620381105\testng‌​-customsuite.xml 1 FAILED: eCommerceProduct(2, "Magic Mouse", 1, "0", "0") java.lang.NullPointerException at qaToolsECommerceExcel.QaToolsECommercePageObjects.setBrowser‌​(QaToolsECommercePag‌​eObjects.java:42)

发生此错误是因为您在 eCommerceProduct() 方法中调用 QaToolsECommercePageObjects.setBrowser(browser); 并将 browser 值传递给 intdouble 而在 QaToolsECommercePageObjects.setBrowser(int browser) 你正在比较它的方法,因为 if(browser == '1') 在字符串中的意思是错误的。

你应该修改你的 QaToolsECommercePageObjects.setBrowser(int browser) 方法如下:-

public class QaToolsECommercePageObjects {

  WebDriver driver;

  public void setBrowser(int browser){
        WebDriver driver
        if(browser == 1){
            driver = new FirefoxDriver();
        }else if(browser == 2){
            System.setProperty("webdriver.chrome.driver", "C:/Users/chetan.k.thimmanna/Documents/Selenium/Resources/chromedriver.exe");
            driver = new ChromeDriver();
        }else if(browser == 3){
            System.setProperty("webdriver.ie.driver", "C:/Users/chetan.k.thimmanna/Documents/Selenium/Resources/IEDriverServer.exe");
            driver = new InternetExplorerDriver();
        }
        //Maximize the window
        driver.manage().window().maximize();

        driver.get("http://store.demoqa.com/");
        //driver.get("http://toolsqa.com/");

        //browser load time
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }
 -----
 -----
}

在您的数据提供程序函数 productInfoDataprovider() 中,您有

  obj[i][0]= row.getCell(0).getNumericCellValue();
  obj[i][2]= row.getCell(2).getNumericCellValue();

getNumericCellValue() 的 return 参数为双精度,因此您得到的参数类型不匹配。

使用

将其类型转换为 int
  obj[i][0]= (int)row.getCell(0).getNumericCellValue();
  obj[i][2]= (int)row.getCell(2).getNumericCellValue();

当你启动浏览器时,你写了"else if(browser == '2')"。在这里您期望 2 作为字符,但您正在证明数据为 int/Double。尝试

else if(browser == 2 )

在此之前,将浏览器变量的双精度值转换为整数。