СТРУКТУРА, УПРАВЛЯЕМАЯ ДАННЫМИ, В SELENIUM WEBDRIVER | МАТЕРИАЛ ДЛЯ ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Среда тестирования на основе данных в Selenium WebDriver

В этом посте я покажу вам, как реализовать Среду на основе данных в Selenium WebDriver с использованием Apache POI и поставщика данных TestNG. На рынке существуют различные типы сред автоматизации тестирования, такие как модульная, управляемая данными, управляемая ключевым словом, модель объекта страницы (на самом деле это шаблон проектирования), гибридная структура. Каждый тип фреймворка имеет свои особенности.

  • 1. Что такое Data Driven Framework
  • 2. Почему Data Driven Framework
  • 3. Преимущества использования Data Driven Test Framework
  • 4. Что такое Apache POI
  • 5. Как работать с Data Driven Framework в Selenium с помощью Apache POI
  • 6. Как создать управляемую данными платформу в Selenium с помощью Apache POI
  • 7. Как считывать данные с листа Excel с помощью Apache POI
  • 8. Как записывать данные из листа Excel с помощью Apache POI
  • 9. Data Driven Framework в Selenium WebDriver с использованием поставщика данных TestNG

DATA DRIVEN СТРУКТУРА В SELENIUM WEBDRIVER | МАТЕРИАЛЫ ДЛЯ ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Что такое Data Driven Framework

Платформа, управляемая данными, ориентирована на отделение логики тестовых сценариев и тестовых данных друг от друга. Позволяет нам создавать сценарии автоматизации тестирования, передавая различные наборы тестовых данных. Набор тестовых данных хранится во внешних файлах или ресурсах, таких как таблицы MS Excel, таблицы MS Access, база данных SQL, файлы XML и т. д. Тестовые сценарии подключаются к внешним ресурсам для получения тестовых данных. Используя этот фреймворк, мы могли легко заставить тестовые сценарии правильно работать с различными наборами тестовых данных. Эта структура значительно сокращает количество тестовых сценариев по сравнению с модульной структурой.

Почему Data Driven Framework

Обычно мы помещаем все наши тестовые данные в листы Excel, которые мы используем в наших тестовых прогонах. Предположим, нам нужно запустить тестовый скрипт (скажем, тест входа) с несколькими тестовыми данными. Если мы запускаем один и тот же тест с несколькими наборами тестовых данных вручную, это отнимает много времени и подвержено ошибкам. В следующем разделе мы увидим практический пример.

Проще говоря, мы используем Data Driven Framework, когда нам нужно выполнить один и тот же сценарий с несколькими наборами тестовых данных.

Преимущества использования Data Driven Test Framework

  • Возможность повторного использования кода
  • Улучшает тестовое покрытие
  • Более быстрое выполнение
  • Меньше обслуживание
  • Позволяет улучшить обработку ошибок

Что такое Apache POI

Apache POI — это библиотека с открытым исходным кодом, разработанная и распространяемая Apache Software Foundation для проектирования или изменения файлов Microsoft Office с использованием программы Java. Это популярный API, который позволяет работать с файлами Excel с помощью программ Java. Короче говоря, вы можете читать и писать файлы MS Excel, используя Java. Apache POI — это ваше решение для Java Excel.
Вы бы использовали HSSF, если бы вам нужно было прочитать или записать файл Excel с помощью Java (XLS). Вы бы использовали XSSF, если вам нужно прочитать или записать файл Excel OOXML с использованием Java (XLSX). Он имеет множество предопределенных методов, классов и интерфейсов.

Подробнее об Apache POI

Как работать с Data Driven Framework в Selenium с помощью Apache POI

Selenium автоматизирует браузеры. Это популярный инструмент для автоматизации веб-приложений. Для обработки таблиц Excel для чтения и записи данных с помощью Selenium мы используем Apache POI.

Предположим, вам нужно протестировать форму входа с 50 различными наборами тестовых данных

  1. Как тестировщик вручную, вы входите в систему со всеми 50 различными наборами тестовых данных 50 раз.
  2. Как тестировщик автоматизации вы создаете тестовый сценарий и запускаете его 50 раз, изменяя тестовые данные при каждом запуске, или создаете 50 раз. тестовые скрипты для выполнения сценария

Одна из причин, по которой мы используем автоматизацию, заключается в том, чтобы преодолеть проблему затрат времени. Следуя двум вышеуказанным способам, мы ничего не добьемся с помощью автоматизации.

Здесь помогает тестирование, управляемое данными, которое сэкономит нам много времени.

Как создать Data Driven Framework в Selenium с использованием Apache POI

Здесь я возьму приложение Facebook, чтобы продемонстрировать реализацию Data Driven Framework в Selenium с Java с использованием Apache POI.

Сценарий: Откройте facebook страницу и войдите в систему и выйдите из нее.

Следуйте приведенным ниже шагам, чтобы внедрить платформу, управляемую данными.

Сначала мы видим, как читать тестовые данные из листа Excel, а затем мы видим, как записать результат в лист Excel.

Как считывать данные с листа Excel с помощью Apache POI

Необходимые условия для внедрения Data Driven Framework:

  1. Eclipse IDE
  2. TestNG
  3. Selenium jars
  4. Apache POI jars
  5. Microsoft Excel

Структура моего проекта (Data Driven Project with Maven) выглядит следующим образом:

УПРАВЛЯЕМАЯ ДАННЫМИ РАМКА В SELENIUM WEBDRIVER | МАТЕРИАЛЫ ДЛЯ ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Шаг 1. Откройте Eclipse и настройте jar-файлы Apache POI. Загрузите Apache Jars

Примечание. Если вы используете Maven Project, вы можете включить зависимости в файл pom.xml

Шаг 2. : Откройте лист Excel и создайте несколько тестовых данных. Здесь я сохранил свой лист Excel на диске D.

УПРАВЛЯЕМАЯ ДАННЫМИ РАМКА В SELENIUM WEBDRIVER | МАТЕРИАЛЫ ДЛЯ ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Шаг 3. Создайте класс Java в своем проекте

Здесь я создал класс Java “DataDrivenTest” в своем проекте “DataDrivenProject”

Шаг 4:Вот пример кода для входа на facebook.com путем получения учетных данных пользователя из листа Excel. Скопируйте приведенный ниже код и вставьте его в свой класс Java. :4;-webkit-размер вкладки:4;размер вкладки:4;размер шрифта:12px!важно;высота строки:15px!важно>пакетные тесты; импортировать java.io.File; импортировать java.io.FileInputStream; импортировать java.io.IOException; импортировать java.util.concurrent.TimeUnit; импортировать org.apache.poi.ss.usermodel.Cell; импортировать org.apache.poi.xssf.usermodel.XSSFCell; импортировать org.apache.poi.xssf.usermodel.XSSFSheet; импортировать org.apache.poi.xssf.usermodel.XSSFWorkbook; импортировать org.openqa.selenium.By; импортировать org.openqa.selenium.WebDriver; импортировать org.openqa.selenium.chrome.ChromeDriver; импортировать org.testng.annotations.BeforeTest; импортировать org.testng.annotations.Test; открытый класс DataDrivenTest {драйвер WebDriver; рабочая тетрадь XSSFWorkbook; Лист XSSFSheet; ячейка XSSFCell; @BeforeTest public void initialization(){ //Чтобы установить путь к драйверу Chrome. System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\src\test\java\drivers chromedriver.exe"); драйвер = новый ChromeDriver(); //Для запуска facebook driver.get("http://www.facebook.com/"); //Чтобы развернуть браузер driver.manage().window().maximize(); //неявное ожидание driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); } @Test public void fbLoginLogout() выдает исключение IOException{ //Импорт листа Excel. Файл src=новый файл("D:\Test.xlsx"); //Загружаем файл. FileInputStream fis = новый FileInputStream(src); //Загрузить книгу. рабочая книга = новая XSSFWorkbook (fis); //Загружаем лист, в котором хранятся данные. лист = рабочая книга.getSheetAt (0); for(int i=1; i<=sheet.getLastRowNum(); i++){ /*Я добавил тестовые данные в ячейку A2 как "testemailone@test.com" и B2 как "пароль" Ячейка A2 = строка 1 и столбец 0. Первая строка читается как 0, вторая строка — как 1 и т. д., первый столбец (A) — как 0, второй столбец (B) — как 1 и т. д.*///Импорт данных для электронной почты . ячейка = лист.getRow(i).getCell(0); cell.setCellType(Cell.CELL_TYPE_STRING); driver.findElement(By.xpath("//input[@type='email'][@name='email']")).clear( ); driver.findElement(By.xpath("//input[@type='email'][@name='email']")).sendKeys( ячейка.getStringCellValue()); //Импорт данных для пароля. ячейка = лист.getRow(i).getCell(1); cell.setCellType(Cell.CELL_TYPE_STRING); driver.findElement(By.xpath("//input[@type='password'][@name='pass']")).clear( ); driver.findElement(By.xpath("//input[@type='password'][@name='pass']")).sendKeys( ячейка.getStringCellValue()); //Чтобы нажать кнопку входа в систему driver.findElement(By.xpath("//input[@type='submit'][@id='u_0_5']&# 34;)).клик(); //Чтобы щелкнуть раскрывающийся список настроек учетной записи driver.findElement(By.xpath("//div[text()='Настройки учетной записи']")).click(); //Чтобы нажать кнопку выхода из системы driver.findElement(By.xpath("//text()[.='Выход из системы']/ancestor::span[1]") ).щелчок(); } } }

12345678910111213141516171819202122232425262728293031323333435363738394041424344454647484950515253545556575859606162673646567076165670761пакетные тесты; импортировать java.io.File; импортировать java.io.FileInputStream; импортировать java.io.IOException; импортировать java.util.concurrent.TimeUnit; импорт org.apache.poi.ss.usermodel.Cell; импорт org.apache.poi.xssf.usermodel.XSSFCell; импорт org.apache.poi.xssf.usermodel.XSSFSheet; импорт org.apache.poi.xssf.usermodel. XSSFWorkbook;импорт org.openqa.selenium.By;импорт org.openqa.selenium.WebDriver;импорт org.openqa.selenium.chrome.ChromeDriver;импорт org.testng.annotations.BeforeTest;импорт org.testng.annotations.Test; открытый класс DataDrivenTest {драйвер WebDriver; рабочая тетрадь XSSFWorkbook; Лист XSSFSheet; ячейка XSSFCell; @BeforeTestpublic void initialization(){    //Чтобы установить путь к Chrome driver.System.setProperty(“webdriver.chrome.driver”, System.getProperty(“user.dir”)+”\src\test\ java\drivers\chromedriver.exe”);driver = new ChromeDriver(); //Для запуска facebook    driver.get(“http://www.facebook.com/”); //Чтобы развернуть браузер    driver.manage().window().maximize(); //неявное ожидание    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); }  @Testpublic void fbLoginLogout() выдает исключение IOException{//Импорт листа Excel.File src=new File(“D:\Test.xlsx”); //Загружаем файл.FileInputStream fis = new FileInputStream(src);//Загружаем workbook.workbook = new XSSFWorkbook(fis);//Загружаем лист, в котором хранятся данные.sheet= workbook.getSheetAt(0);for (int i=1; i<=sheet.getLastRowNum(); i++){/*Я добавил тестовые данные в ячейку A2 как “testemailone@test.com” и B2 как “пароль”Ячейка A2 = строка 1 и столбец 0. Он читает первую строку как 0, вторую строку как 1 и т. д., первый столбец (A) как 0, второй столбец (B) как 1 и т. д.*///Импорт данных для Email.cell = sheet.getRow(i ).getCell(0);cell.setCellType(Cell.CELL_TYPE_STRING);driver.findElement(By.xpath(“//input[@type='email'][@name='email']”)).clear( );driver.findElement(By.xpath(“//input[@type='email'][@name='email']”)).sendKeys(cell.getStringCellValue());//Импорт данных для пароля. ячейка = лист.getRow(i).getCell(1);cell.setCellType(Cell.CELL_TYPE_STRING);driver.findElement(By.xpath(“//input[@type='password'][@name='pass' ]”)).Чисто(); driver.findElement(By.xpath(“//input[@type='password'][@name='pass']”)).sendKeys(cell.getStringCellValue());//Чтобы нажать кнопку входа в системуdriver.findElement (By.xpath(“//input[@type='submit'][@id='u_0_5']”)).click();//Чтобы щелкнуть настройки учетной записи dropdowndriver.findElement(By.xpath(“//div[text()='Настройки учетной записи']”)).click();//Для нажатия на кнопку выхода из системы ::span[1]”)).click();}}}

Шаг 5. Запустите тестовый скрипт

Как записывать данные из таблицы Excel с помощью Apache POI

Шаг 1: Выполните шаг 1 как упоминалось выше

Шаг 2: Здесь я создал еще один столбец как «Результат» на моем листе Excel, который находится на моем диске D.

УПРАВЛЯЕМАЯ ДАННЫМИ СТРУКТУРА В SELENIUM WEBDRIVER | МАТЕРИАЛЫ ДЛЯ ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Шаг 3:Вот пример кода для входа на facebook.com путем получения учетных данных пользователя из листа Excel и записи результата в лист Excel. Скопируйте приведенный ниже код и вставьте его в свой класс Java. :4;-webkit-размер вкладки:4;размер вкладки:4;размер шрифта:12px!важно;высота строки:15px!важно>пакетные тесты; импортировать java.io.File; импортировать java.io.FileInputStream; импортировать java.io.FileOutputStream; импортировать java.io.IOException; импортировать java.util.concurrent.TimeUnit; импортировать org.apache.poi.ss.usermodel.Cell; импортировать org.apache.poi.xssf.usermodel.XSSFCell; импортировать org.apache.poi.xssf.usermodel.XSSFSheet; импортировать org.apache.poi.xssf.usermodel.XSSFWorkbook; импортировать org.openqa.selenium.By; импортировать org.openqa.selenium.WebDriver; импортировать org.openqa.selenium.chrome.ChromeDriver; импортировать org.testng.annotations.BeforeTest; импортировать org.testng.annotations.Test; открытый класс DataDrivenTest {драйвер WebDriver; рабочая тетрадь XSSFWorkbook; Лист XSSFSheet; ячейка XSSFCell; @BeforeTest public void TestSetup(){ //Чтобы установить путь к драйверу Chrome. System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\src\test\java\drivers chromedriver.exe"); драйвер = новый ChromeDriver(); //Для запуска facebook driver.get("http://www.facebook.com/"); //Чтобы развернуть браузер driver.manage().window().maximize(); //неявное ожидание driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); } @Test public void ReadData() выдает IOException, Exception{ //Импорт листа Excel. Файл src=новый файл("D:\Test.xlsx"); //Загружаем файл. FileInputStream fis = новый FileInputStream(src); //Загрузить книгу. рабочая книга = новая XSSFWorkbook (fis); //Загружаем лист, в котором хранятся данные. лист= рабочая книга.getSheet("Лист1"); for(int i=1; i<=sheet.getLastRowNum(); i++){ /*Я добавил тестовые данные в ячейку A2 как "testemailone@test.com" и B2 как "пароль" Ячейка A2 = строка 1 и столбец 0. Первая строка читается как 0, вторая строка — как 1 и т. д., первый столбец (A) — как 0, второй столбец (B) — как 1 и т. д.*///Импорт данных для электронной почты . ячейка = лист.getRow(i).getCell(0); cell.setCellType(Cell.CELL_TYPE_STRING); driver.findElement(By.xpath("//input[@type='email'][@name='email']")).clear( ); driver.findElement(By.xpath("//input[@type='email'][@name='email']")).sendKeys( ячейка.getStringCellValue()); //Импорт данных для пароля. ячейка = лист.getRow(i).getCell(1); cell.setCellType(Cell.CELL_TYPE_STRING); driver.findElement(By.xpath("//input[@type='password'][@name='pass']")).clear( ); driver.findElement(By.xpath("//input[@type='password'][@name='pass']")).sendKeys( ячейка.getStringCellValue()); //Чтобы нажать кнопку входа в систему driver.findElement(By.xpath("//input[@type='submit'][@id='u_0_5']&# 34;)).клик(); //Для записи данных в Excel FileOutputStream fos=new FileOutputStream(src); //Сообщение для записи в лист Excel String message = "Pass"; //Создаем ячейку, куда нужно записать данные. лист.getRow(i).createCell(2).setCellValue(сообщение); //наконец-то напишем содержимое workbook.write(fos); //Чтобы щелкнуть раскрывающийся список настроек учетной записи driver.findElement(By.xpath("//div[text()='Настройки учетной записи']")).click(); //Чтобы нажать кнопку выхода из системы driver.findElement(By.xpath("//text()[.='Выход из системы']/ancestor::span[1]") ).щелчок(); //закрываем файл fos.close(); } } }

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990

пакетные тесты; импорт java.io.File; импорт java.io.FileInputStream; импорт java.io.FileOutputStream; импорт java.io.IOException; импорт java.util.concurrent.TimeUnit; импорт org.apache.poi.ss.usermodel.Cell; импорт org.apache.poi.xssf.usermodel.XSSFCell; импорт org.apache.poi.xssf.usermodel.XSSFSheet; импорт org.apache.poi.xssf.usermodel. XSSFWorkbook;импорт org.openqa.selenium.By;импорт org.openqa.selenium.WebDriver;импорт org.openqa.selenium.chrome.ChromeDriver;импорт org.testng.annotations.BeforeTest;импорт org.testng.annotations.Test; открытый класс DataDrivenTest {драйвер WebDriver; рабочая тетрадь XSSFWorkbook; Лист XSSFSheet; ячейка XSSFCell; @BeforeTestpublic void TestSetup(){    //Чтобы установить путь к Chrome driver.System.setProperty(“webdriver.chrome.driver”, System.getProperty(“user.dir”)+”\src\test\ java\drivers\chromedriver.exe”);driver = new ChromeDriver(); //Для запуска facebook    driver.get(“http://www.facebook.com/”); //Чтобы развернуть браузер    driver.manage().window().maximize(); //неявное ожидание    driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); }  @Testpublic void ReadData() генерирует IOException, Exception{//Импорт листа Excel.File src=new File(“D:\Test.xlsx”); //Загружаем файл.FileInputStream fis = new FileInputStream(src);//Загружаем workbook.workbook = new XSSFWorkbook(fis);//Загружаем лист, в котором хранятся данные.sheet= workbook.getSheet(“Sheet1”) ;for(int i=1; i<=sheet.getLastRowNum(); i++){/*Я добавил тестовые данные в ячейку A2 как “testemailone@test.com” и B2 как “пароль”. Ячейка A2 = строка 1 и столбец 0. Он читает первую строку как 0, вторую строку как 1 и так далее, первый столбец (A) как 0 и второй столбец (B) как 1 и так далее*///Импорт данных для Email.cell = sheet.getRow (i).getCell(0);cell.setCellType(Cell.CELL_TYPE_STRING);driver.findElement(By.xpath(“//input[@type='email'][@name='email']”)). clear();driver.findElement(By.xpath(“//input[@type='email'][@name='email']”)).sendKeys(cell.getStringCellValue());//Импорт данных для password.cell = лист.getRow(i).getCell(1);cell.setCellType(Cell.CELL_TYPE_STRING);driver.findElement(By.xpath(“//input[@type='password'][@name=' передать']”)).clear(); driver.findElement(By.xpath(“//input[@type='password'][@name='pass']”)).sendKeys(cell.getStringCellValue());//Чтобы нажать кнопку входа в системуdriver.findElement (By.xpath(“//input[@type='submit'][@id='u_0_5']”)).click();//Для записи данных в excelFileOutputStream fos=new FileOutputStream(src);//Сообщение для записи на листе Excel    String message = “Pass”; //Создаем ячейку, куда нужно записать данные. лист.getRow(i).createCell(2).setCellValue(сообщение); //наконец, напишите содержимое    workbook.write(fos);//Чтобы щелкнуть настройки учетной записи dropdowndriver.findElement(By.xpath(“//div[text()='Настройки учетной записи']”)).click();//Для выхода из системы buttondriver.findElement(By.xpath(“//text()[.='Log Out']/ancestor::span[1]”)).click();//закрыть файл fos.close (); }}}

Шаг 4. После завершения откройте файл Excel и проверьте результат.

УПРАВЛЯЕМАЯ ДАННЫМИ РАМКА В SELENIUM WEBDRIVER | МАТЕРИАЛЫ ДЛЯ ТЕСТИРОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

Data Driven Framework в Selenium WebDriver с использованием поставщика данных TestNG

Сценарий:  откройте Facebook, введите имя пользователя, пароль и логин

Ниже запускается тестовый скрипт 2 раза с разными наборами тестовых данных.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556

пакетные тесты; импортировать java.util.concurrent.TimeUnit; импортировать org.openqa.selenium.By;импортировать org.openqa.selenium.WebDriver;импортировать org.openqa.selenium.chrome.ChromeDriver;импортировать org.testng.annotations.DataProvider;импортировать org.testng.annotations.Test; public class DataDrivenTest { //Чтобы получить данные от dataprovider@Test(dataProvider=”testdataset”)public void fbLoginLogout(String email, String password) выдает Exception{//Инициализация webdriverSystem.setProperty(“webdriver.chrome.driver”, System. getProperty(“user.dir”)+”\src\test\java\drivers\chromedriver.exe”);WebDriver driver = new ChromeDriver();//Чтобы максимально увеличить окно браузера windowdriver.manage(). window().maximize();//Неявное ожидание 20 секундdriver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);//Для запуска facebookdriver.get(“https://www.facebook. com”);//Чтобы очистить электронную почту fielddriver.findElement(By.xpath(“//input[@type='email'][@name='email']”)).clear();//Чтобы пройти Emaildriver.findElement(By.xpath(“//input[@type='email'][@name='email']”)).sendKeys(email);//Чтобы очистить пароль fielddriver.findElement(By.xpath( “//input[@type='password'][@name='pass']”)).clear();//Для передачи passworddriver.findElement(By.xpath(“//input[@type='password '][@name='pass']”)).sendKeys(пароль );//Чтобы нажать кнопку «Войти» настройки dropdowndriver.findElement(By.xpath(“//div[text()='Настройки учетной записи']”)).click();//Чтобы нажать кнопку выхода из системы, driver.findElement(By.xpath(“//text( )[.='Log Out']/ancestor::span[1]”)).click();}//@DataProvider передает данные в тестовые примеры. Здесь я взял двухмерный массив. @DataProvider(name=”testdataset”)public Object[][] getData(){//Создать объект с двумя параметрами//первый параметр – это row, а второй – columnObject[][] data = новый объект[2][2];данные[0][0] = “testemailone@gmail.com”;данные[0][1] = “пароль”;данные[1][0] = “testemailtwo@test. com”;данные[1][1] = “пароль”; return data;}}

Если у вас есть какие-либо вопросы, оставьте комментарий ниже в разделе комментариев.

Объектная модель страницы с Фабрикой страниц в Selenium — полное руководство

Здесь Я выбрал несколько постов, которые помогут вам узнать кое-что интересное:

  • Объясните платформу автоматизации тестирования в интервью
  • Вопросы для интервью по платформе автоматизации тестирования
  • Вопросы для интервью по Selenium
  • Вопросы для интервью по TestNG
  • Почему вы выбираете тестирование программного обеспечения в качестве карьеры
  • Вопросы для собеседования по ручному тестированию
  • Общие вопросы для собеседования
  • Вопросы для собеседования по SQL
  • Вопросы для собеседования по Agile
  • Учебное пособие по Selenium
  • Учебное пособие по TestNG
  • Руководство Учебное пособие по тестированию
  • Учебное пособие по Katalon Studio

TAG: qa

От QA genius

Adblock
detector