add fixes
This commit is contained in:
parent
dc40c051b2
commit
62917e9ee1
@ -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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package org.example.enums;
|
package org.example.enums;
|
||||||
|
|
||||||
public enum Sort {
|
public enum Sort {
|
||||||
PRICE_HIGH_TO_LOW( "2"),
|
PRICE_HIGH_TO_LOW("2"),
|
||||||
PRICE_LOW_TO_HIGH("1");
|
PRICE_LOW_TO_HIGH("1");
|
||||||
|
|
||||||
private String selector;
|
private String selector;
|
||||||
@ -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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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 товаров")
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,14 @@
|
|||||||
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(
|
||||||
//папка, где хранится наша фича.
|
// папка, где хранится наша фича.
|
||||||
features = "src/test/resources/features",
|
features = "src/test/resources/features",
|
||||||
//папка, где находятся наши стэпы (шаги).
|
// папка, где находятся наши стэпы (шаги).
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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 |
|
||||||
|
Loading…
Reference in New Issue
Block a user