我创建了一个硒testNG Webdriver自动化程序,该程序可以从excel表格中获取数据,并将其用于填写某些字段并执行一些任务,

因此,我编写了可以在对任务进行硬编码时成功执行的代码,但是我想避免在@test内进行硬编码和大量重复,因此我在数组列表中注入了要利用@DataProvider元素的代码,

这是代码

package com.mycompany.app;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

import com.excelreader.utility.getDataUtil;

public class testTab2 {
    static WebDriver driver;


    @BeforeTest
    public void beforeTest()
    {
        System.setProperty("webdriver.chrome.driver", "C:\\Browsers drivers\\chromedriver.exe");
        driver = new ChromeDriver();

        driver.get("https://kdp.amazon.com/en_US/title-setup/paperback/new/details?ref_=kdp_BS_D_cr_ti");
        driver.findElement(By.xpath("//*[@id='ap_email']")).sendKeys("email");
        driver.findElement(By.xpath("//*[@id=\'ap_password\']")).sendKeys("password");
        driver.findElement(By.xpath("//*[@id=\"signInSubmit\"]")).click();
    }

    @BeforeMethod
    public void newTab()
    {
        driver.switchTo().newWindow(WindowType.TAB);
        driver.get("https://kdp.amazon.com/en_US/title-setup/paperback/new/details?ref_=kdp_BS_D_cr_ti");

    }

    @Test(dataProvider = "getTestData")
    protected static void testAmazon1(String innerPath, String coverPath, String book_Title, String subtitle,
              String f_Name, String l_Name, String Description, String keyword1, String keyword2,
              String keyword3, String keyword4, String keyword5, String keyword6, String keyword7,
              String category_1, String category_2, String step_1, String step_2, String step_3,
              String step_4, String step_5, String step_6, String step_7, String step_a, String step_b,
              String step_c, String step_d, String step_e, String step_f, String step_g, String step_1final,String step_2final) throws Exception
    {
        //driver = new ChromeDriver();
        Thread.sleep(4000);


        driver.findElement(By.xpath("//button[@id='data-print-book-categories-button-proto-announce']")).click();
        Thread.sleep(2000);



        String[] category_A = new String [7];

        category_A [0] = step_1;
        category_A [1] = step_2;
        category_A [2] = step_3;
        category_A [3] = step_4;
        category_A [4] = step_5;
        category_A [5] = step_6;
        category_A [6] = step_7;

        int i = 0;
        int index=0;
        while (i<=6) {
            if (category_A [i] != "kk") {
                i++;
            } else {
                index=i;
                System.out.println(index);
                break;
            }
        }

        for (int j=0; j<=index-2 ; j++) {

            String expand = driver.findElement(By.xpath("//div[@id='icon-" + category_A [j] + "']")).getAttribute("class");
            System.out.println("expand befor execution is: "+ expand);

            String icon_plus = "icon expand-icon";
            if(expand.equals(icon_plus)) {
                driver.findElement(By.xpath("//div[@id='icon-" + category_A [j] + "']")).click();}
                     else {
                        System.out.println(category_A [j] + " is expanded");
                    }
        }
        driver.findElement(By.xpath("//input[contains(@id,'"+ step_1final +"')]")).click();
        System.out.println("the following checkbox :" + step_1final + "is checked");

    }



      @DataProvider(parallel = false)
      public Iterator<Object[]> getTestData() {
          ArrayList<Object[]> testData = getDataUtil.getDataFromExcel();
          return testData.iterator();

      }

}


但是程序继续运行,直到到达数组,并给我以下消息:

输出量

Starting ChromeDriver 79.0.3945.36 (XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX-refs/branch-heads/XXXX@{#XXX}) on port XXXXX
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
janv. 27, 2020 5:30:51 PM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C


如果有任何解决方案,我需要解决此问题。
非常感谢你。

最佳答案

您没有提供看到的错误消息的详细信息,但是查看您的代码,您可能会收到一条如下所示的错误消息:

org.testng.internal.reflect.MethodMatcherException:
[public void com.rationaleemotions.stackoverflow.qn59935793.DataProviderSample.testMethod(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: testMethod([Parameter{index=0, type=java.lang.String, declaredAnnotations=[]}, Parameter{index=1, type=java.lang.String, declaredAnnotations=[]}])
Arguments: [(java.util.Collections$SingletonList) [a]]


您的测试代码有问题。

您的测试方法具有以下签名:

@Test(dataProvider = "getTestData")
    protected static void testAmazon1(String innerPath, String coverPath, String book_Title, String subtitle,
              String f_Name, String l_Name, String Description, String keyword1, String keyword2,
              String keyword3, String keyword4, String keyword5, String keyword6, String keyword7,
              String category_1, String category_2, String step_1, String step_2, String step_3,
              String step_4, String step_5, String step_6, String step_7, String step_a, String step_b,
              String step_c, String step_d, String step_e, String step_f, String step_g, String step_1final,String step_2final) throws Exception
    {


但是您的数据提供者返回了Iterator<Object[]>

根据数据提供者中的以下代码行

ArrayList<Object[]> testData = getDataUtil.getDataFromExcel();

无法弄清楚getDataFromExcel()方法的确切返回类型是什么。

但是按照您在测试方法中解释的内容,我想您的getDataFromExcel()可能正在返回一个列表,并且您正在尝试将其映射到测试方法中的各个元素。

那行不通。

以下是显示如何直接使用List的示例。

import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class DataProviderSample {
  @DataProvider(name = "dp")
  public Iterator<Object[]> getData() {
    return Arrays.asList(
            new Object[] {Collections.singletonList("a")}, new Object[] {Arrays.asList("x", "y")})
        .iterator();
  }

  @Test(dataProvider = "dp")
  public void testMethod(List<String> data) {
    data.forEach(System.out::println);
  }
}

10-07 19:08
查看更多