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() {
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

@ -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));
}
}

View File

@ -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 товаров")

View File

@ -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));
}

View File

@ -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();

View File

@ -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();
}

View File

@ -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);
}
}

View File

@ -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

View File

@ -2,16 +2,16 @@ 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
When I select category <category>
And I enter "<query>" 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
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 |
| category | query | city | sort | quantity |
| PRINTERS | принтер | Владивосток | PRICE_HIGH_TO_LOW | 10 |
| MONITORS | монитор | Иркутск | PRICE_LOW_TO_HIGH | 7 |