#java #selenium #testng
#java #селен #testng
Вопрос:
Я новичок в тестах selenium. Я написал этот код, и он работает, но мне нужно выполнить цикл этого теста с другой строкой csv.
Я потратил почти 10 часов, пытаясь это сделать.
Сценарий того, что я пытаюсь сделать:
- Открывается веб-браузер перейти к 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();
}
}
}
}
Ответ №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);
}
}