commit dc40c051b26404eed4fe9a6e8200ce0e4c9a7b51 Author: Aleksey Filippov Date: Mon May 6 22:55:36 2024 +0400 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7237f21 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/chromedriver/chromedriver.exe b/chromedriver/chromedriver.exe new file mode 100644 index 0000000..89a160a Binary files /dev/null and b/chromedriver/chromedriver.exe differ diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..2c3bb76 --- /dev/null +++ b/pom.xml @@ -0,0 +1,118 @@ + + + 4.0.0 + + org.example + Homework-8 + 1.0-SNAPSHOT + + + 3.2.5 + 1.9.22 + 2.27.0 + + 11 + 11 + UTF-8 + + + + + org.testng + testng + 7.10.1 + test + + + + io.qameta.allure + allure-testng + 2.27.0 + + + + org.seleniumhq.selenium + selenium-java + 4.20.0 + + + + org.aspectj + aspectjweaver + 1.9.22 + + + + ru.yandex.qatools.ashot + ashot + 1.5.4 + + + + org.aeonbits.owner + owner + 1.0.12 + + + io.qameta.allure + allure-java-commons + 2.27.0 + + + + + io.cucumber + cucumber-testng + 7.17.0 + + + + + io.cucumber + cucumber-java + 7.17.0 + + + + + io.qameta.allure + allure-cucumber-jvm + 2.20.1 + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.2.5 + + -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/1.9.22/aspectjweaver-1.9.22.jar" + + + allure.results.directory + ${project.build.directory}/allure-results + + + + + + org.aspectj + aspectjweaver + 1.9.22 + + + + + io.qameta.allure + allure-maven + 2.12.0 + + + + + \ No newline at end of file diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java new file mode 100644 index 0000000..407f157 --- /dev/null +++ b/src/main/java/org/example/Main.java @@ -0,0 +1,7 @@ +package org.example; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello world!"); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/config/BaseCofig.java b/src/main/java/org/example/config/BaseCofig.java new file mode 100644 index 0000000..8f58feb --- /dev/null +++ b/src/main/java/org/example/config/BaseCofig.java @@ -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(); +} diff --git a/src/main/java/org/example/enums/Category.java b/src/main/java/org/example/enums/Category.java new file mode 100644 index 0000000..1df018b --- /dev/null +++ b/src/main/java/org/example/enums/Category.java @@ -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)); + } +} diff --git a/src/main/java/org/example/enums/Sort.java b/src/main/java/org/example/enums/Sort.java new file mode 100644 index 0000000..f66529a --- /dev/null +++ b/src/main/java/org/example/enums/Sort.java @@ -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)); + } +} diff --git a/src/main/java/org/example/page/HomePage.java b/src/main/java/org/example/page/HomePage.java new file mode 100644 index 0000000..0863c8b --- /dev/null +++ b/src/main/java/org/example/page/HomePage.java @@ -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(); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/utils/Waiters.java b/src/main/java/org/example/utils/Waiters.java new file mode 100644 index 0000000..704b348 --- /dev/null +++ b/src/main/java/org/example/utils/Waiters.java @@ -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)); + } +} \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..aa2d2ff --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,18 @@ + + + + + + %white(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1}): %msg%n%throwable + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/org/example/AvitoTest.java b/src/test/java/org/example/AvitoTest.java new file mode 100644 index 0000000..abd662e --- /dev/null +++ b/src/test/java/org/example/AvitoTest.java @@ -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); + } +} \ No newline at end of file diff --git a/src/test/java/org/example/BaseTest.java b/src/test/java/org/example/BaseTest.java new file mode 100644 index 0000000..51c5e94 --- /dev/null +++ b/src/test/java/org/example/BaseTest.java @@ -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(); + } + +} diff --git a/src/test/java/org/example/cucumber/RunCucumberTest.java b/src/test/java/org/example/cucumber/RunCucumberTest.java new file mode 100644 index 0000000..afbcc8c --- /dev/null +++ b/src/test/java/org/example/cucumber/RunCucumberTest.java @@ -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); + } +} diff --git a/src/test/java/org/example/cucumber/steps/MyStepdefs.java b/src/test/java/org/example/cucumber/steps/MyStepdefs.java new file mode 100644 index 0000000..31f2eb4 --- /dev/null +++ b/src/test/java/org/example/cucumber/steps/MyStepdefs.java @@ -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(); + } +} diff --git a/src/test/resources/allure.properties b/src/test/resources/allure.properties new file mode 100644 index 0000000..6c1e0bb --- /dev/null +++ b/src/test/resources/allure.properties @@ -0,0 +1 @@ +allure.results.directory=target/allure-results \ No newline at end of file diff --git a/src/test/resources/config.properties b/src/test/resources/config.properties new file mode 100644 index 0000000..f702f32 --- /dev/null +++ b/src/test/resources/config.properties @@ -0,0 +1,3 @@ +url = https://www.google.com/ +driverPath = .\\chromedriver\\chromedriver.exe +driverProperty = webdriver.chrome.driver \ No newline at end of file diff --git a/src/test/resources/features/avito.feature b/src/test/resources/features/avito.feature new file mode 100644 index 0000000..e881c7e --- /dev/null +++ b/src/test/resources/features/avito.feature @@ -0,0 +1,17 @@ +Feature: Avito search + + Scenario Outline: Search for items + Given I am on the Avito homepage + When I select category "" + And I enter "" in the search field + And I click on the regions dropdown + And I enter "" in the region field + And I click on the 'Show n ads' button + And I activate the 'Only with photos' checkbox + And I select "" in the sorting dropdown + Then I should see the prices of the first "" items in the console + + Examples: + | category | StringForSearch | city | sort | quantity | + | PRINTERS | принтер | Владивосток | PRICE_HIGH_TO_LOW | 10 | + | MONITORS | монитор | Иркутск | PRICE_LOW_TO_HIGH | 7 |