Как выполнить цикл этого теста с другой строкой csv?

#java #selenium #testng

#java #селен #testng

Вопрос:

Я новичок в тестах selenium. Я написал этот код, и он работает, но мне нужно выполнить цикл этого теста с другой строкой csv.

Я потратил почти 10 часов, пытаясь это сделать.

Сценарий того, что я пытаюсь сделать:

  1. Открывается веб-браузер перейти к URL
  2. войдите в систему с данными из CSV-файла из первой строки
  3. Драйвер перезапускается и делает то же самое, но с данными из второй строки из файла 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();
                }
            }
        }
    } 
 

Ответ №1:

Решение JUnit 4. Этот будет огромным…

Во-первых, давайте начнем с CSVReader и некоторыми хорошими практиками плюс удобочитаемость кода. В вашем тесте вы считываете данные CSV и используете их в своих тестах. Чтение данных не входит в обязанности теста. В тесте уже должны быть предоставлены все данные. Это называется DataProvider . Этот термин фактически используется в TestNG рамках тестирования, как и предложил @user861594.

Итак, у вас должно быть что-то для предоставления данных вашим тестам. Но это уже шаг № 2. Поскольку вы знаете, что будете читать данные по строкам из файла 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();
    }
}
 

CSVReader Конструктор принимает a File в качестве аргумента и создает надлежащие объекты для чтения данных определенным образом (например: читать как String ). Затем данные в файле CSV считываются, как и в обычном TXT-файле, сохраняя строки в памяти для последующего использования.

Затем мы создаем 2 метода. Первый getRowCount — это то, что дает нам общее количество строк / наборов данных.

Второй — getRow это сбор определенной строки из списка и сохранение ее в String[] массив для последующего использования.

String[] массив имеет представление, подобное 1 строке Excel:

 data index 0 | data index 1 | data index 2 | data index 3
 

У нас есть класс, который позволяет нам легко читать файл. Давайте создадим DataProvider

Чтобы предоставить данные для тестов, нам нужно использовать @Parameters аннотацию и вернуться Collection<Object[]> к нашему тесту. Я расскажу об этом позже.

Итак, давайте реализуем это в нашем 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);
    }
}
 

Я предполагаю, что у вас есть только логины и пароли в файле CSV. Вот почему я создал 2-мерный массив new Object[rowCount][2] . Мы создаем массив, указывая, сколько элементов он должен хранить, и мы знаем, сколько строк у нас есть из rowCount переменной.
2 означает, что у нас есть только 2 данных в строке. Логин и пароль. Если вы хотите использовать дополнительный элемент, например — роль пользователя, вы можете изменить на [3]

В for цикле мы преобразуем данные из файла CSV в массив и возвращаем их для последующего использования.

Теперь давайте поговорим о нашем тестовом классе.

 @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));
    }
}
 

Чтобы передать параметры из DataProvider в наш тест, нам нужно
1. Аннотируйте класс с помощью @RunWith(Parameterized.class)
2. Создайте метод, возвращающий Collection<Object[]> with annotation @Parameters`
3. Создайте конструктор, отражающий, какие данные мы принимаем.

Что касается пункта 3, именно поэтому я создал конструктор с 2 аргументами String login с помощью and String password . Мы передаем эти 2 параметра. JUnit создаст новый экземпляр OurTest и передаст другую строку для каждого теста.

В test методе я только что напечатал данные, которые мы получили из DataProvider

Я не представляю полностью рабочего решения, потому что хочу, чтобы вы попытались настроить свой тест, чтобы изучить этот конкретный подход. Это также называется Data-driven Testing .

У нас есть только 1 метод тестирования, но каждая строка в файле CSV будет выполняться как отдельный тест.

Надеюсь, это поможет!

Ответ №2:

Ваш цикл while выглядит сломанным. Цикл for внутри цикла while, похоже, портит вашу процедуру входа в систему.

 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. Никогда не прекращайте учиться.

Ответ №3:

Похоже, вы хотите повторить свой тест с набором тестовых данных. В этом случае вам следует использовать функцию поставщика данных TestNG.

 public class CSVdataread {
    private WebDriver driver;
    String baseUrl = "URL";
    String CSV_file = "C:\Users\xxxxxxxxxxx\Desktop\TestData.csv";

    @BeforeMethod
    public void openBrowser() {
        System.setProperty("webdriver.chrome.driver", "C:\Users\xxxxxxxxxxxx\Desktop\webdriver\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }

    @Test(dataProvider="users-data")
    public void verify_Search(String name, String email) throws InterruptedException, IOException {
           String baseUrl = "http://xxxxx.xxx/xxxx/";
           driver.navigate().to(baseUrl);
           driver.findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
           driver.findElement(By.xpath("//input[@id='userpasswordFormField-inputEl']")).sendKeys(email);
     }
     //This method will provide data to any test method that declares that its Data Provider
     @DataProvider(name = "users-data")
     public Iterator<Object[]> createDataFromCSV() {
       CSVReader reader = new CSVReader(new FileReader(CSV_file));
       List<Object[]> data = new ArrayList<Object[]>();
       //read csv data to list
       return data.iterator();
    }

    @AfterMethod
    public void closeBrowser() {
        driver.quit();
    }

 } 

 

Вы также можете использовать доступное расширение поставщика данных. Например, с qaf вам не нужно писать код для управления драйверами или для поставщика данных. Ваш тестовый класс будет выглядеть следующим образом:

 public class CSVdataread  extends WebDriverTestCase{

    @QAFDataProvider(dataFile="resources/user-data.csv")
    @Test()
    public void verify_Search(String name, String email) throws InterruptedException, IOException {
           String baseUrl = "http://xxxxx.xxx/xxxx/";
           getDriver().navigate().to(baseUrl);
           getDriver().findElement(By.xpath("//input[@id='useridFormField-inputEl']")).sendKeys(name);
           //another way of finding element...
           getDriver().findElement("xpath=//input[@id='userpasswordFormField-inputEl']").sendKeys(email);
     }
 }