diff --git a/src/main/java/org/example/enums/Category.java b/src/main/java/org/example/enums/Category.java index 1df018b..26bcb86 100644 --- a/src/main/java/org/example/enums/Category.java +++ b/src/main/java/org/example/enums/Category.java @@ -13,13 +13,4 @@ public enum Category { 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 index f66529a..ec127fd 100644 --- a/src/main/java/org/example/enums/Sort.java +++ b/src/main/java/org/example/enums/Sort.java @@ -1,7 +1,7 @@ package org.example.enums; public enum Sort { - PRICE_HIGH_TO_LOW( "2"), + PRICE_HIGH_TO_LOW("2"), PRICE_LOW_TO_HIGH("1"); private String selector; @@ -13,13 +13,4 @@ public enum Sort { 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 index 0863c8b..31887b6 100644 --- a/src/main/java/org/example/page/HomePage.java +++ b/src/main/java/org/example/page/HomePage.java @@ -23,14 +23,19 @@ public class HomePage { private Waiters waiters; /** - * Конструктор класса HomePage, который инициализирует драйвер WebDriver и объект Waiters. - * Конструктор используется для создания экземпляра класса HomePage, который представляет - * домашнюю страницу веб-сайта и предоставляет методы для взаимодействия с элементами на этой странице. + * Конструктор класса HomePage, который инициализирует драйвер WebDriver и + * объект Waiters. + * Конструктор используется для создания экземпляра класса HomePage, который + * представляет + * домашнюю страницу веб-сайта и предоставляет методы для взаимодействия с + * элементами на этой странице. * - * @param driver экземпляр WebDriver, используемый для взаимодействия с веб-страницей. + * @param driver экземпляр WebDriver, используемый для взаимодействия с + * веб-страницей. */ public HomePage(WebDriver driver) { - // Инициализация драйвера WebDriver для использования в текущем экземпляре класса + // Инициализация драйвера WebDriver для использования в текущем экземпляре + // класса this.driver = driver; // Создание нового объекта Waiters с переданным драйвером для ожидания элементов this.waiters = new Waiters(driver); @@ -38,19 +43,21 @@ public class HomePage { /** * Метод для перехода на главную страницу сайта Avito, используя WebDriver. - * Метод выполняет переход на указанный URL, который соответствует странице с объявлениями о транспортных средствах в Пензе. + * Метод выполняет переход на указанный URL, который соответствует странице с + * объявлениями о транспортных средствах в Пензе. * */ @Step("Переход на главную страницу") - public void openAvito() { + public void openAvito(String url) { // Переход на указанный URL с помощью WebDriver - driver.get("https://www.avito.ru/penza/transport?cd=1"); + driver.get(url); } /** * Выбор категории "Оргтехника и расходники" в пользовательском интерфейсе. - * Метод выполняет последовательность действий для выбора категории и подкатегории. + * Метод выполняет последовательность действий для выбора категории и + * подкатегории. */ @Step("Выбор категории 'Оргтехника и расходники'") @@ -79,7 +86,8 @@ public class HomePage { /** * Метод для ввода запроса "Принтер" в поле поиска на веб-странице. - * Метод выполняет последовательность действий, включая ожидание доступности поля поиска, + * Метод выполняет последовательность действий, включая ожидание доступности + * поля поиска, * ввод запроса и подтверждение ввода с помощью клавиши Enter. */ @@ -99,7 +107,8 @@ public class HomePage { /** * Метод для активации чекбокса "Новые" на веб-странице. - * Метод выполняет последовательность действий, включая ожидание доступности чекбокса и его активацию. + * Метод выполняет последовательность действий, включая ожидание доступности + * чекбокса и его активацию. */ @Step("Активировать чекбокс “Новые”") @@ -115,14 +124,17 @@ public class HomePage { } /** - * Метод для автоматизации действия по открытию выпадающего списка регионов на странице. + * Метод для автоматизации действия по открытию выпадающего списка регионов на + * странице. */ @Step("Кликнуть по выпадающему списку регионов") public void openLocationChooser() { - // Определение селектора для элемента, представляющего выпадающий список регионов + // Определение селектора для элемента, представляющего выпадающий список + // регионов final var changeLocationSelector = "[data-marker='search-form/change-location']"; - // Ожидание, пока элемент станет кликабельным, чтобы избежать ошибок при попытке клика + // Ожидание, пока элемент станет кликабельным, чтобы избежать ошибок при попытке + // клика waiters.waitForElementToBeClickable(changeLocationSelector); // Нахождение элемента по селектору и выполнение клика по нему driver.findElement(By.cssSelector(changeLocationSelector)).click(); @@ -130,7 +142,8 @@ public class HomePage { /** * Вводит регион "Владивосток" в соответствующее поле на странице. - * Метод автоматизирует процесс ввода региона "Владивосток" в поле поиска региона на странице, + * Метод автоматизирует процесс ввода региона "Владивосток" в поле поиска + * региона на странице, * включая очистку поля, ввод нового значения и выбор предложенного варианта. */ @@ -178,7 +191,8 @@ public class HomePage { /** * Нажимает на кнопку "Показать n объявлений" на странице. - * Метод автоматизирует действие пользователя по нажатию на кнопку "Показать n объявлений". + * Метод автоматизирует действие пользователя по нажатию на кнопку "Показать n + * объявлений". */ @Step("Нажать на кнопку “Показать n объявлений”") @@ -193,7 +207,8 @@ public class HomePage { /** * Выбирает "Дороже" в выпадающем списке сортировки на странице. - * Метод автоматизирует процесс выбора опции "Дороже" в выпадающем списке сортировки, + * Метод автоматизирует процесс выбора опции "Дороже" в выпадающем списке + * сортировки, * что позволяет сортировать объявления по цене в порядке убывания. */ @@ -213,7 +228,8 @@ public class HomePage { /** * Выводит в консоль значение цены первых 5 товаров на странице. - * Данный метод автоматизирует процесс вывода в консоль значений цен первых 5 товаров. + * Данный метод автоматизирует процесс вывода в консоль значений цен первых 5 + * товаров. */ @Step("Вывести в консоль Значение цены первых 5 товаров") diff --git a/src/main/java/org/example/utils/Waiters.java b/src/main/java/org/example/utils/Waiters.java index 704b348..fd63eda 100644 --- a/src/main/java/org/example/utils/Waiters.java +++ b/src/main/java/org/example/utils/Waiters.java @@ -27,6 +27,7 @@ public class Waiters { 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)); } diff --git a/src/test/java/org/example/AvitoTest.java b/src/test/java/org/example/AvitoTest.java index abd662e..3458e38 100644 --- a/src/test/java/org/example/AvitoTest.java +++ b/src/test/java/org/example/AvitoTest.java @@ -1,4 +1,5 @@ package org.example; + import org.example.page.HomePage; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -25,7 +26,7 @@ public class AvitoTest extends BaseTest { @Description("My homework Avito test") @Story("Search printers in Vladivostok") public void testAvitoSearch() { - homePage.openAvito(); + homePage.openAvito("https://www.avito.ru/penza/transport?cd=1"); homePage.makeScreenshot(); homePage.selectCategory("26223"); homePage.makeScreenshot(); diff --git a/src/test/java/org/example/BaseTest.java b/src/test/java/org/example/BaseTest.java index 51c5e94..af15f0c 100644 --- a/src/test/java/org/example/BaseTest.java +++ b/src/test/java/org/example/BaseTest.java @@ -1,4 +1,6 @@ package org.example; +import java.time.Duration; + import org.aeonbits.owner.ConfigFactory; import org.example.config.BaseCofig; import org.openqa.selenium.WebDriver; @@ -37,6 +39,7 @@ public abstract class BaseTest { //открытие страницы Google по url driver.get(config.url()); + driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2)); //разворот окна на полный экран при открытии driver.manage().window().maximize(); } diff --git a/src/test/java/org/example/cucumber/RunCucumberTest.java b/src/test/java/org/example/cucumber/RunCucumberTest.java index afbcc8c..d0740e2 100644 --- a/src/test/java/org/example/cucumber/RunCucumberTest.java +++ b/src/test/java/org/example/cucumber/RunCucumberTest.java @@ -1,23 +1,14 @@ 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"} -) + // задаём тип отчёта. Как именно он будет выглядеть. + 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 index 31f2eb4..ca8c2a9 100644 --- a/src/test/java/org/example/cucumber/steps/MyStepdefs.java +++ b/src/test/java/org/example/cucumber/steps/MyStepdefs.java @@ -1,5 +1,7 @@ package org.example.cucumber.steps; +import java.time.Duration; + import org.aeonbits.owner.ConfigFactory; import org.example.config.BaseCofig; import org.example.enums.Category; @@ -9,6 +11,7 @@ import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import io.cucumber.java.After; +import io.cucumber.java.ParameterType; import io.cucumber.java.en.And; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; @@ -21,25 +24,36 @@ public class MyStepdefs { private HomePage homePage; + @ParameterType(".*") + public Category category(String category) { + return Category.valueOf(category); + } + + @ParameterType(".*") + public Sort sort(String sort) { + return Sort.valueOf(sort); + } + @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().timeouts().implicitlyWait(Duration.ofSeconds(10)); driver.manage().window().maximize(); homePage = new HomePage(driver); - homePage.openAvito(); + homePage.openAvito("https://www.avito.ru/"); } - @When("I select category {string}") - public void iSelectCategory(String category) { - homePage.selectCategory(Category.findByName(category).getSelector()); + @When("I select category {category}") + public void iSelectCategory(Category category) { + homePage.selectCategory(category.getSelector()); } @And("I enter {string} in the search field") - public void iEnterInTheSearchField(String searchString) { - homePage.setSearchQuery(searchString); + public void iEnterInTheSearchField(String query) { + homePage.setSearchQuery(query); } @And("I click on the regions dropdown") @@ -48,8 +62,8 @@ public class MyStepdefs { } @And("I enter {string} in the region field") - public void iEnterInTheRegionField(String location) { - homePage.setLocation(location); + public void iEnterInTheRegionField(String city) { + homePage.setLocation(city); } @And("I click on the 'Show n ads' button") @@ -62,14 +76,14 @@ public class MyStepdefs { homePage.setOnlyNew(); } - @And("I select {string} in the sorting dropdown") - public void iSelectInTheSortingDropdown(String sortType) { - homePage.sort(Sort.findByName(sortType).getSelector()); + @And("I select {sort} in the sorting dropdown") + public void iSelectInTheSortingDropdown(Sort sort) { + homePage.sort(sort.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)); + @Then("I should see the prices of the first {int} items in the console") + public void iShouldSeeThePricesOfTheFirstItemsInTheConsole(int quantity) { + homePage.printPrice(quantity); } @After diff --git a/src/test/resources/features/avito.feature b/src/test/resources/features/avito.feature index e881c7e..997e5fb 100644 --- a/src/test/resources/features/avito.feature +++ b/src/test/resources/features/avito.feature @@ -2,16 +2,16 @@ 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 + 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 + 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 | + | category | query | city | sort | quantity | + | PRINTERS | принтер | Владивосток | PRICE_HIGH_TO_LOW | 10 | + | MONITORS | монитор | Иркутск | PRICE_LOW_TO_HIGH | 7 |