Как зациклить этот тест с другой строкой CSV? - PullRequest
3 голосов
/ 17 апреля 2019

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

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

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

  1. Веб-браузер открывается, перейдите наurl

  2. вход с данными из файла CSV из первой строки

  3. Драйвер перезапускается и делает то же самое, но с данными из второй строки из файла CSV,

Я также пытался перезапустить тест с помощью метода метаданных / 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();
                }
            }
        }
    } 

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Похоже, вы хотите повторить свой тест с набором тестовых данных. В этом случае вы должны использовать функцию 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);
     }
 } 

1 голос
/ 17 апреля 2019

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

0 голосов
/ 18 апреля 2019

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 принимает File в качестве аргумента и создает надлежащие объекты для чтения данных определенным образом (например: read as 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, поэтому я создал конструктор с двумя аргументами с String login и String password. Мы передаем эти 2 параметра. JUnit создаст новый экземпляр OurTest и передаст разные строки для каждого теста.

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...