first commit

main
Aleksey Filippov 2 months ago
commit dc40c051b2

49
.gitignore vendored

@ -0,0 +1,49 @@
# Created by https://www.toptal.com/developers/gitignore/api/java,maven
# Edit at https://www.toptal.com/developers/gitignore?templates=java,maven
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*
### Maven ###
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar
# Eclipse m2e generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
# End of https://www.toptal.com/developers/gitignore/api/java,maven

Binary file not shown.

@ -0,0 +1,118 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>Homework-8</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
<aspectj.version>1.9.22</aspectj.version>
<allure-testng.version>2.27.0</allure-testng.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.10.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-testng</artifactId>
<version>2.27.0</version>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.20.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>ru.yandex.qatools.ashot</groupId>
<artifactId>ashot</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>org.aeonbits.owner</groupId>
<artifactId>owner</artifactId>
<version>1.0.12</version>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-java-commons</artifactId>
<version>2.27.0</version>
</dependency>
<!-- cucumber-testng -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-testng</artifactId>
<version>7.17.0</version>
</dependency>
<!-- cucumber-java -->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java</artifactId>
<version>7.17.0</version>
</dependency>
<!-- allure-cucumber-jvm -->
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-cucumber-jvm</artifactId>
<version>2.20.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.2.5</version>
<configuration>
<argLine>-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/1.9.22/aspectjweaver-1.9.22.jar"</argLine>
<systemProperties>
<property>
<name>allure.results.directory</name>
<value>${project.build.directory}/allure-results</value>
</property>
</systemProperties>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.22</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-maven</artifactId>
<version>2.12.0</version>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,7 @@
package org.example;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}

@ -0,0 +1,15 @@
package org.example.config;
import org.aeonbits.owner.Config;
/**
* Интерфейс с основной конфигурацией проекта
*/
@Config.Sources({"classpath:config.properties"})
public interface BaseCofig extends Config {
String url();
String driverPath();
String driverProperty();
}

@ -0,0 +1,25 @@
package org.example.enums;
public enum Category {
PRINTERS("26225"),
MONITORS("26309");
private String selector;
Category(String selector) {
this.selector = selector;
}
public String getSelector() {
return selector;
}
public static Category findByName(String name) {
for (Category value : values()) {
if (name.equalsIgnoreCase(value.name())) {
return value;
}
}
throw new IllegalArgumentException(String.format("Unknown category %s", name));
}
}

@ -0,0 +1,25 @@
package org.example.enums;
public enum Sort {
PRICE_HIGH_TO_LOW( "2"),
PRICE_LOW_TO_HIGH("1");
private String selector;
Sort(String selector) {
this.selector = selector;
}
public String getSelector() {
return selector;
}
public static Sort findByName(String name) {
for (Sort value : values()) {
if (name.equalsIgnoreCase(value.name())) {
return value;
}
}
throw new IllegalArgumentException(String.format("Unknown sort type %s", name));
}
}

@ -0,0 +1,262 @@
package org.example.page;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.example.utils.Waiters;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebDriver;
import io.qameta.allure.Attachment;
import io.qameta.allure.Step;
import ru.yandex.qatools.ashot.AShot;
import ru.yandex.qatools.ashot.Screenshot;
/**
* Класс HomePage, в котором происходит взаимодействие со страницей Avito.
*/
public class HomePage {
private WebDriver driver;
private Waiters waiters;
/**
* Конструктор класса HomePage, который инициализирует драйвер WebDriver и объект Waiters.
* Конструктор используется для создания экземпляра класса HomePage, который представляет
* домашнюю страницу веб-сайта и предоставляет методы для взаимодействия с элементами на этой странице.
*
* @param driver экземпляр WebDriver, используемый для взаимодействия с веб-страницей.
*/
public HomePage(WebDriver driver) {
// Инициализация драйвера WebDriver для использования в текущем экземпляре класса
this.driver = driver;
// Создание нового объекта Waiters с переданным драйвером для ожидания элементов
this.waiters = new Waiters(driver);
}
/**
* Метод для перехода на главную страницу сайта Avito, используя WebDriver.
* Метод выполняет переход на указанный URL, который соответствует странице с объявлениями о транспортных средствах в Пензе.
*
*/
@Step("Переход на главную страницу")
public void openAvito() {
// Переход на указанный URL с помощью WebDriver
driver.get("https://www.avito.ru/penza/transport?cd=1");
}
/**
* Выбор категории "Оргтехника и расходники" в пользовательском интерфейсе.
* Метод выполняет последовательность действий для выбора категории и подкатегории.
*/
@Step("Выбор категории 'Оргтехника и расходники'")
public void selectCategory(String category) {
// Селектор для элемента, представляющего все категории
final var allCategoriesSelector = "[data-marker='top-rubricator/all-categories']";
// Ожидание, пока элемент с селектором allCategoriesSelector станет кликабельным
waiters.waitForElementToBeClickable(allCategoriesSelector);
// Нахождение элемента по селектору и выполнение клика
driver.findElement(By.cssSelector(allCategoriesSelector)).click();
// Селектор для элемента, представляющего конкретную категорию
final var categortySelector = "[data-marker='top-rubricator/root-category-26195']";
// Ожидание, пока элемент с селектором categorySelector станет кликабельным
waiters.waitForElementToBeClickable(categortySelector);
// Нахождение элемента по селектору и выполнение клика
driver.findElement(By.cssSelector(categortySelector)).click();
// Селектор для элемента, представляющего подкатегорию
final var subCategorySelector = String.format("[data-marker='top-rubricator/sub-category-%s']", category);
// Ожидание, пока элемент с селектором subCategorySelector станет кликабельным
waiters.waitForElementToBeClickable(subCategorySelector);
// Нахождение элемента по селектору и выполнение клика
driver.findElement(By.cssSelector(subCategorySelector)).click();
}
/**
* Метод для ввода запроса "Принтер" в поле поиска на веб-странице.
* Метод выполняет последовательность действий, включая ожидание доступности поля поиска,
* ввод запроса и подтверждение ввода с помощью клавиши Enter.
*/
@Step("В поле поиска написать “Принтер”")
public void setSearchQuery(String searchString) {
// Селектор для элемента поля поиска
final var suggestFieldSelector = "[data-marker='search-form/suggest']";
// Ожидание, пока элемент с селектором suggestFieldSelector станет кликабельным
waiters.waitForElementToBeClickable(suggestFieldSelector);
// Нахождение элемента по селектору и сохранение его в переменную suggestField
final var suggestField = driver.findElement(By.cssSelector(suggestFieldSelector));
// Ввод запроса в поле поиска и подтверждение ввода с помощью клавиши Enter
suggestField.sendKeys(searchString, Keys.ENTER);
// Ожидание, пока значение в поле поиска станет равным введенному запросу
waiters.waitInputValueToBe(suggestFieldSelector, searchString);
}
/**
* Метод для активации чекбокса "Новые" на веб-странице.
* Метод выполняет последовательность действий, включая ожидание доступности чекбокса и его активацию.
*/
@Step("Активировать чекбокс “Новые”")
public void setOnlyNew() {
// Селектор для элемента чекбокса "Новые"
// final var checkBoxSelector = "[data-marker='params[110396](431243)']";
final var checkBoxSelector = "[data-marker='field'] ul li label";
// Ожидание, пока элемент с селектором checkBoxSelector станет кликабельным
waiters.waitForElementToBeClickable(checkBoxSelector);
// Нахождение элемента по селектору и выполнение клика для активации чекбокса
driver.findElement(By.cssSelector(checkBoxSelector)).click();
waiters.waitForElementToBeClickable(checkBoxSelector);
}
/**
* Метод для автоматизации действия по открытию выпадающего списка регионов на странице.
*/
@Step("Кликнуть по выпадающему списку регионов")
public void openLocationChooser() {
// Определение селектора для элемента, представляющего выпадающий список регионов
final var changeLocationSelector = "[data-marker='search-form/change-location']";
// Ожидание, пока элемент станет кликабельным, чтобы избежать ошибок при попытке клика
waiters.waitForElementToBeClickable(changeLocationSelector);
// Нахождение элемента по селектору и выполнение клика по нему
driver.findElement(By.cssSelector(changeLocationSelector)).click();
}
/**
* Вводит регион "Владивосток" в соответствующее поле на странице.
* Метод автоматизирует процесс ввода региона "Владивосток" в поле поиска региона на странице,
* включая очистку поля, ввод нового значения и выбор предложенного варианта.
*/
@Step("Ввести регион “Владивосток”")
public void setLocation(String location) {
// Селектор для поля ввода региона
final var locationSelector = "[data-marker='popup-location/region/search-input']";
// Значение региона, которое нужно ввести
// Кликнуть на кнопку с крестиком для очистки поля
final var cleanLocationSelector = "[data-marker='popup-location/region/clearButton']";
waiters.waitForElementToBeClickable(cleanLocationSelector);
driver.findElement(By.cssSelector(cleanLocationSelector)).click();
// Ожидание, пока поле ввода станет пустым
waiters.waitInputValueToBe(locationSelector, "");
// Подождать возможности ввода региона
waiters.waitForElementToBeClickable(locationSelector);
final var locationField = driver.findElement(By.cssSelector(locationSelector));
// Ввести новую локацию
locationField.sendKeys(location);
// Подождать появления выпадающего списка
final var suggestListSelector = "[data-marker='popup-location/region/dropdown']";
final var suggestFirstSelector = "[data-marker='popup-location/suggest-0']";
final var suggestSecondSelector = "[data-marker='popup-location/suggest-1']";
waiters.waitForElementToBeClickable(suggestListSelector);
waiters.waitForElementToBeClickable(suggestFirstSelector);
waiters.waitTextStartsWith(suggestFirstSelector, location);
final var firstValue = driver.findElement(By.cssSelector(suggestFirstSelector));
final var secondValue = driver.findElement(By.cssSelector(suggestSecondSelector));
if (!firstValue.getText().contains(location + ",")) {
secondValue.click();
} else {
firstValue.click();
}
// locationField.sendKeys(Keys.ENTER);
waiters.waitInputValueToBe(locationSelector, location);
// Перейти на вкладку районы
final var districtTabSelector = "[data-marker='tab-marker/tab(districtsTab)']";
waiters.waitForElementToBeClickable(districtTabSelector);
driver.findElement(By.cssSelector(districtTabSelector)).click();
}
/**
* Нажимает на кнопку "Показать n объявлений" на странице.
* Метод автоматизирует действие пользователя по нажатию на кнопку "Показать n объявлений".
*/
@Step("Нажать на кнопку “Показать n объявлений”")
public void saveLocation() {
// Селектор для кнопки "Показать n объявлений"
final var saveLocationSelector = "[data-marker='popup-location/save-button']";
// Ожидание, пока элемент с кнопкой станет доступным для поиска на странице
waiters.waitForElementToBeLocated(saveLocationSelector);
// Нахождение элемента по селектору и выполнение клика по нему
driver.findElement(By.cssSelector(saveLocationSelector)).click();
}
/**
* Выбирает "Дороже" в выпадающем списке сортировки на странице.
* Метод автоматизирует процесс выбора опции "Дороже" в выпадающем списке сортировки,
* что позволяет сортировать объявления по цене в порядке убывания.
*/
@Step("В выпадающем списке сортировки выбрать “Дороже”")
public void sort(String selector) {
// Селектор для элемента управления сортировкой
final var sortControlSelector = "[data-marker='sort/title']";
waiters.waitForElementToBeClickable(sortControlSelector);
// Нахождение элемента управления сортировкой и выполнение клика по нему
driver.findElement(By.cssSelector(sortControlSelector)).click();
// Селектор для опции сортировки "Дороже"
final var sortTypeSelector = String.format("[data-marker='sort/custom-option(%s)']", selector);
waiters.waitForElementToBeClickable(sortTypeSelector);
// Нахождение элемента опции сортировки "Дороже" и выполнение клика по нему
driver.findElement(By.cssSelector(sortTypeSelector)).click();
}
/**
* Выводит в консоль значение цены первых 5 товаров на странице.
* Данный метод автоматизирует процесс вывода в консоль значений цен первых 5 товаров.
*/
@Step("Вывести в консоль Значение цены первых 5 товаров")
public void printPrice(int itemsCount) {
// Селекторы для нахождения каталога товаров и отдельного товара
final var itemsSelector = "[data-marker='catalog-serp']";
final var itemSelector = "[data-marker='item']";
// Селекторы для нахождения имени и цены товара
final var nameSelector = "[itemprop='name']";
final var priceSelector = "[data-marker='item-price']";
// Нахождение каталога с товарами на странице
final var root = driver.findElement(By.cssSelector(itemsSelector));
// Поиск всех товаров внутри каталога
final var items = root.findElements(By.cssSelector(itemSelector));
// Цикл по первым n товарам
for (int i = 0; i < itemsCount; i++) {
// Получение текущего товара
final var item = items.get(i);
// Получение наименования и цены товара
final var name = item.findElement(By.cssSelector(nameSelector)).getText();
final var price = item.findElement(By.cssSelector(priceSelector)).getText();
// Вывод информации о товаре и цене в консоль
System.out.println("Товар: " + name + ", цена: " + price);
}
}
/**
* Создаёт скриншот веб-страницы для Allure отчёта.
*/
@Attachment
@Step("Make screenshot")
public byte[] makeScreenshot() {
// Создание скриншота веб-страницы с использованием AShot
final Screenshot screenshot = new AShot().takeScreenshot(driver);
// Создание Стрим-потока для сохранения скриншота
final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try {
ImageIO.write(screenshot.getImage(), "PNG", buffer);
} catch (IOException e) {
e.printStackTrace();
}
return buffer.toByteArray();
}
}

@ -0,0 +1,33 @@
package org.example.utils;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Waiters {
private WebDriver driver;
private WebDriverWait wait;
public Waiters(WebDriver driver) {
this.driver = driver;
this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));
}
public void waitForElementToBeClickable(String cssSelector) {
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(cssSelector)));
}
public void waitForElementToBeLocated(String cssSelector) {
wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(cssSelector)));
}
public void waitInputValueToBe(String cssSelector, String text) {
wait.until(ExpectedConditions.textToBePresentInElementValue(By.cssSelector(cssSelector), text));
}
public void waitTextStartsWith(String cssSelector, String text) {
wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector(cssSelector), text));
}
}

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%white(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1}): %msg%n%throwable
</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="Console" />
</root>
<logger name="org.example" level="debug" additivity="false">
<appender-ref ref="Console" />
</logger>
</configuration>

@ -0,0 +1,46 @@
package org.example;
import org.example.page.HomePage;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import io.qameta.allure.Description;
import io.qameta.allure.Feature;
import io.qameta.allure.Story;
/**
* Основной класс с тестами HomePage.
*/
@Feature("Avito Test")
public class AvitoTest extends BaseTest {
private HomePage homePage;
@BeforeMethod
public void setUp() {
super.setUp();
homePage = new HomePage(driver);
}
@Test(description = "Homework test")
@Description("My homework Avito test")
@Story("Search printers in Vladivostok")
public void testAvitoSearch() {
homePage.openAvito();
homePage.makeScreenshot();
homePage.selectCategory("26223");
homePage.makeScreenshot();
homePage.setSearchQuery("Принтер");
homePage.makeScreenshot();
homePage.setOnlyNew();
homePage.makeScreenshot();
homePage.openLocationChooser();
homePage.makeScreenshot();
homePage.setLocation("Владивосток");
homePage.makeScreenshot();
homePage.saveLocation();
homePage.makeScreenshot();
homePage.sort("2");
homePage.makeScreenshot();
homePage.printPrice(5);
}
}

@ -0,0 +1,54 @@
package org.example;
import org.aeonbits.owner.ConfigFactory;
import org.example.config.BaseCofig;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
/**
* Общий класс с настройками для всех тестов
*/
public abstract class BaseTest {
//создание экземпляра драйвера
/**
* Переменная с экземпляром драйвера
*/
protected WebDriver driver;
/**
* Экземпляр конфигурации с общими параметрами
*/
private final BaseCofig config = ConfigFactory.create(BaseCofig.class, System.getenv());
/**
* Общие настройки для всех тестов, перед выполнением каждого
*/
@BeforeMethod
public void setUp(){
//Установка настройки с путём к Google драйверу
System.setProperty(config.driverProperty(), config.driverPath());
//Создание экземпляра драйвера
driver = new ChromeDriver();
//открытие страницы Google по url
driver.get(config.url());
//разворот окна на полный экран при открытии
driver.manage().window().maximize();
}
/**
* Общие настройки для всех тестов, после выполнения каждого теста
*/
@AfterMethod
public void tearDown() throws InterruptedException {
//Остановка работы драйвера
driver.close();
}
}

@ -0,0 +1,23 @@
package org.example.cucumber;
import org.testng.annotations.Test;
import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions;
import io.cucumber.testng.FeatureWrapper;
import io.cucumber.testng.PickleWrapper;
@CucumberOptions(
//папка, где хранится наша фича.
features = "src/test/resources/features",
//папка, где находятся наши стэпы (шаги).
glue = "org/example/cucumber/steps",
//задаём тип отчёта. Как именно он будет выглядеть.
plugin = {"pretty"}
)
public class RunCucumberTest extends AbstractTestNGCucumberTests {
@Test(groups = "cucumber", description = "Runs Cucumber Scenarios", dataProvider = "scenarios")
public void runScenario(PickleWrapper pickleWrapper, FeatureWrapper featureWrapper) {
super.runScenario(pickleWrapper, featureWrapper);
}
}

@ -0,0 +1,79 @@
package org.example.cucumber.steps;
import org.aeonbits.owner.ConfigFactory;
import org.example.config.BaseCofig;
import org.example.enums.Category;
import org.example.enums.Sort;
import org.example.page.HomePage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.cucumber.java.After;
import io.cucumber.java.en.And;
import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then;
import io.cucumber.java.en.When;
public class MyStepdefs {
private WebDriver driver;
private final BaseCofig config = ConfigFactory.create(BaseCofig.class, System.getenv());
private HomePage homePage;
@Given("I am on the Avito homepage")
public void iAmOnTheAvitoHomepage() {
System.setProperty(config.driverProperty(), config.driverPath());
driver = new ChromeDriver();
driver.get(config.url());
driver.manage().window().maximize();
homePage = new HomePage(driver);
homePage.openAvito();
}
@When("I select category {string}")
public void iSelectCategory(String category) {
homePage.selectCategory(Category.findByName(category).getSelector());
}
@And("I enter {string} in the search field")
public void iEnterInTheSearchField(String searchString) {
homePage.setSearchQuery(searchString);
}
@And("I click on the regions dropdown")
public void iClickOnTheRegionsDropdown() {
homePage.openLocationChooser();
}
@And("I enter {string} in the region field")
public void iEnterInTheRegionField(String location) {
homePage.setLocation(location);
}
@And("I click on the 'Show n ads' button")
public void iClickOnTheButton() {
homePage.saveLocation();
}
@And("I activate the 'Only with photos' checkbox")
public void iActivateTheCheckbox() {
homePage.setOnlyNew();
}
@And("I select {string} in the sorting dropdown")
public void iSelectInTheSortingDropdown(String sortType) {
homePage.sort(Sort.findByName(sortType).getSelector());
}
@Then("I should see the prices of the first {string} items in the console")
public void iShouldSeeThePricesOfTheFirstItemsInTheConsole(String quantity) {
homePage.printPrice(Integer.parseInt(quantity));
}
@After
public void closeBrowser() throws InterruptedException {
driver.close();
}
}

@ -0,0 +1 @@
allure.results.directory=target/allure-results

@ -0,0 +1,3 @@
url = https://www.google.com/
driverPath = .\\chromedriver\\chromedriver.exe
driverProperty = webdriver.chrome.driver

@ -0,0 +1,17 @@
Feature: Avito search
Scenario Outline: Search for items
Given I am on the Avito homepage
When I select category "<category>"
And I enter "<StringForSearch>" in the search field
And I click on the regions dropdown
And I enter "<city>" in the region field
And I click on the 'Show n ads' button
And I activate the 'Only with photos' checkbox
And I select "<sort>" in the sorting dropdown
Then I should see the prices of the first "<quantity>" items in the console
Examples:
| category | StringForSearch | city | sort | quantity |
| PRINTERS | принтер | Владивосток | PRICE_HIGH_TO_LOW | 10 |
| MONITORS | монитор | Иркутск | PRICE_LOW_TO_HIGH | 7 |
Loading…
Cancel
Save