add fixes

This commit is contained in:
Aleksey Filippov 2024-05-06 22:58:10 +04:00
parent dc40c051b2
commit 62917e9ee1
9 changed files with 80 additions and 72 deletions

View File

@ -13,13 +13,4 @@ public enum Category {
public String getSelector() { public String getSelector() {
return selector; 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));
}
} }

View File

@ -13,13 +13,4 @@ public enum Sort {
public String getSelector() { public String getSelector() {
return selector; 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));
}
} }

View File

@ -23,14 +23,19 @@ public class HomePage {
private Waiters waiters; private Waiters waiters;
/** /**
* Конструктор класса HomePage, который инициализирует драйвер WebDriver и объект Waiters. * Конструктор класса HomePage, который инициализирует драйвер WebDriver и
* Конструктор используется для создания экземпляра класса HomePage, который представляет * объект Waiters.
* домашнюю страницу веб-сайта и предоставляет методы для взаимодействия с элементами на этой странице. * Конструктор используется для создания экземпляра класса HomePage, который
* представляет
* домашнюю страницу веб-сайта и предоставляет методы для взаимодействия с
* элементами на этой странице.
* *
* @param driver экземпляр WebDriver, используемый для взаимодействия с веб-страницей. * @param driver экземпляр WebDriver, используемый для взаимодействия с
* веб-страницей.
*/ */
public HomePage(WebDriver driver) { public HomePage(WebDriver driver) {
// Инициализация драйвера WebDriver для использования в текущем экземпляре класса // Инициализация драйвера WebDriver для использования в текущем экземпляре
// класса
this.driver = driver; this.driver = driver;
// Создание нового объекта Waiters с переданным драйвером для ожидания элементов // Создание нового объекта Waiters с переданным драйвером для ожидания элементов
this.waiters = new Waiters(driver); this.waiters = new Waiters(driver);
@ -38,19 +43,21 @@ public class HomePage {
/** /**
* Метод для перехода на главную страницу сайта Avito, используя WebDriver. * Метод для перехода на главную страницу сайта Avito, используя WebDriver.
* Метод выполняет переход на указанный URL, который соответствует странице с объявлениями о транспортных средствах в Пензе. * Метод выполняет переход на указанный URL, который соответствует странице с
* объявлениями о транспортных средствах в Пензе.
* *
*/ */
@Step("Переход на главную страницу") @Step("Переход на главную страницу")
public void openAvito() { public void openAvito(String url) {
// Переход на указанный URL с помощью WebDriver // Переход на указанный URL с помощью WebDriver
driver.get("https://www.avito.ru/penza/transport?cd=1"); driver.get(url);
} }
/** /**
* Выбор категории "Оргтехника и расходники" в пользовательском интерфейсе. * Выбор категории "Оргтехника и расходники" в пользовательском интерфейсе.
* Метод выполняет последовательность действий для выбора категории и подкатегории. * Метод выполняет последовательность действий для выбора категории и
* подкатегории.
*/ */
@Step("Выбор категории 'Оргтехника и расходники'") @Step("Выбор категории 'Оргтехника и расходники'")
@ -79,7 +86,8 @@ public class HomePage {
/** /**
* Метод для ввода запроса "Принтер" в поле поиска на веб-странице. * Метод для ввода запроса "Принтер" в поле поиска на веб-странице.
* Метод выполняет последовательность действий, включая ожидание доступности поля поиска, * Метод выполняет последовательность действий, включая ожидание доступности
* поля поиска,
* ввод запроса и подтверждение ввода с помощью клавиши Enter. * ввод запроса и подтверждение ввода с помощью клавиши Enter.
*/ */
@ -99,7 +107,8 @@ public class HomePage {
/** /**
* Метод для активации чекбокса "Новые" на веб-странице. * Метод для активации чекбокса "Новые" на веб-странице.
* Метод выполняет последовательность действий, включая ожидание доступности чекбокса и его активацию. * Метод выполняет последовательность действий, включая ожидание доступности
* чекбокса и его активацию.
*/ */
@Step("Активировать чекбокс “Новые”") @Step("Активировать чекбокс “Новые”")
@ -115,14 +124,17 @@ public class HomePage {
} }
/** /**
* Метод для автоматизации действия по открытию выпадающего списка регионов на странице. * Метод для автоматизации действия по открытию выпадающего списка регионов на
* странице.
*/ */
@Step("Кликнуть по выпадающему списку регионов") @Step("Кликнуть по выпадающему списку регионов")
public void openLocationChooser() { public void openLocationChooser() {
// Определение селектора для элемента, представляющего выпадающий список регионов // Определение селектора для элемента, представляющего выпадающий список
// регионов
final var changeLocationSelector = "[data-marker='search-form/change-location']"; final var changeLocationSelector = "[data-marker='search-form/change-location']";
// Ожидание, пока элемент станет кликабельным, чтобы избежать ошибок при попытке клика // Ожидание, пока элемент станет кликабельным, чтобы избежать ошибок при попытке
// клика
waiters.waitForElementToBeClickable(changeLocationSelector); waiters.waitForElementToBeClickable(changeLocationSelector);
// Нахождение элемента по селектору и выполнение клика по нему // Нахождение элемента по селектору и выполнение клика по нему
driver.findElement(By.cssSelector(changeLocationSelector)).click(); driver.findElement(By.cssSelector(changeLocationSelector)).click();
@ -130,7 +142,8 @@ public class HomePage {
/** /**
* Вводит регион "Владивосток" в соответствующее поле на странице. * Вводит регион "Владивосток" в соответствующее поле на странице.
* Метод автоматизирует процесс ввода региона "Владивосток" в поле поиска региона на странице, * Метод автоматизирует процесс ввода региона "Владивосток" в поле поиска
* региона на странице,
* включая очистку поля, ввод нового значения и выбор предложенного варианта. * включая очистку поля, ввод нового значения и выбор предложенного варианта.
*/ */
@ -178,7 +191,8 @@ public class HomePage {
/** /**
* Нажимает на кнопку "Показать n объявлений" на странице. * Нажимает на кнопку "Показать n объявлений" на странице.
* Метод автоматизирует действие пользователя по нажатию на кнопку "Показать n объявлений". * Метод автоматизирует действие пользователя по нажатию на кнопку "Показать n
* объявлений".
*/ */
@Step("Нажать на кнопку “Показать n объявлений”") @Step("Нажать на кнопку “Показать n объявлений”")
@ -193,7 +207,8 @@ public class HomePage {
/** /**
* Выбирает "Дороже" в выпадающем списке сортировки на странице. * Выбирает "Дороже" в выпадающем списке сортировки на странице.
* Метод автоматизирует процесс выбора опции "Дороже" в выпадающем списке сортировки, * Метод автоматизирует процесс выбора опции "Дороже" в выпадающем списке
* сортировки,
* что позволяет сортировать объявления по цене в порядке убывания. * что позволяет сортировать объявления по цене в порядке убывания.
*/ */
@ -213,7 +228,8 @@ public class HomePage {
/** /**
* Выводит в консоль значение цены первых 5 товаров на странице. * Выводит в консоль значение цены первых 5 товаров на странице.
* Данный метод автоматизирует процесс вывода в консоль значений цен первых 5 товаров. * Данный метод автоматизирует процесс вывода в консоль значений цен первых 5
* товаров.
*/ */
@Step("Вывести в консоль Значение цены первых 5 товаров") @Step("Вывести в консоль Значение цены первых 5 товаров")

View File

@ -27,6 +27,7 @@ public class Waiters {
public void waitInputValueToBe(String cssSelector, String text) { public void waitInputValueToBe(String cssSelector, String text) {
wait.until(ExpectedConditions.textToBePresentInElementValue(By.cssSelector(cssSelector), text)); wait.until(ExpectedConditions.textToBePresentInElementValue(By.cssSelector(cssSelector), text));
} }
public void waitTextStartsWith(String cssSelector, String text) { public void waitTextStartsWith(String cssSelector, String text) {
wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector(cssSelector), text)); wait.until(ExpectedConditions.textToBePresentInElementLocated(By.cssSelector(cssSelector), text));
} }

View File

@ -1,4 +1,5 @@
package org.example; package org.example;
import org.example.page.HomePage; import org.example.page.HomePage;
import org.testng.annotations.BeforeMethod; import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test; import org.testng.annotations.Test;
@ -25,7 +26,7 @@ public class AvitoTest extends BaseTest {
@Description("My homework Avito test") @Description("My homework Avito test")
@Story("Search printers in Vladivostok") @Story("Search printers in Vladivostok")
public void testAvitoSearch() { public void testAvitoSearch() {
homePage.openAvito(); homePage.openAvito("https://www.avito.ru/penza/transport?cd=1");
homePage.makeScreenshot(); homePage.makeScreenshot();
homePage.selectCategory("26223"); homePage.selectCategory("26223");
homePage.makeScreenshot(); homePage.makeScreenshot();

View File

@ -1,4 +1,6 @@
package org.example; package org.example;
import java.time.Duration;
import org.aeonbits.owner.ConfigFactory; import org.aeonbits.owner.ConfigFactory;
import org.example.config.BaseCofig; import org.example.config.BaseCofig;
import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebDriver;
@ -37,6 +39,7 @@ public abstract class BaseTest {
//открытие страницы Google по url //открытие страницы Google по url
driver.get(config.url()); driver.get(config.url());
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(2));
//разворот окна на полный экран при открытии //разворот окна на полный экран при открытии
driver.manage().window().maximize(); driver.manage().window().maximize();
} }

View File

@ -1,11 +1,7 @@
package org.example.cucumber; package org.example.cucumber;
import org.testng.annotations.Test;
import io.cucumber.testng.AbstractTestNGCucumberTests; import io.cucumber.testng.AbstractTestNGCucumberTests;
import io.cucumber.testng.CucumberOptions; import io.cucumber.testng.CucumberOptions;
import io.cucumber.testng.FeatureWrapper;
import io.cucumber.testng.PickleWrapper;
@CucumberOptions( @CucumberOptions(
// папка, где хранится наша фича. // папка, где хранится наша фича.
@ -13,11 +9,6 @@ import io.cucumber.testng.PickleWrapper;
// папка, где находятся наши стэпы (шаги). // папка, где находятся наши стэпы (шаги).
glue = "org/example/cucumber/steps", glue = "org/example/cucumber/steps",
// задаём тип отчёта. Как именно он будет выглядеть. // задаём тип отчёта. Как именно он будет выглядеть.
plugin = {"pretty"} plugin = { "pretty" })
)
public class RunCucumberTest extends AbstractTestNGCucumberTests { 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);
}
} }

View File

@ -1,5 +1,7 @@
package org.example.cucumber.steps; package org.example.cucumber.steps;
import java.time.Duration;
import org.aeonbits.owner.ConfigFactory; import org.aeonbits.owner.ConfigFactory;
import org.example.config.BaseCofig; import org.example.config.BaseCofig;
import org.example.enums.Category; import org.example.enums.Category;
@ -9,6 +11,7 @@ import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriver;
import io.cucumber.java.After; import io.cucumber.java.After;
import io.cucumber.java.ParameterType;
import io.cucumber.java.en.And; import io.cucumber.java.en.And;
import io.cucumber.java.en.Given; import io.cucumber.java.en.Given;
import io.cucumber.java.en.Then; import io.cucumber.java.en.Then;
@ -21,25 +24,36 @@ public class MyStepdefs {
private HomePage homePage; 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") @Given("I am on the Avito homepage")
public void iAmOnTheAvitoHomepage() { public void iAmOnTheAvitoHomepage() {
System.setProperty(config.driverProperty(), config.driverPath()); System.setProperty(config.driverProperty(), config.driverPath());
driver = new ChromeDriver(); driver = new ChromeDriver();
driver.get(config.url()); driver.get(config.url());
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
driver.manage().window().maximize(); driver.manage().window().maximize();
homePage = new HomePage(driver); homePage = new HomePage(driver);
homePage.openAvito(); homePage.openAvito("https://www.avito.ru/");
} }
@When("I select category {string}") @When("I select category {category}")
public void iSelectCategory(String category) { public void iSelectCategory(Category category) {
homePage.selectCategory(Category.findByName(category).getSelector()); homePage.selectCategory(category.getSelector());
} }
@And("I enter {string} in the search field") @And("I enter {string} in the search field")
public void iEnterInTheSearchField(String searchString) { public void iEnterInTheSearchField(String query) {
homePage.setSearchQuery(searchString); homePage.setSearchQuery(query);
} }
@And("I click on the regions dropdown") @And("I click on the regions dropdown")
@ -48,8 +62,8 @@ public class MyStepdefs {
} }
@And("I enter {string} in the region field") @And("I enter {string} in the region field")
public void iEnterInTheRegionField(String location) { public void iEnterInTheRegionField(String city) {
homePage.setLocation(location); homePage.setLocation(city);
} }
@And("I click on the 'Show n ads' button") @And("I click on the 'Show n ads' button")
@ -62,14 +76,14 @@ public class MyStepdefs {
homePage.setOnlyNew(); homePage.setOnlyNew();
} }
@And("I select {string} in the sorting dropdown") @And("I select {sort} in the sorting dropdown")
public void iSelectInTheSortingDropdown(String sortType) { public void iSelectInTheSortingDropdown(Sort sort) {
homePage.sort(Sort.findByName(sortType).getSelector()); homePage.sort(sort.getSelector());
} }
@Then("I should see the prices of the first {string} items in the console") @Then("I should see the prices of the first {int} items in the console")
public void iShouldSeeThePricesOfTheFirstItemsInTheConsole(String quantity) { public void iShouldSeeThePricesOfTheFirstItemsInTheConsole(int quantity) {
homePage.printPrice(Integer.parseInt(quantity)); homePage.printPrice(quantity);
} }
@After @After

View File

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