Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用不同的csv行循环此测试?_Java_Selenium_Testng - Fatal编程技术网

Java 如何使用不同的csv行循环此测试?

Java 如何使用不同的csv行循环此测试?,java,selenium,testng,Java,Selenium,Testng,我是硒测试的初学者。我写了这段代码,它可以工作,但我需要用另一个csv行循环这个测试 我花了将近10个小时来做这件事 我正在尝试做的场景: web浏览器正在打开“转到url” 从第一行使用CSV文件中的数据登录 驱动程序正在重新启动,并使用csv文件第二行中的数据执行相同操作 我还尝试用aftermethod/afterclass重新启动测试,但它不起作用 public class CSVdataread { private WebDriver driver; String ba

我是硒测试的初学者。我写了这段代码,它可以工作,但我需要用另一个csv行循环这个测试

我花了将近10个小时来做这件事

我正在尝试做的场景:

  • web浏览器正在打开“转到url”

  • 从第一行使用CSV文件中的数据登录

  • 驱动程序正在重新启动,并使用csv文件第二行中的数据执行相同操作

  • 我还尝试用aftermethod/afterclass重新启动测试,但它不起作用

    public class CSVdataread {
        private WebDriver driver;
        String baseUrl = "URL";
        String CSV_file = "C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv";
    
        @BeforeClass
        public void openBrowser() {
            System.setProperty("webdriver.chrome.driver", "C:\\Users\\xxxxxxxxxxxx\\Desktop\\webdriver\\chromedriver.exe");
            driver = new ChromeDriver();
            driver.navigate().to("URL");
            driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        }
    
        @Test
        public void verify_Search() throws InterruptedException, IOException {
            CSVReader reader = new CSVReader(new FileReader(CSV_file));
            String[] cell;
    
            while((cell = reader.readNext()) != null) 
                for (int i = 0; i < 1; i++) {
                    String name = cell[i];
                    String email = cell[i + 1];
                    String baseUrl = "http://xxxxx.xxx/xxxx/";
                    driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
                    driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
                    {
                        driver.quit();
                    }
                }
            }
        } 
    
    公共类CSVdataread{
    私有网络驱动程序;
    字符串baseUrl=“URL”;
    字符串CSV\u file=“C:\\Users\\xxxxxxxxxx\\Desktop\\TestData.CSV”;
    @课前
    public void openBrowser(){
    System.setProperty(“webdriver.chrome.driver”,“C:\\Users\\xxxxxxxxxxx\\Desktop\\webdriver\\chromedriver.exe”);
    驱动程序=新的ChromeDriver();
    driver.navigate()指向(“URL”);
    driver.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
    }
    @试验
    public void verify_Search()引发InterruptedException,IOException{
    CSVReader reader=新CSVReader(新文件读取器(CSV_文件));
    字符串[]单元格;
    while((cell=reader.readNext())!=null)
    对于(int i=0;i<1;i++){
    字符串名称=单元格[i];
    字符串email=cell[i+1];
    字符串baseUrl=”http://xxxxx.xxx/xxxx/";
    findelelement(By.xpath(“//input[@id='useridFormField-inputEl']”);
    findElement(By.xpath(“//input[@id='userpasswordFormField-inputEl']”);
    {
    driver.quit();
    }
    }
    }
    } 
    
    您的while循环看起来已断开。while循环中的for循环似乎打乱了登录过程

    while((cell = reader.readNext())!=null) { // iterate through csv file
      String name = cell[0]; // cell is current row, you need first column for name
      String email = cell[1]; // second column for email (as password?)
      // what do you want to do with baseUrl here?
    
      driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
      driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
    
      // you need to check the successful login here
      // then logout and open main page
      // do not quit before you are finished 
    }
    
    // quit after the loop is finished
    driver.quit();
    
    没有任何网站的知识,它是不可能告诉你如何检查成功登录和执行注销


    我可以建议你花点精力学习一项不太复杂的任务的诀窍吗?您似乎在使用基本Java元素时遇到了很多问题。永远不要停止学习。

    看起来您想用一组测试数据重复测试。在这种情况下,您应该使用TestNG特性


    JUnit4解决方案。这将是一个巨大的

    首先,让我们从
    CSVReader
    和一些良好实践以及代码可读性开始。在测试中,您读取CSV数据并在测试中使用它们。读取数据不是测试的责任。测试应该已经提供了所有数据。它被称为
    DataProvider
    。这个术语实际上在
    TestNG
    测试框架中使用,就像@user861594建议的那样

    所以,您应该有一些东西为您的测试提供数据。但这已经是第二步了。因为您知道将从CSV文件中逐行读取数据,所以应该创建一个适当的类来从CSV中读取数据

    下面是一个例子:

    public class CSVReader {
        private static final String DEFAULT_SEPARATOR = ",";
        private BufferedReader reader;
        private List<String> lines;
    
        public CSVReader(File file) throws FileNotFoundException {
            this.reader = new BufferedReader(new FileReader(file));
    
            lines = this.reader.lines().collect(Collectors.toList());
        }
    
        public String[] getRow(int rowNumber) {
            return lines.get(rowNumber).split(DEFAULT_SEPARATOR);
        }
    
        public int getRowCount() {
            return lines.size();
        }
    }
    
    我们有一个类,可以让我们轻松地阅读文件。让我们创建
    DataProvider

    public class CSVDataProvider {
    
        public Collection<Object[]> getData() throws FileNotFoundException {
            CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
            int rowCount = reader.getRowCount();
            Object[][] data = new Object[rowCount][2];
    
            for (int i = 0; i < rowCount; i++) {
                Object[] singleRow = reader.getRow(i);
                data[i][0] = singleRow[0];
                data[i][1] = singleRow[1];
            }
    
            return Arrays.asList(data);
        }
    }
    
    为了向测试提供数据,我们需要使用
    @Parameters
    注释并将
    集合
    返回到我们的测试。我稍后再谈这个问题

    因此,让我们在我们的
    数据提供者中实现它

    public class CSVDataProvider {
    
        public Collection<Object[]> getData() throws FileNotFoundException {
            CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
            int rowCount = reader.getRowCount();
            Object[][] data = new Object[rowCount][2];
    
            for (int i = 0; i < rowCount; i++) {
                Object[] singleRow = reader.getRow(i);
                data[i][0] = singleRow[0];
                data[i][1] = singleRow[1];
            }
    
            return Arrays.asList(data);
        }
    }
    
    为了将参数从
    DataProvider
    传递到我们的测试,我们需要 1.用
    @RunWith(Parameterized.class)
    2.创建一个返回带有注释的
    集合的方法`
    3.创建一个反映我们接受哪种数据的构造函数

    关于第3点,这就是为什么我创建了一个带有
    stringlogin
    stringpassword
    的2参数构造函数。我们正在传递这两个参数。JUnit将创建一个新的
    OurTest
    实例,并为每个测试通过不同的行

    测试
    方法中,我刚刚打印了我们从
    数据提供者

    public class CSVDataProvider {
    
        public Collection<Object[]> getData() throws FileNotFoundException {
            CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
            int rowCount = reader.getRowCount();
            Object[][] data = new Object[rowCount][2];
    
            for (int i = 0; i < rowCount; i++) {
                Object[] singleRow = reader.getRow(i);
                data[i][0] = singleRow[0];
                data[i][1] = singleRow[1];
            }
    
            return Arrays.asList(data);
        }
    }
    
    我不提供一个完全有效的解决方案,因为我希望您尝试调整您的测试来学习这个特定的方法。它也被称为数据驱动测试

    我们只有一种测试方法,但CSV文件中的每一行都将作为单独的测试运行

    希望有帮助

    public class CSVDataProvider {
    
        public Collection<Object[]> getData() throws FileNotFoundException {
            CSVReader reader = new CSVReader(new File("C:\\Users\\xxxxxxxxxxx\\Desktop\\TestData.csv"));
            int rowCount = reader.getRowCount();
            Object[][] data = new Object[rowCount][2];
    
            for (int i = 0; i < rowCount; i++) {
                Object[] singleRow = reader.getRow(i);
                data[i][0] = singleRow[0];
                data[i][1] = singleRow[1];
            }
    
            return Arrays.asList(data);
        }
    }
    
    @RunWith(Parameterized.class)
    public class OurTest {
        private String login, password;
    
        public OurTest(String login, String password) {
            this.login = login;
            this.password = password;
        }
    
        @Parameterized.Parameters(name = "{index}: Login: ({0}) Password: ({1})")
        public static Collection<Object[]> data() throws FileNotFoundException {
            return new CSVDataProvider().getData();
        }
    
        @Test
        public void test() {
            System.out.println(String.format("login : %s | Password: %s", login, password));
        }
    }