Repository: Nerofanat/sprint_4
Pull request #1: A full-fledged first commit Sprint_4
Author: login: Nerofanat
Created: 2025-02-24T20:53:06Z | Merged: 2025-03-23T21:18:43Z

Мой первый пуллреквест учебного проекта


Diff:
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..da9a681
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,41 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
+
+*.class
+.idea
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..dcb439d
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>org.example</groupId>
+    <artifactId>Project_UI_final</artifactId>
+    <version>1.0-SNAPSHOT</version>
+
+    <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+    <dependencies>
+
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.13.2</version>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.seleniumhq.selenium</groupId>
+            <artifactId>selenium-java</artifactId>
+            <version>LATEST</version>
+        </dependency>
+
+
+    </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/src/main/java/Exceptions/CustomBaseException.java b/src/main/java/Exceptions/CustomBaseException.java
new file mode 100644
index 0000000..7a353f4
--- /dev/null
+++ b/src/main/java/Exceptions/CustomBaseException.java
@@ -0,0 +1,13 @@
+package Exceptions;
+
+public abstract class CustomBaseException extends Exception{
+
+    protected CustomBaseException(String message) {
+        super(message);
+    }
+
+    //protected CustomBaseException(String message, Throwable cause) {
+    //    super(message, cause);
+    //}
+}
+
diff --git a/src/main/java/Exceptions/UndefinedBehaviorException.java b/src/main/java/Exceptions/UndefinedBehaviorException.java
new file mode 100644
index 0000000..ccc85a3
--- /dev/null
+++ b/src/main/java/Exceptions/UndefinedBehaviorException.java
@@ -0,0 +1,9 @@
+package Exceptions;
+
+public class UndefinedBehaviorException extends CustomBaseException {
+
+    public UndefinedBehaviorException(String message) {
+        super(message);
+    }
+
+}
diff --git a/src/main/java/PageObjectPackage/MainPage.java b/src/main/java/PageObjectPackage/MainPage.java
new file mode 100644
index 0000000..2fab122
--- /dev/null
+++ b/src/main/java/PageObjectPackage/MainPage.java
@@ -0,0 +1,42 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class MainPage {
+
+    protected WebDriver driver;
+    //Нижняя кнопка заказа на основной странице
+    //private By mainOrderButtonAtTheBottom = By.xpath(".//button[@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Заказать')]");
+    private By mainOrderButtonAtTheBottom = By.xpath(".//button[contains(@class, 'Button_Middle')]");
+    //Кнопка куков
+    private By cookieButton = By.id("rcc-confirm-button");
+
+    //Получить селектор по номеру вопроса
+    public static By getQuestionidByQuestionNumber(String questionNumber) {
+        return By.id("accordion__heading-".concat(questionNumber));
+    }
+
+    //Получить селектор по номеру ответа
+    public static By getAnsweridByAnswerNumber(String answerNumber) {
+        return By.xpath(".//div [@id = 'accordion__panel-".concat(answerNumber).concat("']/p"));
+    }
+
+    //Конструктор
+    public MainPage(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    //Кликнуть на кнопку заказать
+    public void clickMainOrderButton() {
+        driver.findElement(mainOrderButtonAtTheBottom).click();
+    }
+
+    //Кликнуть на кнопку куки
+    public void clickCookieButton() {
+        if (driver.findElement(cookieButton).isDisplayed()) {
+            driver.findElement(cookieButton).click();
+        }
+    }
+
+}
diff --git a/src/main/java/PageObjectPackage/OrderConfirmationModal.java b/src/main/java/PageObjectPackage/OrderConfirmationModal.java
new file mode 100644
index 0000000..74775a9
--- /dev/null
+++ b/src/main/java/PageObjectPackage/OrderConfirmationModal.java
@@ -0,0 +1,26 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class OrderConfirmationModal {
+
+    private WebDriver driver;
+    //Само модальное окошко
+    private By modalYesNo = By.xpath(".//div [contains(@class, 'Order_ModalHeader')]");
+    //Кнопка "Да"
+    private By yesButton = By.xpath(".//button [contains(text(), 'Да')]");
+
+
+    public By getModalYesNo() {
+        return modalYesNo;
+    }
+
+    public OrderConfirmationModal(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    public void clickYes() {
+        driver.findElement(yesButton).click();
+    }
+}
diff --git a/src/main/java/PageObjectPackage/OrderStatus.java b/src/main/java/PageObjectPackage/OrderStatus.java
new file mode 100644
index 0000000..dff328c
--- /dev/null
+++ b/src/main/java/PageObjectPackage/OrderStatus.java
@@ -0,0 +1,42 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class OrderStatus {
+
+    //Текст  имени и фамилии на странице
+    public String textName;
+    public String textSurname;
+
+    private WebDriver driver;
+    //Поле ввода номера заказа для поиска
+    private By inputOrderNumber = By.className("Input_Input__1iN_Z.Track_Input__1g7lq.Input_Responsible__1jDKN");
+    //Кнопка для поиска по номеру заказа
+    private By searchButton = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Посмотреть')]");
+    //Кнопка для отмены заказа
+    private By orderCancellation = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Отменить заказ')]");
+    //Картинка с предупреждением что заказ не найден
+    private By PictureThereIsNoSuchOrder = By.xpath(".//img [@src = '/assets/not-found.png']");
+    // Селекторы полей из информации по заказу (проверю ради интереса имя и фамилию)
+    // имя
+    private By name = By.xpath(".//div[contains (@class, 'Track_Row')]/div[contains(text(), 'Имя')]/following-sibling::div[contains (@class, 'Track_Value')]");
+    //фамилия
+    private By surname = By.xpath(".//div[contains (@class, 'Track_Row')]/div[contains(text(), 'Фамилия')]/following-sibling::div[contains (@class, 'Track_Value')]");
+
+    public OrderStatus(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    public boolean PictureThereIsNoSuchOrderIsDisplayed() {
+        return driver.findElement(PictureThereIsNoSuchOrder).isDisplayed();
+    }
+
+    //Получить текст из имени и фамилии
+    public void textNameAndSurname() {
+        textName = driver.findElement(name).getText();
+        textSurname = driver.findElement(surname).getText();
+    }
+
+
+}
diff --git a/src/main/java/PageObjectPackage/RentalDetails.java b/src/main/java/PageObjectPackage/RentalDetails.java
new file mode 100644
index 0000000..1d8412a
--- /dev/null
+++ b/src/main/java/PageObjectPackage/RentalDetails.java
@@ -0,0 +1,75 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class RentalDetails {
+
+    private WebDriver driver;
+
+
+    //Сама форма
+    private By rentalDetailsWindow = By.xpath(".//div[@class = 'Order_Header__BZXOb' and contains(text(), 'Про аренду')]");
+    //Когда привезти самокат
+    private By whenToBringTheScooter = By.xpath(".//input[@placeholder = '* Когда привезти самокат']");
+    //нужный день в календаре
+    private By rightDay = By.className("react-datepicker__day--selected");
+    //Период аренды
+    private By rentalPeriod = By.className("Dropdown-root");
+    //Цвет
+    private By colorSelection = By.className("Order_Checkboxes__3lWSI");
+    //Цвет черный жемчуг
+    private By blackPearl = By.id("black");
+    //Цвет серая безысходность
+    private By grey = By.id("grey");
+    //Комментарий для курьера
+    private By comment = By.xpath(".//input[@placeholder = 'Комментарий для курьера']");
+    //Кнопка Заказать
+    private By orderButton = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Заказать')]");
+
+    public RentalDetails(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    //Получить селектор по номеру дня (с иключениями не заморачивался)
+    public static By getDaySelector(int dayNamber) {
+        int dayNumber = dayNamber;
+        String[] dayNames = {
+                "сутки",
+                "двое суток",
+                "трое суток",
+                "четверо суток",
+                "пятеро суток",
+                "шестеро суток",
+                "семеро суток"
+        };
+
+        return By.xpath(".//div[contains(text(), '" + dayNames[dayNumber - 1] + "')]");
+    }
+
+    public By getRentalDetailsWindow() {
+        return rentalDetailsWindow;
+    }
+
+    public void fillOutRentalDetailsForm(String whenToBring, int period, String color, String yoursComment) {
+        driver.findElement(whenToBringTheScooter).clear();
+        driver.findElement(whenToBringTheScooter).sendKeys(whenToBring);
+        driver.findElement(rightDay).click();
+        driver.findElement(rentalPeriod).click();
+
+        driver.findElement(getDaySelector(period)).click();
+
+        if (color.contains("жемчуг")) {
+            driver.findElement(blackPearl).click();
+        } else {
+            //не знаю как в данном случае лучше поступить (мб нужно вернуть ошибку)
+            driver.findElement(grey).click();
+        }
+
+        driver.findElement(comment).clear();
+        driver.findElement(comment).sendKeys(yoursComment);
+        driver.findElement(orderButton).click();
+
+    }
+
+}
diff --git a/src/main/java/PageObjectPackage/SiteHeader.java b/src/main/java/PageObjectPackage/SiteHeader.java
new file mode 100644
index 0000000..90199d4
--- /dev/null
+++ b/src/main/java/PageObjectPackage/SiteHeader.java
@@ -0,0 +1,63 @@
+package PageObjectPackage;
+
+import net.bytebuddy.implementation.bind.annotation.Super;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class SiteHeader extends MainPage {
+
+    //лого Яндекса
+    private By logoYandex;
+    //лого Самоката
+    private By logoScooter;
+    //Кнопка заказа
+    private By orderButtonAtTheTop;
+    //Кнопка статуса заказа Header_Link__1TAG7
+    private By orderStatusButton;
+    //поле ввода номера заказа в шапке
+    private By orderNumber;
+    //странная кнопка GO
+    private By goButton;
+
+    public SiteHeader(WebDriver driver) {
+        super(driver);
+        this.logoYandex = By.className("Header_LogoYandex__3TSOI");
+        this.logoScooter = By.className("Header_LogoScooter__3lsAR");
+        this.orderButtonAtTheTop = By.xpath(".//div[@class = 'Header_Nav__AGCXC']/button[@class = 'Button_Button__ra12g']");
+        this.orderStatusButton = By.xpath(".//div[@class = 'Header_Nav__AGCXC']/button[@class = 'Header_Link__1TAG7']");
+        this.orderNumber = By.xpath(".//input[@class = 'Input_Input__1iN_Z Header_Input__xIoUq' and @placeholder = 'Введите номер заказа']");
+        this.goButton = By.xpath(".//button[@class = 'Button_Button__ra12g Header_Button__28dPO' and contains (text(), 'Go!')]");
+    }
+
+    public By getOrderNumber() {
+        return orderNumber;
+    }
+
+    public void clickLogoYandex() {
+        driver.findElement(logoYandex).click();
+    }
+
+    public void clickLogoScooter() {
+        driver.findElement(logoScooter).click();
+    }
+
+    public void clickOrderStatusButton() {
+        driver.findElement(orderStatusButton).click();
+    }
+
+    public void clickOrderButtonAtTheTop() {
+        driver.findElement(orderButtonAtTheTop).click();
+    }
+
+    //Метод на ввод номера заказа в поле
+    public void enterTheOrderNumber(String number) {
+        driver.findElement(orderNumber).sendKeys(number);
+    }
+
+    //Метод нажатия на кнопку Go
+    public void clickGoButton() {
+        driver.findElement(goButton).click();
+    }
+
+
+}
diff --git a/src/main/java/PageObjectPackage/StatusModal.java b/src/main/java/PageObjectPackage/StatusModal.java
new file mode 100644
index 0000000..80a8653
--- /dev/null
+++ b/src/main/java/PageObjectPackage/StatusModal.java
@@ -0,0 +1,42 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class StatusModal {
+    private WebDriver driver;
+    // Кнопка "Посмотреть статус"
+    private By statusButton = By.xpath(".//button [contains(text(), 'Посмотреть статус')]");
+    // Само окошко
+    private By modalStatus = By.xpath(".//div[@class = 'Order_ModalHeader__3FDaJ' and contains(text(), 'оформлен')]");
+
+    public StatusModal(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    // Для использования в ожиданиях
+    public By getModalStatus() {
+        return modalStatus;
+    }
+
+    // Кликнуть на кнопку "Посмотреть статус"
+    public void clickStatusButton() {
+        driver.findElement(statusButton).click();
+    }
+
+    // Попытка найти и проверить отображение окошка
+    /* Мы еще не проходили конструкцию эту, но я не придумал как это можно
+    сделать известными средствами, ведь нужно чтобы тест проверил наличие окошка, а если мы не найдем его на этом этапе,
+    то мы не сможем попасть на условия теста на ассерт и не получаем нормально сообщение об ошибке */
+
+    public boolean modalStatusBoolean() {
+        try {
+            return driver.findElement(modalStatus).isDisplayed();
+        } catch (org.openqa.selenium.NoSuchElementException e) {
+            //Обрабатываем ошибку исключение и теперь, если элемент не найден, возвращаем false
+            return false;
+        }
+    }
+
+
+}
diff --git a/src/main/java/PageObjectPackage/WhoIsTheScooterFor.java b/src/main/java/PageObjectPackage/WhoIsTheScooterFor.java
new file mode 100644
index 0000000..c0adeef
--- /dev/null
+++ b/src/main/java/PageObjectPackage/WhoIsTheScooterFor.java
@@ -0,0 +1,100 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class WhoIsTheScooterFor {
+
+    private WebDriver driver;
+    public String textName;
+    public String textSurname;
+    private By name = By.xpath(".//input[@placeholder = '* Имя']");
+    private By surname = By.xpath(".//input[@placeholder = '* Фамилия']");
+    private By address = By.xpath(".//input[@placeholder = '* Адрес: куда привезти заказ']");
+    private By metroStation = By.xpath(".//input[@placeholder = '* Станция метро']");
+    //Выпадашка со списком станций
+    private By listMetroStation = By.className("select-search__select");
+    private By phoneNumber = By.xpath(".//input[@placeholder = '* Телефон: на него позвонит курьер']");
+    private By buttonNext = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Далее')]");
+
+    public By getErrorName() {
+        return errorName;
+    }
+
+    private By errorName = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректное имя')]");
+
+    public By getErrorSurname() {
+        return errorSurname;
+    }
+
+    private By errorSurname = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректную фамилию')]");
+
+    public By getErrorAddress() {
+        return errorAddress;
+    }
+
+    private By errorAddress = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный адрес')]");
+
+    public By getErrorMetroStation() {
+        return errorMetroStation;
+    }
+
+    private By errorMetroStation = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Выберите станцию')]");
+
+    public By getErrorPhoneNumber() {
+        return errorPhoneNumber;
+    }
+
+    private By errorPhoneNumber = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный номер')]");
+
+
+    public WhoIsTheScooterFor(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    //Метод для сокращения метода fillOutTheOrderForm
+    private void fillField(By field, String value) {
+        driver.findElement(field).clear();
+        driver.findElement(field).sendKeys(value);
+    }
+
+    //Заполнить форму "Для кого самокат" и перейти к след форме
+    public void fillOutTheOrderForm(String yoursName, String yoursSurname, String yoursAddress, String yoursMetro, String yoursNumber) {
+        fillField(name, yoursName);
+        fillField(surname, yoursSurname);
+        fillField(address, yoursAddress);
+        fillField(metroStation, yoursMetro);
+        //Выбрать из списка введенное значение и кликнуть на него
+        //driver.findElement(listMetroStation).findElement(By.xpath("//button[contains(text(), '" + yoursMetro + "') and @value = '1']")).click();
+        driver.findElement(listMetroStation).findElement(By.xpath("//ul[@class='select-search__options']/li[1]")).click();
+        fillField(phoneNumber, yoursNumber);
+        //Получить поля Имя Фамилия и записать их в переменные
+        this.textSurname = yoursSurname;
+        this.textName = yoursName;
+        //Кликнуть по кнопке далее
+        driver.findElement(buttonNext).click();
+    }
+
+    //Метод используется для проверки предупреждений об ошибках 1 формы
+    public void fillOutTheOrderFormExceptForTheMetroStation(String yoursName, String yoursSurname, String yoursAddress, String yoursNumber) {
+        fillField(name, yoursName);
+        fillField(surname, yoursSurname);
+        fillField(address, yoursAddress);
+        fillField(phoneNumber, yoursNumber);
+        //Кликнуть по кнопке далее
+        driver.findElement(buttonNext).click();
+    }
+
+    public void buttonNextClick() {
+        driver.findElement(buttonNext).click();
+    }
+
+    public boolean errorTextFieldIsDisplayed(By textField) {
+        try {
+            return driver.findElement(textField).isDisplayed();
+        } catch (org.openqa.selenium.NoSuchElementException e) {
+            return false;
+        }
+    }
+
+}
diff --git a/src/main/java/Provision/BrowserInitialization.java b/src/main/java/Provision/BrowserInitialization.java
new file mode 100644
index 0000000..5e54c80
--- /dev/null
+++ b/src/main/java/Provision/BrowserInitialization.java
@@ -0,0 +1,44 @@
+package Provision;
+
+import Exceptions.UndefinedBehaviorException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import Provision.Enum.*;
+
+import static Provision.Constants.TESTING_SITE_URL;
+
+
+public class BrowserInitialization {
+
+    private static WebDriver driver;
+
+    //Создаем список нужных нам браузеров
+    public static final BrowserType[] browserList = BrowserType.values();
+
+    //Основной метод инициализации браузера
+    public static WebDriver getBrowserDriver(BrowserType browser) throws UndefinedBehaviorException {
+        switch (browser) {
+            case CHROME:
+                driver = new ChromeDriver();
+                break;
+            case FIREFOX:
+                driver = new FirefoxDriver();
+                break;
+            default:
+                throw new UndefinedBehaviorException("В метод getBrowserDriver передан неизвестный браузер " + browser);
+        }
+        return driver;
+    }
+
+    public static void goToUrl(WebDriver driver) {
+        driver.navigate().to(TESTING_SITE_URL);
+    }
+    //Не знал о существовании такого подхода, указывал путь к драйверам черещ переменные  сисетмные, так выглядит более удобно. пусит лежит тут
+    //public static void setLocalPathsToDrivers() {
+    //    System.setProperty("webdriver.chrome.driver", "E:/AutotestDrivers/chromedriver-win64-133/chromedriver.exe");
+    //    System.setProperty("webdriver.gecko.driver", "E:/AutotestDrivers/FireFoxDriver/geckodriver.exe");
+    //}
+
+
+}
diff --git a/src/main/java/Provision/Constants.java b/src/main/java/Provision/Constants.java
new file mode 100644
index 0000000..6e9874c
--- /dev/null
+++ b/src/main/java/Provision/Constants.java
@@ -0,0 +1,5 @@
+package Provision;
+
+public class Constants {
+    public static final String TESTING_SITE_URL = "https://qa-scooter.praktikum-services.ru/";
+}
diff --git a/src/main/java/Provision/Enum.java b/src/main/java/Provision/Enum.java
new file mode 100644
index 0000000..c390de1
--- /dev/null
+++ b/src/main/java/Provision/Enum.java
@@ -0,0 +1,11 @@
+package Provision;
+
+public class Enum {
+    public enum BrowserType {
+        FIREFOX,
+        CHROME
+
+    }
+}
+
+
diff --git a/src/main/java/Provision/WaitUtils.java b/src/main/java/Provision/WaitUtils.java
new file mode 100644
index 0000000..a4d9297
--- /dev/null
+++ b/src/main/java/Provision/WaitUtils.java
@@ -0,0 +1,20 @@
+package Provision;
+
+import org.openqa.selenium.TimeoutException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.ExpectedCondition;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+//универсальный метод для работы с исключениями при ожиданиях
+public class WaitUtils {
+    public static void waitForCondition(WebDriver driver, ExpectedCondition<?> condition, int timeout, String message) {
+        try {
+            new WebDriverWait(driver, Duration.ofSeconds(timeout))
+                    .until(condition);
+        } catch (TimeoutException e) {
+            System.out.println(message != null ? message : "Ожидание завершилось неудачно");
+        }
+    }
+}
diff --git a/src/test/java/CheckingForFormErrorsAdditionalScenariosTest.java b/src/test/java/CheckingForFormErrorsAdditionalScenariosTest.java
new file mode 100644
index 0000000..2d610df
--- /dev/null
+++ b/src/test/java/CheckingForFormErrorsAdditionalScenariosTest.java
@@ -0,0 +1,54 @@
+import Exceptions.UndefinedBehaviorException;
+import PageObjectPackage.MainPage;
+import PageObjectPackage.WhoIsTheScooterFor;
+import Provision.BrowserInitialization;
+import Provision.Enum;
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+
+import static org.junit.Assert.assertEquals;
+
+public class CheckingForFormErrorsAdditionalScenariosTest {
+
+    private WebDriver driver;
+
+    //Проверяем ошибки первой формы( это доп задание, так что решил просто первую форму проверить)
+    @Test
+    public void checkForTheFirstFormErrorsTest() throws UndefinedBehaviorException {
+
+        //Создаем вебдрайвер
+        driver = BrowserInitialization.getBrowserDriver(Enum.BrowserType.FIREFOX);
+        BrowserInitialization.goToUrl(driver);
+
+        //Начинаем оформление на главной странице
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+        page.clickMainOrderButton();
+
+        // Жмем на кнопку далее
+        WhoIsTheScooterFor scooterForYou = new WhoIsTheScooterFor(driver);
+        scooterForYou.buttonNextClick();
+
+        //Проверяем появление ошибок
+        boolean actualNameError = scooterForYou.errorTextFieldIsDisplayed(scooterForYou.getErrorName());
+        boolean actualSurnameError = scooterForYou.errorTextFieldIsDisplayed(scooterForYou.getErrorSurname());
+        boolean actualAddressError = scooterForYou.errorTextFieldIsDisplayed(scooterForYou.getErrorAddress());
+        boolean actualMetroStationError = scooterForYou.errorTextFieldIsDisplayed(scooterForYou.getErrorMetroStation());
+        boolean actualPhoneNumberError = scooterForYou.errorTextFieldIsDisplayed(scooterForYou.getErrorPhoneNumber());
+        boolean expectedError = true;
+
+        //Может тут просто ассерт использовать, но тогда не получится всучить сообщение об ошибке
+        assertEquals("Не отображается ошибка о некорректном вводе Имени", expectedError, actualNameError);
+        assertEquals("Не отображается ошибка о некорректном вводе Фамилии", expectedError, actualSurnameError);
+        assertEquals("Не отображается ошибка о некорректном вводе Адреса", expectedError, actualAddressError);
+        assertEquals("Не отображается ошибка о некорректном вводе Станции метро", expectedError, actualMetroStationError);
+        assertEquals("Не отображается ошибка о некорректном вводе Номера телефона", expectedError, actualPhoneNumberError);
+
+    }
+
+    @After
+    public void teardown() {
+        driver.quit();
+    }
+}
diff --git a/src/test/java/ClickLogoAdditionalScenariosTest.java b/src/test/java/ClickLogoAdditionalScenariosTest.java
new file mode 100644
index 0000000..fe3d43e
--- /dev/null
+++ b/src/test/java/ClickLogoAdditionalScenariosTest.java
@@ -0,0 +1,73 @@
+import Exceptions.UndefinedBehaviorException;
+import Provision.BrowserInitialization;
+import Provision.Enum;
+import Provision.WaitUtils;
+import org.openqa.selenium.WebDriver;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import PageObjectPackage.*;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class ClickLogoAdditionalScenariosTest {
+
+    private WebDriver driver;
+
+    //Переход по клику на лого самоката на главную
+    @Test
+    public void clickScooterGoToTheMainPage() throws UndefinedBehaviorException {
+
+        driver = BrowserInitialization.getBrowserDriver(Enum.BrowserType.FIREFOX);
+        BrowserInitialization.goToUrl(driver);
+
+        SiteHeader header = new SiteHeader(driver);
+        header.clickLogoScooter();
+
+        // Получаем список всех открытых вкладок браузера и переключаемся на первую
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(0));
+
+        // Ожидаем нужный нам урл
+        WaitUtils.waitForCondition(driver, ExpectedConditions.urlToBe("https://qa-scooter.praktikum-services.ru/"), 2, "Не дождались URL 'https://qa-scooter.praktikum-services.ru/'");
+
+        String expectedUrl = "https://qa-scooter.praktikum-services.ru/";
+        String actual = driver.getCurrentUrl();
+
+        assertEquals(actual, expectedUrl);
+
+    }
+
+    //Переход по клику на лого Яндекса на главную Яндекса
+    @Test
+    public void checkClickYandexGoToTheMainPageTest() throws UndefinedBehaviorException {
+
+        driver = BrowserInitialization.getBrowserDriver(Enum.BrowserType.FIREFOX);
+        BrowserInitialization.goToUrl(driver);
+
+
+        // Клик по кнопке + Переключение на новую вкладку
+        SiteHeader header = new SiteHeader(driver);
+        header.clickLogoYandex();
+
+        // Получаем список всех открытых вкладок браузера и переключаемся на вторую
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(1));
+
+        // Ожидаем нужный нам урл
+        WaitUtils.waitForCondition(driver, ExpectedConditions.urlToBe("https://dzen.ru/?yredirect=true"), 2, "Не дождались URL 'https://dzen.ru/?yredirect=true'");
+
+        String expectedUrl = driver.getCurrentUrl();
+        String actual = "https://dzen.ru/?yredirect=true";
+
+        assertEquals(actual, expectedUrl);
+
+    }
+
+    @After
+    public void teardown() {
+        driver.quit();
+    }
+}
diff --git a/src/test/java/IncorrectOrderNumberAdditionalScenariosTest.java b/src/test/java/IncorrectOrderNumberAdditionalScenariosTest.java
new file mode 100644
index 0000000..7ffd5f4
--- /dev/null
+++ b/src/test/java/IncorrectOrderNumberAdditionalScenariosTest.java
@@ -0,0 +1,57 @@
+import Exceptions.UndefinedBehaviorException;
+import PageObjectPackage.MainPage;
+import PageObjectPackage.OrderStatus;
+import PageObjectPackage.SiteHeader;
+import Provision.BrowserInitialization;
+import Provision.Enum;
+import Provision.WaitUtils;
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class IncorrectOrderNumberAdditionalScenariosTest {
+    private WebDriver driver;
+
+    @Test
+    public void checkIncorrectOrderNumberTest() throws UndefinedBehaviorException {
+
+        driver = BrowserInitialization.getBrowserDriver(Enum.BrowserType.CHROME);
+
+        MainPage main = new MainPage(driver);
+        SiteHeader header = new SiteHeader(driver);
+        OrderStatus status = new OrderStatus(driver);
+
+        BrowserInitialization.goToUrl(driver);
+        main.clickCookieButton();
+        header.clickOrderStatusButton();
+
+        WaitUtils.waitForCondition(driver, ExpectedConditions.elementToBeClickable(header.getOrderNumber()), 5, "Не открылось окно стутуса заказа");
+        header.enterTheOrderNumber("88005553535");
+
+        header.clickGoButton();
+
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(0));
+
+        String expectedUrl = driver.getCurrentUrl();
+        String actualUrl = "https://qa-scooter.praktikum-services.ru/track?t=88005553535";
+
+        assertEquals("Не открылась страница статуса заказа", actualUrl, expectedUrl);
+
+        //тут проверить что картинка c предупреждением есть
+        boolean expected = status.PictureThereIsNoSuchOrderIsDisplayed();
+        assert expected;
+
+    }
+
+    @After
+    public void teardown() {
+        driver.quit();
+    }
+
+}
diff --git a/src/test/java/OrderingScooterTest.java b/src/test/java/OrderingScooterTest.java
new file mode 100644
index 0000000..f67e245
--- /dev/null
+++ b/src/test/java/OrderingScooterTest.java
@@ -0,0 +1,145 @@
+import Exceptions.UndefinedBehaviorException;
+import PageObjectPackage.MainPage;
+import Provision.BrowserInitialization;
+import Provision.WaitUtils;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.openqa.selenium.WebDriver;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import PageObjectPackage.*;
+
+import static org.junit.Assert.*;
+
+import Provision.Enum.*;
+
+@RunWith(Parameterized.class)
+public class OrderingScooterTest {
+
+    private WebDriver driver;
+    private final BrowserType browser;
+    private final String button;
+
+    //Улучшенный конструктор который умеет в ловлю исключения для случая, когда переданное значение не из enum
+    public OrderingScooterTest(Object browser, String button) {
+        try {
+            this.browser = (BrowserType) browser;
+        } catch (ClassCastException e) {
+            throw new ClassCastException("Неверный тип браузера");
+        }
+        this.button = button;
+    }
+
+    @Parameterized.Parameters(name = "{index}: browser={0}, button={1}")
+    public static Object[][] browserAndButton() {
+
+        return new Object[][]{
+                //{BrowserType.CHROME, "UP"},
+                //{BrowserType.CHROME, "DOWN"},
+                //{BrowserType.FIREFOX, "UP"},
+                {BrowserType.FIREFOX, "DOWN"},
+        };
+    }
+
+    @Test
+    public void checkMakingAnOrderTest() throws UndefinedBehaviorException {
+
+        //Инициализируем браузер и переходим по ссылке
+        driver = BrowserInitialization.getBrowserDriver(browser);
+        BrowserInitialization.goToUrl(driver);
+
+        //Начинаем оформление на главной странице
+        MainPage page = new MainPage(driver);
+        SiteHeader headerUp = new SiteHeader(driver);
+        page.clickCookieButton();
+
+        //Логика в зависимости от выбора кнопки
+        switch (button) {
+            case "UP":
+                page.clickMainOrderButton();
+                break;
+            case "DOWN":
+                headerUp.clickOrderButtonAtTheTop();
+                break;
+            default:
+                throw new UndefinedBehaviorException("Кнопки " + button + " не ожидается в тесте, ожидаем значение UP или DOWN");
+        }
+
+        //Заполняем первую форму
+        WhoIsTheScooterFor scooterForYou = new WhoIsTheScooterFor(driver);
+        scooterForYou.fillOutTheOrderForm("Даниил", "Кондрашов", "Рязанские просторы", "Красные Ворота", "89969108932");
+
+        //Ждем открытия второй формы и заполняем вторую форму
+        RentalDetails rentalForYou = new RentalDetails(driver);
+        WaitUtils.waitForCondition(driver, ExpectedConditions.numberOfElementsToBe(rentalForYou.getRentalDetailsWindow(), 1), 3, "Форма RentalDetailsWindow не обнаружена");
+        rentalForYou.fillOutRentalDetailsForm("12", 3, "серая", "Пробуем ввести комментарий");
+
+        //Ждем появление модального окна и кликаем по кнопке "Да" в модальном окне... и ловим блокер
+        OrderConfirmationModal confirmationModal = new OrderConfirmationModal(driver);
+        WaitUtils.waitForCondition(driver, ExpectedConditions.numberOfElementsToBe(confirmationModal.getModalYesNo(), 1), 3, "Модальное окно confirmationModal не появилось");
+        confirmationModal.clickYes();
+
+        //проверяем наличие окна об успешном заказе самоката
+        StatusModal modalWindow = new StatusModal(driver);
+        WaitUtils.waitForCondition(driver, ExpectedConditions.numberOfElementsToBe(modalWindow.getModalStatus(), 1), 3, "Модальное окошко об успешном заказе не появилось");
+
+        boolean actualResult = modalWindow.modalStatusBoolean();
+        assertTrue("Модальное окно, подтверждающее оформление заказа, не появилось", actualResult);
+
+    }
+
+
+    // дополнительный тест (ради интереса) в мозиле где проверяю что имя и фамилия которые я ввел корректно отображаются на странице информации о заказе
+    @Test
+    public void checkMatchingTheSpecifiedDataToThoseDisplayedOnOrderStatusTest() throws UndefinedBehaviorException {
+
+        //Инициализируем браузер и переходим по ссылке
+        driver = BrowserInitialization.getBrowserDriver(browser);
+        BrowserInitialization.goToUrl(driver);
+
+        //Начинаем оформление на главной странице
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+        SiteHeader headerUp = new SiteHeader(driver);
+        headerUp.clickOrderButtonAtTheTop();
+
+        //Заполняем первую форму
+        WhoIsTheScooterFor scooterForYou = new WhoIsTheScooterFor(driver);
+        scooterForYou.fillOutTheOrderForm("Даниил", "Кондрашов", "Рязанские просторы", "Красные Ворота", "89969108932");
+
+        //Ждем открытия второй формы и заполняем вторую форму
+        RentalDetails rentalForYou = new RentalDetails(driver);
+        WaitUtils.waitForCondition(driver, ExpectedConditions.numberOfElementsToBe(rentalForYou.getRentalDetailsWindow(), 1), 3, "Форма RentalDetailsWindow не обнаружена");
+        rentalForYou.fillOutRentalDetailsForm("12", 3, "серая", "Пробуем ввести комментарий");
+
+        //Ждем появление модального окна и кликаем по кнопке "Да" в модальном окне... и ловим блокер
+        OrderConfirmationModal confirmationModal = new OrderConfirmationModal(driver);
+        WaitUtils.waitForCondition(driver, ExpectedConditions.numberOfElementsToBe(confirmationModal.getModalYesNo(), 1), 3, "Модальное окно не появилось");
+        confirmationModal.clickYes();
+
+        //проверяем наличие окна об успешном заказе самоката
+        StatusModal modalWindow = new StatusModal(driver);
+        WaitUtils.waitForCondition(driver, ExpectedConditions.numberOfElementsToBe(modalWindow.getModalStatus(), 1), 3, "Модальное окошко об успешном заказе не появилось");
+        modalWindow.clickStatusButton();
+
+        //Получить имя и фамилию отображаемые на странице заказа
+        OrderStatus orderWindow = new OrderStatus(driver);
+
+        // !!!!!!!!!! Потом добавить ожидание (если захочется)
+        orderWindow.textNameAndSurname();
+
+        //СРавниваем имена (Нужно точно получить текст элемента)
+        assertEquals(scooterForYou.textName, orderWindow.textName);
+
+        //Сравниваем фамилию
+        assertEquals(scooterForYou.textSurname, orderWindow.textSurname);
+
+    }
+
+    @After
+    public void teardown() {
+        driver.quit();
+    }
+}
+
diff --git a/src/test/java/QuestionsAboutTheImportantTest.java b/src/test/java/QuestionsAboutTheImportantTest.java
new file mode 100644
index 0000000..3e191eb
--- /dev/null
+++ b/src/test/java/QuestionsAboutTheImportantTest.java
@@ -0,0 +1,98 @@
+import Exceptions.UndefinedBehaviorException;
+import PageObjectPackage.MainPage;
+import Provision.BrowserInitialization;
+import Provision.Enum;
+import Provision.WaitUtils;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import static org.junit.Assert.*;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+
+@RunWith(Parameterized.class)
+public class QuestionsAboutTheImportantTest {
+
+    private WebDriver driver;
+
+    //Кнопку на которую мы хотим нажать
+    private final Enum.BrowserType browser;
+
+    private final String[][] theTextBeingCompared = new String[][]{
+            {"0", "Сутки — 400 рублей. Оплата курьеру — наличными или картой."},
+            {"1", "Пока что у нас так: один заказ — один самокат. Если хотите покататься с друзьями, можете просто сделать несколько заказов — один за другим."},
+            {"2", "Допустим, вы оформляете заказ на 8 мая. Мы привозим самокат 8 мая в течение дня. Отсчёт времени аренды начинается с момента, когда вы оплатите заказ курьеру. Если мы привезли самокат 8 мая в 20:30, суточная аренда закончится 9 мая в 20:30."},
+            {"3", "Только начиная с завтрашнего дня. Но скоро станем расторопнее."},
+            {"4", "Пока что нет! Но если что-то срочное — всегда можно позвонить в поддержку по красивому номеру 1010."},
+            {"5", "Самокат приезжает к вам с полной зарядкой. Этого хватает на восемь суток — даже если будете кататься без передышек и во сне. Зарядка не понадобится."},
+            {"6", "Да, пока самокат не привезли. Штрафа не будет, объяснительной записки тоже не попросим. Все же свои."},
+            {"7", "Да, обязательно. Всем самокатов! И Москве, и Московской области."},
+    };
+
+    public QuestionsAboutTheImportantTest(Enum.BrowserType browser) {
+        this.browser = browser;
+    }
+
+
+    @Parameterized.Parameters
+    public static Object[] browser() {
+        return BrowserInitialization.browserList;
+    }
+
+
+    @Test
+    public void checkQuestionsAboutTheImportantFirefoxTest() throws UndefinedBehaviorException {
+        checkQuestionsAboutTheImportant(browser);
+    }
+
+    private void checkQuestionsAboutTheImportant(Enum.BrowserType browser) throws UndefinedBehaviorException {
+
+        driver = BrowserInitialization.getBrowserDriver(browser);
+        BrowserInitialization.goToUrl(driver);
+
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+
+
+        for (String[] elements : theTextBeingCompared) {
+
+            By questionId = MainPage.getQuestionidByQuestionNumber(elements[0]);
+            By answerId = MainPage.getAnsweridByAnswerNumber(elements[0]);
+            String expectedText = elements[1];
+
+            WebElement question = driver.findElement(questionId);
+
+            //Подскролл к списку вопросов
+            ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", question);
+
+            //Ждем когда появятся на экране вопросы
+            WaitUtils.waitForCondition(driver, ExpectedConditions.elementToBeClickable(questionId), 5, "Вопрос " + questionId + " на экране не отображается");
+
+            //Кликнуть на вопрос
+            driver.findElement(questionId).click();
+
+            //Ждем открытия выпадашки с ответом
+            WaitUtils.waitForCondition(driver, ExpectedConditions.visibilityOfElementLocated(answerId), 3, "Выпадашка с ответом" + answerId + "не отображается");
+
+            //Получаем фактический ответ
+            String actual = driver.findElement(answerId).getText();
+
+            //Сравниваем ожидаемый и фактический результат
+            assertEquals(expectedText, actual);
+        }
+
+    }
+
+    @After
+    public void teardown() {
+        driver.quit();
+    }
+}
+


Reviews:
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-26T15:21:02Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-26T15:42:22Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-28T15:36:17Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-28T15:56:55Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-28T16:20:54Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-28T16:32:51Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-02-28T16:34:16Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T06:06:27Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T06:18:31Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:01:05Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:02:16Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:10:40Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:13:22Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:13:38Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:20:34Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:21:41Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:23:42Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:26:34Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:27:54Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:31:16Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:31:44Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:36:28Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:42:00Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:47:37Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T09:57:44Z
user: login: Microcompressor
body: Ревью закончил. Если подвести черту под ошибками и сгруппировать их:
1) Много задублированного кода: надо схлопывать его
2) В некоторых местах избыточно длинные селекторы или не совсем корректно построенные селекторы
3) Есть неиспользуемые части, которые можно убрать
4) Путаница между expected и actual в некоторых местах
5) Название методов и классов кое-где: методы - глагол, классы-существительное

Есть от меня комментарии, которые требуют правок по всему проекту, но оставлял я их в одном месте, там будет понятно по их содержанию тебе

Напоминаю, что я сам в автотестах новичок и работал им по сути месяц :) Так что моё  мнение может быть не истинным в последней инстанции
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-01T11:27:21Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:22:24Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:24:52Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:30:38Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:34:54Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:36:09Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:38:54Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T08:41:18Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T14:23:26Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T14:24:47Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T14:41:57Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T14:48:11Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-23T14:48:35Z
user: login: Microcompressor
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-24T07:57:30Z

Review comments:
diff_hunk: @@ -0,0 +1,110 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class WhoIsTheScooterFor {
+
+    private WebDriver driver;
+    public String textName;
+    public String textSurname;
+    private By name = By.xpath(".//input[@placeholder = '* Имя']");
+    private By surname = By.xpath(".//input[@placeholder = '* Фамилия']");
+    private By address = By.xpath(".//input[@placeholder = '* Адрес: куда привезти заказ']");
+    private By metroStation = By.xpath(".//input[@placeholder = '* Станция метро']");
+    //Выпадашка со списком станций
+    private By listMetroStation = By.className("select-search__select");
+    private By phoneNumber = By.xpath(".//input[@placeholder = '* Телефон: на него позвонит курьер']");
+    private By buttonNext = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Далее')]");
+    private By errorName = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректное имя')]");
+    private By errorSurname = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректную фамилию')]");
+    private By errorAddress = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный адрес')]");
+    private By errorMetroStation = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Выберите станцию')]");
+    private By errorPhoneNumber = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный номер')]");
+
+
+    public WhoIsTheScooterFor(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    //Заполнить форму "Для кого самокат" и перейти к след форме
+    public void fillOutTheOrderForm(String yoursName, String yoursSurname, String yoursAddress, String yoursMetro, String yoursNumber) {
+        driver.findElement(name).clear();
+        driver.findElement(name).sendKeys(yoursName);
+        driver.findElement(surname).clear();
+        driver.findElement(surname).sendKeys(yoursSurname);
+        driver.findElement(address).clear();
+        driver.findElement(address).sendKeys(yoursAddress);
+        driver.findElement(metroStation).clear();
+        driver.findElement(metroStation).sendKeys(yoursMetro);
+        //Выбрать из списка введенное значение и кликнуть на него
+        //driver.findElement(listMetroStation).findElement(By.xpath("//button[contains(text(), '" + yoursMetro + "') and @value = '1']")).click();
+        driver.findElement(listMetroStation).findElement(By.xpath("//ul[@class='select-search__options']/li[1]")).click();
+        driver.findElement(phoneNumber).clear();
+        driver.findElement(phoneNumber).sendKeys(yoursNumber);
+        //Получить поля Имя Фамилия и записать их в переменные
+        this.textSurname = yoursSurname;
+        this.textName = yoursName;
+        //Кликнуть по кнопке далее
+        driver.findElement(buttonNext).click();
+    }
+
+    //Метод используется для проверки предупреждений об ошибках 1 формы
+    public void fillOutTheOrderFormExceptForTheMetroStation(String yoursName, String yoursSurname, String yoursAddress, String yoursNumber) {
+        driver.findElement(name).clear();
+        driver.findElement(name).sendKeys(yoursName);
+        driver.findElement(surname).clear();
+        driver.findElement(surname).sendKeys(yoursSurname);
+        driver.findElement(address).clear();
+        driver.findElement(address).sendKeys(yoursAddress);
+        driver.findElement(phoneNumber).clear();
+        driver.findElement(phoneNumber).sendKeys(yoursNumber);
+        //Кликнуть по кнопке далее
+        driver.findElement(buttonNext).click();
+    }
+
+    public void buttonNextClick() {
+        driver.findElement(buttonNext).click();
+    }
+
+    public boolean errorNameIsDesplaid() {
path: src/main/java/PageObjectPackage/WhoIsTheScooterFor.java
user: login: Microcompressor
body: Опечатка:
errorNameIsDesplaid -> errorNameIsDisplayed 

Ну и ниже по коду аналогично в данном классе

created_at: 2025-02-26T15:21:02Z
author_association: NONE
diff_hunk: @@ -0,0 +1,110 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class WhoIsTheScooterFor {
+
+    private WebDriver driver;
+    public String textName;
+    public String textSurname;
+    private By name = By.xpath(".//input[@placeholder = '* Имя']");
+    private By surname = By.xpath(".//input[@placeholder = '* Фамилия']");
+    private By address = By.xpath(".//input[@placeholder = '* Адрес: куда привезти заказ']");
+    private By metroStation = By.xpath(".//input[@placeholder = '* Станция метро']");
+    //Выпадашка со списком станций
+    private By listMetroStation = By.className("select-search__select");
+    private By phoneNumber = By.xpath(".//input[@placeholder = '* Телефон: на него позвонит курьер']");
+    private By buttonNext = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Далее')]");
+    private By errorName = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректное имя')]");
+    private By errorSurname = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректную фамилию')]");
+    private By errorAddress = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный адрес')]");
+    private By errorMetroStation = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Выберите станцию')]");
+    private By errorPhoneNumber = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный номер')]");
+
+
+    public WhoIsTheScooterFor(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    //Заполнить форму "Для кого самокат" и перейти к след форме
+    public void fillOutTheOrderForm(String yoursName, String yoursSurname, String yoursAddress, String yoursMetro, String yoursNumber) {
+        driver.findElement(name).clear();
+        driver.findElement(name).sendKeys(yoursName);
+        driver.findElement(surname).clear();
+        driver.findElement(surname).sendKeys(yoursSurname);
+        driver.findElement(address).clear();
+        driver.findElement(address).sendKeys(yoursAddress);
+        driver.findElement(metroStation).clear();
+        driver.findElement(metroStation).sendKeys(yoursMetro);
+        //Выбрать из списка введенное значение и кликнуть на него
+        //driver.findElement(listMetroStation).findElement(By.xpath("//button[contains(text(), '" + yoursMetro + "') and @value = '1']")).click();
+        driver.findElement(listMetroStation).findElement(By.xpath("//ul[@class='select-search__options']/li[1]")).click();
+        driver.findElement(phoneNumber).clear();
+        driver.findElement(phoneNumber).sendKeys(yoursNumber);
+        //Получить поля Имя Фамилия и записать их в переменные
+        this.textSurname = yoursSurname;
+        this.textName = yoursName;
+        //Кликнуть по кнопке далее
+        driver.findElement(buttonNext).click();
+    }
+
+    //Метод используется для проверки предупреждений об ошибках 1 формы
+    public void fillOutTheOrderFormExceptForTheMetroStation(String yoursName, String yoursSurname, String yoursAddress, String yoursNumber) {
+        driver.findElement(name).clear();
+        driver.findElement(name).sendKeys(yoursName);
+        driver.findElement(surname).clear();
+        driver.findElement(surname).sendKeys(yoursSurname);
+        driver.findElement(address).clear();
+        driver.findElement(address).sendKeys(yoursAddress);
+        driver.findElement(phoneNumber).clear();
+        driver.findElement(phoneNumber).sendKeys(yoursNumber);
+        //Кликнуть по кнопке далее
+        driver.findElement(buttonNext).click();
+    }
+
+    public void buttonNextClick() {
+        driver.findElement(buttonNext).click();
+    }
+
+    public boolean errorNameIsDesplaid() {
+        try {
+            return driver.findElement(errorName).isDisplayed();
+        } catch (org.openqa.selenium.NoSuchElementException e) {
+            return false;
+        }
+    }
+
+    public boolean errorSurnameIsDesplaid() {
path: src/main/java/PageObjectPackage/WhoIsTheScooterFor.java
user: login: Microcompressor
body: В данном классе 5 методов, код которых отличается только полями типа By с именем error...
Можно, чтобы избежать дублирование кода, схлопнуть все 5 методов в один. Например, так:


    public boolean errorTextFieldIsDisplayed(By textField) {
        try {
            return driver.findElement(textField).isDisplayed();
        } catch (org.openqa.selenium.NoSuchElementException e) {
            return false;
        }
    }

Соответственно, чтобы использовать его в классе теста, нужно будет написать геттеры для приватных полей, которые ты передаёшь в этот метод. Можно по другому сделать: метод будет принимать массив и в теле метода по массиву в цикле можно проходиться и проверять, отображаются ли элементы. В общем, тут на твоё усмотрение, но дублирование методов ниже лучше убрать
created_at: 2025-02-26T15:42:22Z
author_association: NONE
diff_hunk: @@ -0,0 +1,124 @@
+import PageObjectPackage.MainPage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+import static org.junit.Assert.*;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class QuestionsAboutTheImportant {
+
+    private WebDriver driver;
+
+    //Кнопку на которую мы хотим нажать
+    private final String selector;
+    //Текст который должен появиться при открытии ответа
+    private final String expectedText;
+
+    public QuestionsAboutTheImportant(String selector, String expectedText) {
+        this.selector = selector;
+        this.expectedText = expectedText;
+    }
+
+
+    @Parameterized.Parameters
+
+    public static Object[][] textComparison() {
+
+        return new Object[][]{
+                {"0", "Сутки — 400 рублей. Оплата курьеру — наличными или картой."},
+                {"1", "Пока что у нас так: один заказ — один самокат. Если хотите покататься с друзьями, можете просто сделать несколько заказов — один за другим."},
+                {"2", "Допустим, вы оформляете заказ на 8 мая. Мы привозим самокат 8 мая в течение дня. Отсчёт времени аренды начинается с момента, когда вы оплатите заказ курьеру. Если мы привезли самокат 8 мая в 20:30, суточная аренда закончится 9 мая в 20:30."},
+                {"3", "Только начиная с завтрашнего дня. Но скоро станем расторопнее."},
+                {"4", "Пока что нет! Но если что-то срочное — всегда можно позвонить в поддержку по красивому номеру 1010."},
+                {"5", "Самокат приезжает к вам с полной зарядкой. Этого хватает на восемь суток — даже если будете кататься без передышек и во сне. Зарядка не понадобится."},
+                {"6", "Да, пока самокат не привезли. Штрафа не будет, объяснительной записки тоже не попросим. Все же свои."},
+                {"7", "Да, обязательно. Всем самокатов! И Москве, и Московской области."},
+        };
+    }
+
+    @Test
+    public void questionsAboutTheImportantFirefox() {
path: src/test/java/QuestionsAboutTheImportant.java
user: login: Microcompressor
body: Название метода обычно должно быть глаголом, в данном случае, например checkQuestionsAboutTheImportantFirefox
 
Аналогично для метода questionsAboutTheImportantGoogleChrome

И для textComparison->compareTexts, к примеру

И в целом по всем методам из проекта пройдись, там у тебя много не глаголов
created_at: 2025-02-28T15:36:16Z
author_association: NONE
diff_hunk: @@ -0,0 +1,124 @@
+import PageObjectPackage.MainPage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+import static org.junit.Assert.*;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class QuestionsAboutTheImportant {
+
+    private WebDriver driver;
+
+    //Кнопку на которую мы хотим нажать
+    private final String selector;
+    //Текст который должен появиться при открытии ответа
+    private final String expectedText;
+
+    public QuestionsAboutTheImportant(String selector, String expectedText) {
+        this.selector = selector;
+        this.expectedText = expectedText;
+    }
+
+
+    @Parameterized.Parameters
+
+    public static Object[][] textComparison() {
+
+        return new Object[][]{
+                {"0", "Сутки — 400 рублей. Оплата курьеру — наличными или картой."},
+                {"1", "Пока что у нас так: один заказ — один самокат. Если хотите покататься с друзьями, можете просто сделать несколько заказов — один за другим."},
+                {"2", "Допустим, вы оформляете заказ на 8 мая. Мы привозим самокат 8 мая в течение дня. Отсчёт времени аренды начинается с момента, когда вы оплатите заказ курьеру. Если мы привезли самокат 8 мая в 20:30, суточная аренда закончится 9 мая в 20:30."},
+                {"3", "Только начиная с завтрашнего дня. Но скоро станем расторопнее."},
+                {"4", "Пока что нет! Но если что-то срочное — всегда можно позвонить в поддержку по красивому номеру 1010."},
+                {"5", "Самокат приезжает к вам с полной зарядкой. Этого хватает на восемь суток — даже если будете кататься без передышек и во сне. Зарядка не понадобится."},
+                {"6", "Да, пока самокат не привезли. Штрафа не будет, объяснительной записки тоже не попросим. Все же свои."},
+                {"7", "Да, обязательно. Всем самокатов! И Москве, и Московской области."},
+        };
+    }
+
+    @Test
+    public void questionsAboutTheImportantFirefox() {
+
+        driver = new FirefoxDriver();
+
+        driver.get("https://qa-scooter.praktikum-services.ru/");
+
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+
+
+        String headingId = "accordion__heading-" + selector;
+        String panelId = "accordion__panel-" + selector;
+
+        WebElement element = driver.findElement(By.id(headingId));
+        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
+
+        new WebDriverWait(driver, Duration.ofSeconds(5))
+                .until(ExpectedConditions.elementToBeClickable(By.id(headingId)));
+
+        driver.findElement(By.id(headingId)).click();
+
+        new WebDriverWait(driver, Duration.ofSeconds(3))
+                .until(ExpectedConditions.attributeToBe(By.id(headingId), "aria-disabled", "true"));
+
+        String actual = driver.findElement(By.xpath(".//div[@id='" + panelId + "']/p")).getText();
+
+        //Неактуальный вариант через 2 метода
+        //page.clickButton(selector);
+        //String actual = page.idText(selector);
+
+        //Сравниваем текст
+        assertEquals(expectedText, actual);
+
+    }
+
+    @Test
+    public void questionsAboutTheImportantGoogleChrome() {
path: src/test/java/QuestionsAboutTheImportant.java
user: login: Microcompressor
body: questionsAboutTheImportantGoogleChrome и questionsAboutTheImportantFirefox почти полностью повторяют друг друга, большой кусок задублированного кода. Можно схлопнуть в один. В одном из комментариев привёл пример, как

created_at: 2025-02-28T15:56:55Z
author_association: NONE
path: src/test/java/OrderingScooter.java
user: login: Microcompressor
body: В данном классе очень много задублированного кода между методами, можно и нужно сокращать. Во-первых,makingAnOrderInTheGoogleChromeTheButtonAtTheBottomOfThePage и makingAnOrderInTheFirefoxTheButtonAtTheBottomOfThePage - почти полностью идентичны, различаются только видом браузера. Можно схлопнуть в один метод с параметром, аналогично как  в комментарии писал для класса QuestionsAboutTheImportant. Во-вторых, makingAnOrderInTheFirefoxTheButtonAtTheTopfThePage и makingAnOrderInTheGoogleChromeTheButtonAtTheTopfThePage аналогично. В-третьих, во всех этих методах повторяется один и тот же код по заполнению одних и тех же форм: первой, второй, проверка одного и того же модального окна и т.п., всё это имеет смысл вынести в отдельный метод

По сути у тебя 4 метода отличаются: кнопка заказать сверху или снизу, браузер хром или мозила. Ты можешь все 4 метода вполне я думаю схлопнуть в один метод с двумя параметрами: какую кнопку жать и какой бразуер использовать, и всё :) У тебя кода в разы тут уменьшится сразу
created_at: 2025-02-28T16:20:54Z
author_association: NONE
path: src/test/java/OrderingScooter.java
user: login: Microcompressor
body: И название метода получится сократить:  makeAnOrder или makeOrder
created_at: 2025-02-28T16:32:51Z
author_association: NONE
path: src/test/java/OrderingScooter.java
user: login: Microcompressor
body: Опять же представь, что тебе по заданию добавят протестировать оформление заказа в третьем браузере или по ещё одной новой кнопке, которую фронтовики сделают. Тебе придётся копировать огромные куски кода, чтобы сделать тот или иной метод новый
created_at: 2025-02-28T16:34:16Z
author_association: NONE
path: src/main/java/org/example/DescribeSelectors.java
user: login: Microcompressor
body: Класс нигде не используется и в нём только комментарии, можно удалить, если не нужна информация из него
created_at: 2025-03-01T06:06:26Z
author_association: NONE
path: src/main/java/org/example/Main.java
user: login: Microcompressor
body: Класс никак не используется, его, может, удалить? 
created_at: 2025-03-01T06:18:31Z
author_association: NONE
diff_hunk: @@ -0,0 +1,124 @@
+import PageObjectPackage.MainPage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+import static org.junit.Assert.*;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class QuestionsAboutTheImportant {
+
+    private WebDriver driver;
+
+    //Кнопку на которую мы хотим нажать
+    private final String selector;
+    //Текст который должен появиться при открытии ответа
+    private final String expectedText;
+
+    public QuestionsAboutTheImportant(String selector, String expectedText) {
+        this.selector = selector;
+        this.expectedText = expectedText;
+    }
+
+
+    @Parameterized.Parameters
+
+    public static Object[][] textComparison() {
+
+        return new Object[][]{
+                {"0", "Сутки — 400 рублей. Оплата курьеру — наличными или картой."},
+                {"1", "Пока что у нас так: один заказ — один самокат. Если хотите покататься с друзьями, можете просто сделать несколько заказов — один за другим."},
+                {"2", "Допустим, вы оформляете заказ на 8 мая. Мы привозим самокат 8 мая в течение дня. Отсчёт времени аренды начинается с момента, когда вы оплатите заказ курьеру. Если мы привезли самокат 8 мая в 20:30, суточная аренда закончится 9 мая в 20:30."},
+                {"3", "Только начиная с завтрашнего дня. Но скоро станем расторопнее."},
+                {"4", "Пока что нет! Но если что-то срочное — всегда можно позвонить в поддержку по красивому номеру 1010."},
+                {"5", "Самокат приезжает к вам с полной зарядкой. Этого хватает на восемь суток — даже если будете кататься без передышек и во сне. Зарядка не понадобится."},
+                {"6", "Да, пока самокат не привезли. Штрафа не будет, объяснительной записки тоже не попросим. Все же свои."},
+                {"7", "Да, обязательно. Всем самокатов! И Москве, и Московской области."},
+        };
+    }
+
+    @Test
+    public void questionsAboutTheImportantFirefox() {
+
+        driver = new FirefoxDriver();
+
+        driver.get("https://qa-scooter.praktikum-services.ru/");
+
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+
+
+        String headingId = "accordion__heading-" + selector;
+        String panelId = "accordion__panel-" + selector;
+
+        WebElement element = driver.findElement(By.id(headingId));
+        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
+
+        new WebDriverWait(driver, Duration.ofSeconds(5))
+                .until(ExpectedConditions.elementToBeClickable(By.id(headingId)));
+
+        driver.findElement(By.id(headingId)).click();
+
+        new WebDriverWait(driver, Duration.ofSeconds(3))
+                .until(ExpectedConditions.attributeToBe(By.id(headingId), "aria-disabled", "true"));
+
+        String actual = driver.findElement(By.xpath(".//div[@id='" + panelId + "']/p")).getText();
+
+        //Неактуальный вариант через 2 метода
+        //page.clickButton(selector);
+        //String actual = page.idText(selector);
+
+        //Сравниваем текст
+        assertEquals(expectedText, actual);
+
+    }
+
+    @Test
+    public void questionsAboutTheImportantGoogleChrome() {
+
+        driver = new ChromeDriver();
+
+        driver.get("https://qa-scooter.praktikum-services.ru/");
+
+        MainPage page = new MainPage(driver);
path: src/test/java/QuestionsAboutTheImportant.java
user: login: Microcompressor
body: У тебя в MainPage уже определена куча полезных методов по клику на вопросы, получение текста вопроса и ответа, ты почему-то ниже по сути не используешь их, а заново ищешь через драйвер. Используй методы и поля из MainPage в методе и у тебя выйдет неплохое сокращение кода
created_at: 2025-03-01T09:01:05Z
author_association: NONE
diff_hunk: @@ -0,0 +1,109 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class MainPage {
+
+    private WebDriver driver;
+    // НИЖНЯЯ кнопка заказа на основной странице
+    private By mainOrderButtonAtTheBottom = By.xpath(".//button[@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Заказать')]");
path: src/main/java/PageObjectPackage/MainPage.java
user: login: Microcompressor
body: Мне кажется, тут xpath можно сократить
created_at: 2025-03-01T09:02:16Z
author_association: NONE
diff_hunk: @@ -0,0 +1,109 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class MainPage {
path: src/main/java/PageObjectPackage/MainPage.java
user: login: Microcompressor
body: В данном классе почти все поля вопросов и ответов похожи друг на друга по xpath, отличаются только по сути номером, для вопросов общая часть: accordion__heading, а для ответов accordion__panel. Мне кажется, можно сделать метод, по типу:

public By getQuestionidByQuestionNumber(String questionNumber) {
        return By.id("accordion__heading-".concat(questionNumber));
    }

И по аналогии метод для ответов. Наверное, не идеально написал, ну суть я думаю ясна. У тебя сразу улетит большинство полей из этого класса, а методы ниже по классу сократятся
created_at: 2025-03-01T09:10:40Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class OrderConfirmationModal {
+
+    private WebDriver driver;
+    //Само модальное окошко
+    private By modalYesNo = By.xpath(".//div [@class = 'Order_ModalHeader__3FDaJ' and contains(text(), 'Хотите оформить заказ')]");
path: src/main/java/PageObjectPackage/OrderConfirmationModal.java
user: login: Microcompressor
body: Можно xpath сократить
created_at: 2025-03-01T09:13:22Z
author_association: NONE
diff_hunk: @@ -0,0 +1,26 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class OrderConfirmationModal {
+
+    private WebDriver driver;
+    //Само модальное окошко
+    private By modalYesNo = By.xpath(".//div [@class = 'Order_ModalHeader__3FDaJ' and contains(text(), 'Хотите оформить заказ')]");
+    //Кнопка "Да"
+    private By yesButton = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Да')]");
path: src/main/java/PageObjectPackage/OrderConfirmationModal.java
user: login: Microcompressor
body: Можно xpath сократить
created_at: 2025-03-01T09:13:38Z
author_association: NONE
path: src/main/java/PageObjectPackage/OrderStatus.java
user: login: Microcompressor
body: Здесь селекторы можно сократить, и для @class ты также можешь использовать contains. Старайся не привязываться к каким-то значениям, вроде Track_Value__15eEX, лучше Track_Value через contains, если получится
created_at: 2025-03-01T09:20:34Z
author_association: NONE
diff_hunk: @@ -0,0 +1,42 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class OrderStatus {
+
+    //Текст  имени и фамилии на странице
+    public String textName;
+    public String textSurname;
+
+    private WebDriver driver;
+    //Поле ввода номера заказа для поиска
+    private By inputOrderNumber = By.className("Input_Input__1iN_Z.Track_Input__1g7lq.Input_Responsible__1jDKN");
+    //Кнопка для поиска по номеру заказа
+    private By searchButton = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Посмотреть')]");
+    //Кнопка для отмены заказа
+    private By orderCancellation = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Отменить заказ')]");
+    //Картинка с предупреждением что заказ не найден
+    private By thePictureThereIsNoSuchOrder = By.xpath(".//img [@src = '/assets/not-found.png']");
path: src/main/java/PageObjectPackage/OrderStatus.java
user: login: Microcompressor
body: Мне кажется, предлоги the, a, an необязательны ни в наименованиях полей, ни методов, ни классов
created_at: 2025-03-01T09:21:41Z
author_association: NONE
diff_hunk: @@ -0,0 +1,87 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class RentalDetails {
+
+    private WebDriver driver;
+
+
+    //Сама форма
+    private By rentalDetailsWindow = By.xpath(".//div[@class = 'Order_Header__BZXOb' and contains(text(), 'Про аренду')]");
+    //Когда привезти самокат
+    private By whenToBringTheScooter = By.xpath(".//input[@placeholder = '* Когда привезти самокат']");
+    //нужный день в календаре
+    private By rightDay = By.className("react-datepicker__day--selected");
+    //Период аренды
+    private By rentalPeriod = By.className("Dropdown-root");
+    //1 сутки
+    private By day_1 = By.xpath(".//div[contains (@class, 'Dropdown-option') and contains(text(), 'сутки')]");
path: src/main/java/PageObjectPackage/RentalDetails.java
user: login: Microcompressor
body: Селекторы дней можно сократить: сделать отдельный метод, как я уже писал для класса MainPage:

public By getQuestionidByQuestionNumber(String questionNumber) {
return By.id("accordion__heading-".concat(questionNumber));
}

Таким образом ты и метод fillOutTheRentalDetailsForm сократишь

created_at: 2025-03-01T09:23:42Z
author_association: NONE
path: src/main/java/PageObjectPackage/SiteHeader.java
user: login: Microcompressor
body: Мне кажется, этот класс можно соединить с MainPage, или отнаследовать от MainPage
created_at: 2025-03-01T09:26:34Z
author_association: NONE
diff_hunk: @@ -0,0 +1,42 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class StatusModal {
+    private WebDriver driver;
+    // Кнопка "Посмотреть статус"
+    private By statusButton = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Посмотреть статус')]");
path: src/main/java/PageObjectPackage/StatusModal.java
user: login: Microcompressor
body: Можно xpath сократить
created_at: 2025-03-01T09:27:54Z
author_association: NONE
path: src/main/java/PageObjectPackage/OrderStatus.java
user: login: Microcompressor
body: Это относится не только к этому классу, но и ко всем другим, где есть подобная вещь
created_at: 2025-03-01T09:31:16Z
author_association: NONE
diff_hunk: @@ -0,0 +1,110 @@
+package PageObjectPackage;
+
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+public class WhoIsTheScooterFor {
+
+    private WebDriver driver;
+    public String textName;
+    public String textSurname;
+    private By name = By.xpath(".//input[@placeholder = '* Имя']");
+    private By surname = By.xpath(".//input[@placeholder = '* Фамилия']");
+    private By address = By.xpath(".//input[@placeholder = '* Адрес: куда привезти заказ']");
+    private By metroStation = By.xpath(".//input[@placeholder = '* Станция метро']");
+    //Выпадашка со списком станций
+    private By listMetroStation = By.className("select-search__select");
+    private By phoneNumber = By.xpath(".//input[@placeholder = '* Телефон: на него позвонит курьер']");
+    private By buttonNext = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Далее')]");
+    private By errorName = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректное имя')]");
+    private By errorSurname = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректную фамилию')]");
+    private By errorAddress = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный адрес')]");
+    private By errorMetroStation = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Выберите станцию')]");
+    private By errorPhoneNumber = By.xpath(".//div [@class = 'Input_ErrorMessage__3HvIb Input_Visible___syz6' and contains (text(), 'Введите корректный номер')]");
+
+
+    public WhoIsTheScooterFor(WebDriver driver) {
+        this.driver = driver;
+    }
+
+    //Заполнить форму "Для кого самокат" и перейти к след форме
+    public void fillOutTheOrderForm(String yoursName, String yoursSurname, String yoursAddress, String yoursMetro, String yoursNumber) {
+        driver.findElement(name).clear();
path: src/main/java/PageObjectPackage/WhoIsTheScooterFor.java
user: login: Microcompressor
body: с 32 по 37 код дублируется, можно вынести в отдельный метод и переиспользовать
created_at: 2025-03-01T09:31:44Z
author_association: NONE
diff_hunk: @@ -0,0 +1,53 @@
+import PageObjectPackage.MainPage;
+import PageObjectPackage.WhoIsTheScooterFor;
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+
+import static org.junit.Assert.assertEquals;
+
+public class CheckingForFormErrorsAdditionalScenarios {
+
+    private WebDriver driver;
+
+    //Проверяем ошибки первой формы( это доп задание, так что решил просто первую форму проверить)
+    //Не помню что там по требованиям, буду считать что валидация завязана на кнопку далее
+    @Test
+    public void checkingForTheFirstFormErrors() {
+
+        //Создаем вебдрайвер
+        driver = new ChromeDriver();
+        driver.get("https://qa-scooter.praktikum-services.ru/");
+
+        //Начинаем оформление на главной странице
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+        page.clickMainOrderButton();
+
+        // Жмем на кнопку далее
+        WhoIsTheScooterFor scooterForYou = new WhoIsTheScooterFor(driver);
+        scooterForYou.buttonNextClick();
+
+        //Проверяем появление ошибок
+        boolean expectedNameError = scooterForYou.errorNameIsDesplaid();
path: src/test/java/CheckingForFormErrorsAdditionalScenarios.java
user: login: Microcompressor
body: expected-ожидаем
actual-фактически

Мне кажется, ты перепутал названия, идея тебе вроде должна была подсказать, как и мне:
![image](https://github.com/user-attachments/assets/c2520b5b-6b1b-4dfa-a173-cf5db852fd65)
вот типо такого должно быть:
boolean actualNameError = scooterForYou.errorNameIsDesplaid();
        boolean actualSurnameError = scooterForYou.errorSurnameIsDesplaid();
        boolean actualAddressError = scooterForYou.errorAddressIsDesplaid();
        boolean actualMetroStationError = scooterForYou.errorMetroStationIsDesplaid();
        boolean actualPhoneNumberError = scooterForYou.errorPhoneNumberIsDesplaid();
        boolean expectedError = true;

created_at: 2025-03-01T09:36:27Z
author_association: NONE
path: src/test/java/ClickLogoAdditionalScenarios.java
user: login: Microcompressor
body: Тут у тебя опять же перепутаны actual и expected по названию переменных
created_at: 2025-03-01T09:42:00Z
author_association: NONE
diff_hunk: @@ -0,0 +1,79 @@
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import PageObjectPackage.*;
+
+import java.time.Duration;
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class ClickLogoAdditionalScenarios {
+
+    private WebDriver driver;
+
+    //Переход по клику на лого самоката на главную
+    @Test
+    public void clickScooterGoToTheMainPage() {
+
+        driver = new FirefoxDriver();
+
+        SiteHeader header = new SiteHeader(driver);
+
+        driver.get("https://qa-scooter.praktikum-services.ru");
+
+        header.clickLogoScooter();
+
+        // Получаем список всех открытых вкладок браузера и переключаемся на первую
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(0));
+
+        // Ожидаем нужный нам урл
+        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(2));
+        wait.until(ExpectedConditions.urlToBe("https://qa-scooter.praktikum-services.ru/"));
+
+        String expectedUrl = driver.getCurrentUrl();
+        String actual = "https://qa-scooter.praktikum-services.ru/";
+
+        assertEquals(actual, expectedUrl);
+
+    }
+
+    //Переход по клику на лого Яндекса на главную Яндекса
+    @Test
+    public void clickYandexGoToTheMainPage() {
+
+        driver = new FirefoxDriver();
+
+        SiteHeader header = new SiteHeader(driver);
+
+        driver.get("https://qa-scooter.praktikum-services.ru");
+
+        // Клик по кнопке + Переключение на новую вкладку
+
+        header.clickLogoYandex();
+
+        // Получаем список всех открытых вкладок браузера и переключаемся на вторую
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(1));
+
+        /* Тут поменял urlMatches на urlToBe иначе он видел совпадение но проверка
+        почему-то завершалась провалом при равных абсолютно урлах */
path: src/test/java/ClickLogoAdditionalScenarios.java
user: login: Microcompressor
body: Я предполагаю, потому что метод urlMatches использует регулярное выражение для поиска, а urlToBe  тупо сравнивает полностью текст
created_at: 2025-03-01T09:47:36Z
author_association: NONE
diff_hunk: @@ -0,0 +1,124 @@
+import PageObjectPackage.MainPage;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.time.Duration;
+
+import static org.junit.Assert.*;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class QuestionsAboutTheImportant {
+
+    private WebDriver driver;
+
+    //Кнопку на которую мы хотим нажать
+    private final String selector;
+    //Текст который должен появиться при открытии ответа
+    private final String expectedText;
+
+    public QuestionsAboutTheImportant(String selector, String expectedText) {
+        this.selector = selector;
+        this.expectedText = expectedText;
+    }
+
+
+    @Parameterized.Parameters
+
+    public static Object[][] textComparison() {
+
+        return new Object[][]{
+                {"0", "Сутки — 400 рублей. Оплата курьеру — наличными или картой."},
+                {"1", "Пока что у нас так: один заказ — один самокат. Если хотите покататься с друзьями, можете просто сделать несколько заказов — один за другим."},
+                {"2", "Допустим, вы оформляете заказ на 8 мая. Мы привозим самокат 8 мая в течение дня. Отсчёт времени аренды начинается с момента, когда вы оплатите заказ курьеру. Если мы привезли самокат 8 мая в 20:30, суточная аренда закончится 9 мая в 20:30."},
+                {"3", "Только начиная с завтрашнего дня. Но скоро станем расторопнее."},
+                {"4", "Пока что нет! Но если что-то срочное — всегда можно позвонить в поддержку по красивому номеру 1010."},
+                {"5", "Самокат приезжает к вам с полной зарядкой. Этого хватает на восемь суток — даже если будете кататься без передышек и во сне. Зарядка не понадобится."},
+                {"6", "Да, пока самокат не привезли. Штрафа не будет, объяснительной записки тоже не попросим. Все же свои."},
+                {"7", "Да, обязательно. Всем самокатов! И Москве, и Московской области."},
+        };
+    }
+
+    @Test
+    public void questionsAboutTheImportantFirefox() {
+
+        driver = new FirefoxDriver();
+
+        driver.get("https://qa-scooter.praktikum-services.ru/");
+
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+
+
+        String headingId = "accordion__heading-" + selector;
+        String panelId = "accordion__panel-" + selector;
+
+        WebElement element = driver.findElement(By.id(headingId));
+        ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", element);
+
+        new WebDriverWait(driver, Duration.ofSeconds(5))
+                .until(ExpectedConditions.elementToBeClickable(By.id(headingId)));
+
+        driver.findElement(By.id(headingId)).click();
+
+        new WebDriverWait(driver, Duration.ofSeconds(3))
+                .until(ExpectedConditions.attributeToBe(By.id(headingId), "aria-disabled", "true"));
+
+        String actual = driver.findElement(By.xpath(".//div[@id='" + panelId + "']/p")).getText();
+
+        //Неактуальный вариант через 2 метода
+        //page.clickButton(selector);
+        //String actual = page.idText(selector);
+
+        //Сравниваем текст
+        assertEquals(expectedText, actual);
+
+    }
+
+    @Test
+    public void questionsAboutTheImportantGoogleChrome() {
+
+        driver = new ChromeDriver();
+
+        driver.get("https://qa-scooter.praktikum-services.ru/");
+
+        MainPage page = new MainPage(driver);
+        page.clickCookieButton();
+
+
+        String headingId = "accordion__heading-" + selector;
+        String panelId = "accordion__panel-" + selector;
+
+        WebElement element = driver.findElement(By.id(headingId));
path: src/test/java/QuestionsAboutTheImportant.java
user: login: Microcompressor
body: Старайся везде давать переменным, полям, методам понятное название. В данном случае хотелось бы понимать по названию, что это за элемент
created_at: 2025-03-01T09:57:43Z
author_association: NONE
diff_hunk: @@ -0,0 +1,11 @@
+package Provision;
+
+public class Enum {
path: src/main/java/Provision/Enum.java
user: login: Microcompressor
body: Нет особо смысла делать класс и в нём перечисление, и класс называется очень обобщённо, можно убрать и просто оставить перечисление
public enum BrowserType {
        FIREFOX,
        CHROME

    }
created_at: 2025-03-23T08:22:24Z
author_association: NONE
path: src/main/java/Exceptions/CustomBaseException.java
user: login: Microcompressor
body: Не думаю, что в рамках данного проекта имеет смысл свою иерархию исключений делать - она особо тут ничего не привносит и не особо нужна, вполне можно обойтись встроенными в джава классами. Тем более ты тут просто используешь конструктор с передачей сообщения в родительский класс, единственное что ты своё привносишь - это названия классов, а они тоже у тебя довольно абстрактно названы
created_at: 2025-03-23T08:24:52Z
author_association: NONE
diff_hunk: @@ -0,0 +1,48 @@
+package Provision;
+
+import Exceptions.UndefinedBehaviorException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WrapsDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import Provision.Enum.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static Provision.Constants.TESTING_SITE_URL;
+
+
+public class BrowserInitialization {
+
+    private static WebDriver driver;
+
+    //Создаем список нужных нам браузеров
+    public static final BrowserType[] browserList = BrowserType.values();
+
+    //Основной метод инициализации браузера
+    public static WebDriver getBrowserDriver(BrowserType browser) throws UndefinedBehaviorException {
path: src/main/java/Provision/BrowserInitialization.java
user: login: Microcompressor
body: Из-за того, что ты написал своё кастомное исключение, тебе теперь при любом использовании вовне getBrowserDriver метода нужно его или в try-catch оборачивать, или приписывать методу, использующему getBrowserDriver , что он тоже это исключение кидает:throws UndefinedBehaviorException. Повторюсь, что как будто бы логика своих исключений тут избыточна
created_at: 2025-03-23T08:30:37Z
author_association: NONE
diff_hunk: @@ -0,0 +1,5 @@
+package Provision;
+
+public class Constants {
+    static final String TESTING_SITE_URL = "https://qa-scooter.praktikum-services.ru/";
path: src/main/java/Provision/Constants.java
user: login: Microcompressor
body: константу можно сделать public и использовать везде по проекту, а то она у тебя есть, но по факту используется не везде
created_at: 2025-03-23T08:34:54Z
author_association: NONE
diff_hunk: @@ -28,8 +27,8 @@ public void incorrectOrderNumber() {
         driver.get("https://qa-scooter.praktikum-services.ru");
path: src/test/java/IncorrectOrderNumberAdditionalScenariosTest.java
user: login: Microcompressor
body: А тут как будто бы можно методы класса BrowserInitialization использовать
created_at: 2025-03-23T08:36:09Z
author_association: NONE
diff_hunk: @@ -17,19 +17,19 @@ public class RentalDetails {
     //Период аренды
     private By rentalPeriod = By.className("Dropdown-root");
     //1 сутки
-    private By day_1 = By.xpath(".//div[contains (@class, 'Dropdown-option') and contains(text(), 'сутки')]");
+    private By day_1 = By.xpath(".//div[contains(text(), 'сутки')]");
     //2 суток
-    private By day_2 = By.xpath(".//div[contains (@class, 'Dropdown-option') and contains(text(), 'двое суток')]");
+    private By day_2 = By.xpath(".//div[contains(text(), 'двое суток')]");
     //3 суток
-    private By day_3 = By.xpath(".//div[contains (@class, 'Dropdown-option') and contains(text(), 'трое суток')]");
+    private By day_3 = By.xpath(".//div[contains(text(), 'трое суток')]");
     //4 суток
-    private By day_4 = By.xpath(".//div[contains (@class, 'Dropdown-option') and contains(text(), 'четверо суток')]");
+    private By day_4 = By.xpath(".//div[contains(text(), 'четверо суток')]");
     //5 суток
-    private By day_5 = By.xpath(".//div[contains (@class, 'Dropdown-option') and contains(text(), 'пятеро суток')]");
+    private By day_5 = By.xpath(".//div[contains(text(), 'пятеро суток')]");
path: src/main/java/PageObjectPackage/RentalDetails.java
user: login: Microcompressor
body: Поскольку сделал метод getDaySelector, тебе не нужны по сути эти переменные:day_1, day_2... И я не уверен, что их так верно именовать
created_at: 2025-03-23T08:38:54Z
author_association: NONE
diff_hunk: @@ -1,26 +1,32 @@
 package PageObjectPackage;
 
+import net.bytebuddy.implementation.bind.annotation.Super;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
 
-public class SiteHeader {
+public class SiteHeader extends MainPage {
 
-    private WebDriver driver;
     //лого Яндекса
-    private By logoYandex = By.className("Header_LogoYandex__3TSOI");
+    private By logoYandex;
     //лого Самоката
-    private By logoScooter = By.className("Header_LogoScooter__3lsAR");
+    private By logoScooter;
     //Кнопка заказа
-    private By orderButtonAtTheTop = By.xpath(".//div[@class = 'Header_Nav__AGCXC']/button[@class = 'Button_Button__ra12g']");
+    private By orderButtonAtTheTop;
     //Кнопка статуса заказа Header_Link__1TAG7
-    private By orderStatusButton = By.xpath(".//div[@class = 'Header_Nav__AGCXC']/button[@class = 'Header_Link__1TAG7']");
+    private By orderStatusButton;
     //поле ввода номера заказа в шапке
-    private By orderNumber = By.xpath(".//input[@class = 'Input_Input__1iN_Z Header_Input__xIoUq' and @placeholder = 'Введите номер заказа']");
+    private By orderNumber;
     //странная кнопка GO
-    private By goButton = By.xpath(".//button[@class = 'Button_Button__ra12g Header_Button__28dPO' and contains (text(), 'Go!')]");
+    private By goButton;
 
     public SiteHeader(WebDriver driver) {
path: src/main/java/PageObjectPackage/SiteHeader.java
user: login: Microcompressor
body: а почему решил вынести инициализацию в конструктор, а не оставить сверху как было? Я не знаю, честно говоря, как вернее, просто интересуюсь :)
created_at: 2025-03-23T08:41:18Z
author_association: NONE
diff_hunk: @@ -0,0 +1,73 @@
+import Exceptions.UndefinedBehaviorException;
+import Provision.BrowserInitialization;
+import Provision.Enum;
+import Provision.WaitUtils;
+import org.openqa.selenium.WebDriver;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import PageObjectPackage.*;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class ClickLogoAdditionalScenariosTest {
+
+    private WebDriver driver;
+
+    //Переход по клику на лого самоката на главную
+    @Test
+    public void clickScooterGoToTheMainPage() throws UndefinedBehaviorException {
+
+        driver = BrowserInitialization.getBrowserDriver(Enum.BrowserType.FIREFOX);
+        BrowserInitialization.goUrl(driver);
+
+        SiteHeader header = new SiteHeader(driver);
+        header.clickLogoScooter();
+
+        // Получаем список всех открытых вкладок браузера и переключаемся на первую
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(0));
+
+        // Ожидаем нужный нам урл
+        WaitUtils.waitForCondition(driver, ExpectedConditions.urlToBe("https://qa-scooter.praktikum-services.ru/"), 2, "Не дождались URL 'https://qa-scooter.praktikum-services.ru/'");
+
+        String expectedUrl = driver.getCurrentUrl();
path: src/test/java/ClickLogoAdditionalScenariosTest.java
user: login: Microcompressor
body: здесь снова перепутаны ожидаемое expected и фактическое actual. В метод asserEquals ты всё верно передал, но вот поименовал неправильно, наоборот должно быть. В классе CheckingForFormErrorsAdditionalScenariosTest, например, с этим всё верно у тебя. Эта штука у тебя ещё в паре тестов встречается
created_at: 2025-03-23T14:23:26Z
author_association: NONE
diff_hunk: @@ -0,0 +1,55 @@
+import PageObjectPackage.MainPage;
+import PageObjectPackage.OrderStatus;
+import PageObjectPackage.SiteHeader;
+import Provision.WaitUtils;
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import java.util.ArrayList;
+
+import static org.junit.Assert.assertEquals;
+
+public class IncorrectOrderNumberAdditionalScenariosTest {
+    private WebDriver driver;
+
+    @Test
+    public void checkIncorrectOrderNumberTest() {
+
+        driver = new ChromeDriver();
+
+        MainPage main = new MainPage(driver);
+        SiteHeader header = new SiteHeader(driver);
+        OrderStatus status = new OrderStatus(driver);
+
+        driver.get("https://qa-scooter.praktikum-services.ru");
+        main.clickCookieButton();
+        header.clickOrderStatusButton();
+
+        WaitUtils.waitForCondition(driver, ExpectedConditions.elementToBeClickable(header.getOrderNumber()), 5, "Не открылось окно стутуса заказа");
+        header.enterTheOrderNumber("88005553535");
+
+        header.clickGoButton();
+
+        ArrayList<String> tabs = new ArrayList<>(driver.getWindowHandles());
+        driver.switchTo().window(tabs.get(0));
+
+        String expectedUrl = driver.getCurrentUrl();
+        String actualUrl = "https://qa-scooter.praktikum-services.ru/track?t=88005553535";
+
+        assertEquals("Не открылась страница статуса заказа", actualUrl, expectedUrl);
+
+        //тут проверить что картинка c предупреждением есть
+        boolean expected = status.PictureThereIsNoSuchOrderIsDisplayed();
+        assert expected;
path: src/test/java/IncorrectOrderNumberAdditionalScenariosTest.java
user: login: Microcompressor
body: здесь снова не expected, а actual и чуть выше тоже
created_at: 2025-03-23T14:24:47Z
author_association: NONE
diff_hunk: @@ -0,0 +1,98 @@
+import Exceptions.UndefinedBehaviorException;
+import PageObjectPackage.MainPage;
+import Provision.BrowserInitialization;
+import Provision.Enum;
+import Provision.WaitUtils;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+import org.junit.Test;
+import org.junit.After;
+import org.openqa.selenium.JavascriptExecutor;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+
+import static org.junit.Assert.*;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+
+@RunWith(Parameterized.class)
+public class QuestionsAboutTheImportantTest {
+
+    private WebDriver driver;
+
+    //Кнопку на которую мы хотим нажать
+    private final Enum.BrowserType browser;
+
+    private final String[][] compareTexts = new String[][]{
path: src/test/java/QuestionsAboutTheImportantTest.java
user: login: Microcompressor
body: К комменту https://github.com/Nerofanat/sprint_4/pull/1#discussion_r1975615792 - обрати внимание, что теперь это у тебя поле и имя снова должно быть существительным условным, это на заметку) В комментарии я писал, когда у тебя эти данные были в специальном методе по передаче параметров. Хотя я не уверен, кстати, что для метода под аннотацией @Parameterized.Parameters тоже действуют такие правила именования
created_at: 2025-03-23T14:41:57Z
author_association: NONE
path: src/test/java/OrderingScooterTest.java
user: login: Microcompressor
body: В целом хорошо, но тут по мелочи то тут, то там можно было вынести куски кода в отдельные методы, но не особо важно в данном случае
created_at: 2025-03-23T14:48:11Z
author_association: NONE
diff_hunk: @@ -0,0 +1,48 @@
+package Provision;
+
+import Exceptions.UndefinedBehaviorException;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WrapsDriver;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import Provision.Enum.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static Provision.Constants.TESTING_SITE_URL;
+
+
+public class BrowserInitialization {
+
+    private static WebDriver driver;
+
+    //Создаем список нужных нам браузеров
+    public static final BrowserType[] browserList = BrowserType.values();
+
+    //Основной метод инициализации браузера
+    public static WebDriver getBrowserDriver(BrowserType browser) throws UndefinedBehaviorException {
+        switch (browser) {
+            case CHROME:
+                driver = new ChromeDriver();
+                break;
+            case FIREFOX:
+                driver = new FirefoxDriver();
+                break;
+            default:
+                throw new UndefinedBehaviorException("В метод getBrowserDriver передан неизвестный браузер " + browser);
+        }
+        return driver;
+    }
+
+    public static void goUrl(WebDriver driver) {
path: src/main/java/Provision/BrowserInitialization.java
user: login: Microcompressor
body: Не могу пройти тут мимо - по правилам английского лучше goToUrl именовать
created_at: 2025-03-23T14:48:35Z
author_association: NONE
path: src/main/java/PageObjectPackage/SiteHeader.java
user: login: Microcompressor
body: Сейчас я так посмотрел, я неверно подумал тогда. SiteHeader некорректно логически наследовать от MainPage, надо или просто все поля и методы переносить в MainPage или оставлять отдельным классом. Даже наверное оставлять отдельным классом коректнее будет
created_at: 2025-03-24T07:57:29Z
author_association: NONE

PR comments:
user: login: Microcompressor
created_at: 2025-02-26T14:37:10Z
body: Ты просил проверить "Только я там еще в самом начале запушил два коммита в ветку мейн с файликом ридми", да, есть два коммита, с файликом README:
![image](https://github.com/user-attachments/assets/b8b3848c-e839-4721-aa9c-900ebd376494)

author_association: NONE
user: login: Microcompressor
created_at: 2025-02-26T14:45:13Z
body: Согласно чек-листу "В main хранится пустой файл README.md или заготовка проекта, если её
нужно было клонировать из репозитория Практикума.". У тебя там сейчас не пустой файл README.md
author_association: NONE
user: login: Microcompressor
created_at: 2025-02-26T15:17:14Z
body: Все тесты проходят с ожидаемым результатом?
author_association: NONE
user: login: Microcompressor
created_at: 2025-03-01T06:13:01Z
body: Старайся повторяющиеся значения строковые, числовые и т.п. выносить в константы: так будет их проще переиспользовать, легче читать код и проще поддерживать, например:
private static final String TESTING_SITE_URL = "https://qa-scooter.praktikum-services.ru/";

Даже если это значение используется в рамках класса один раз, то можно его вынести в константу. А если у тебя одно и то же значение используется в разных классах, имеет смысл создать отдельный класс с константами и брать их оттуда. В данном случае, этот URL используется в разных местах очень часто. Представь, что разработчики слегка изменят URL сайта. У тебя сразу упадут все тесты и чтобы их поднять, тебе придётся лазить по всем классам и менять URL. А если у тебя будет константа, которая объявляется в одном месте, то тебе будет достаточно поменять её там и всё

Либо, если ты уберёшь инициализацию веб-драйвера в отдельный класс, что я рекомендую сделать, как это было у Насти, тебе будет ещё проще. В общем, тут замечание везде распространяется: если у тебя где-то больше одного раза используется повторяющееся значение, выноси его в константы, в рамках класса или в отдельный класс - зависит от того, где используется это значение. Важно, что одно и то же значение может быть записано в разные константы, если у них разный смысл, например:
private static final int ELEMENTS_AMOUNT= 2;
private static final int TIMEOUT= 2;
author_association: NONE
user: login: Microcompressor
created_at: 2025-03-01T06:17:40Z
body: Лучше во все имена классов-тестов в конце добавь Test, так будет лучше, я думаю. То есть ко всем в пакете src/test
author_association: NONE
user: login: Microcompressor
created_at: 2025-03-01T06:19:26Z
body: Вообще пакет org/example не содержит ничего нужного тебе, его в целом со всеми классами можно убрать
author_association: NONE
user: login: Microcompressor
created_at: 2025-03-01T11:16:42Z
body: КОММЕНТАРИЙ-ИДЕЯ С ПЕРЕПИСАННЫМ МНОЮ ТЕСТОМ QuestionsAboutTheImportant. ЕСЛИ НЕ ХОЧЕТСЯ СМОТРЕТЬ СПОЙЛЕРЫ КОДА МОЕГО, ТО КОММЕНТАРИЙ ДАННЫЙ ЛУЧШЕ НЕ ЧИТАТЬ, А ТОЛЬКО ЭТУ ШАПКУ. СУТЬ: Я ВЫНЕС ИНИЦИАЛИЗАЦИЮ ДРАЙВЕРА В ОТДЕЛЬНЫЙ КЛАСС И ДОБАВИЛ ЕГО ИСПОЛЬЗОВАНИЕ В ТЕСТЕ QuestionsAboutTheImportant, ЗАОДНО УБРАЛ ДУБЛИКАТЫ КОДА И ПРОЧИЕ НЕБОЛЬШИЕ ПРАВКИ.

Добавил перечисление, где храним все виды браузеров:

public enum Browser {
    CHROME, FIREFOX
}

Добавил класс-инициализатор драйвера:

package org.example;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class WebDriverInitializer {

    private static final String TESTING_SITE_URL = "https://qa-scooter.praktikum-services.ru/";
    // В данном массиве храним все браузеры, в которых необходимо запускать тесты, которые будут этот массив использовать
    public static final Browser[] ALL_BROWSERS_FOR_TESTS = {Browser.CHROME, Browser.FIREFOX};

    public static WebDriver getDriver(Browser browser) {
        WebDriver driver;
        if (browser == Browser.CHROME) {
            driver = new ChromeDriver();
        } else if (browser == Browser.FIREFOX) {
            driver = new FirefoxDriver();
        } else {
            throw new RuntimeException("Browser" + browser + "does not exist");
        }

        return driver;
    }

    public static void setLocalPathsToDrivers() {
        System.setProperty("webdriver.chrome.driver", "E:/AutotestDrivers/chromedriver-win64-133/chromedriver.exe");
        System.setProperty("webdriver.gecko.driver", "E:/AutotestDrivers/FireFoxDriver/geckodriver.exe");
    }

    public static void navigateToStartPage(WebDriver driver) {
        driver.navigate().to(TESTING_SITE_URL);
    }
}

Добавил в MainPage пару новых методов:

 public By getQuestionByQuestionNumber(String questionNumber) {
        return By.id("accordion__heading-".concat(questionNumber));
    }

    public By getAnswerByAnswerNumber(String answerNumber) {
        return By.xpath(".//div [@id = 'accordion__panel-".concat(answerNumber).concat("']/p"));
    }

И, наконец, переписал тест:

import PageObjectPackage.MainPage;
import org.example.Browser;
import org.example.WebDriverInitializer;
import org.junit.BeforeClass;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.junit.Test;
import org.junit.After;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import static org.junit.Assert.assertEquals;

@RunWith(Parameterized.class)
public class QuestionsAboutTheImportant {

    private WebDriver driver;

    private final String[][] questionAnswers = new String[][]{
            {"0", "Сутки — 400 рублей. Оплата курьеру — наличными или картой."},
            {"1", "Пока что у нас так: один заказ — один самокат. Если хотите покататься с друзьями, можете просто сделать несколько заказов — один за другим."},
            {"2", "Допустим, вы оформляете заказ на 8 мая. Мы привозим самокат 8 мая в течение дня. Отсчёт времени аренды начинается с момента, когда вы оплатите заказ курьеру. Если мы привезли самокат 8 мая в 20:30, суточная аренда закончится 9 мая в 20:30."},
            {"3", "Только начиная с завтрашнего дня. Но скоро станем расторопнее."},
            {"4", "Пока что нет! Но если что-то срочное — всегда можно позвонить в поддержку по красивому номеру 1010."},
            {"5", "Самокат приезжает к вам с полной зарядкой. Этого хватает на восемь суток — даже если будете кататься без передышек и во сне. Зарядка не понадобится."},
            {"6", "Да, пока самокат не привезли. Штрафа не будет, объяснительной записки тоже не попросим. Все же свои."},
            {"7", "Да, обязательно. Всем самокатов! И Москве, и Московской области."},
    };

    private final Browser browser;

    public QuestionsAboutTheImportant(Browser browser) {
        this.browser = browser;
    }


    @Parameterized.Parameters
    public static Object[] textComparison() {

        return WebDriverInitializer.ALL_BROWSERS_FOR_TESTS;
    }

    @BeforeClass
    public static void setupPaths() {
        WebDriverInitializer.setLocalPathsToDrivers();
    }

    @Test
    public void testQuestionsAboutTheImportant() {
        checkQuestionsAboutTheImportant(browser);
    }

    @After
    public void teardown() {
        driver.quit();
    }

    private void checkQuestionsAboutTheImportant(Browser browser) {

        driver = WebDriverInitializer.getDriver(browser);
        WebDriverInitializer.navigateToStartPage(driver);

        MainPage page = new MainPage(driver);
        page.clickCookieButton();

        By questionSelector;
        By answer;
        WebElement questionElement;
        WebElement answerElement;

        for (String[] questionAnswer : questionAnswers) {
            questionSelector = page.getQuestionByQuestionNumber(questionAnswer[0]);
            questionElement = driver.findElement(questionSelector);
            ((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView();", questionElement);
            questionElement.click();

            answer = page.getAnswerByAnswerNumber(questionAnswer[0]);
            answerElement = driver.findElement(answer);
            new WebDriverWait(driver, 3)
                    .until(ExpectedConditions.visibilityOf(answerElement));
            assertEquals(questionAnswer[1], answerElement.getText());


        }


    }

}


Всё. Неидеально делал, но плюсы такие: чтобы поменять браузер, в котором запускается тест выше, достаточно сменить составные элементы массива ALL_BROWSERS_FOR_TESTS в классе WebDriverInitializer. Если потребуется добавить новый браузер, достаточно добавить небольшую логику создания драйвера для него в WebDriverInitializer, занести в перечисление Browser. ВАЖНО - не нужно вообще трогать теперь тест, чтобы поменять браузер, в котором мы хотим запускать автотест. Второй плюс, убрали дублирующийся код. Третий - сократили код теста, добавив туда использование методов из MainPage . Четвёртый - теперь мы не 7 раз перезапускаем браузер, а один раз запускаем для каждого вида браузера - минус лишние вызовы и более элегантно стало

Повторюсь, неидеально сделал, я думаю. Я заменил параметризацию строками на браузеры, возможно, можно убрать в параметры и строки и браузер. Плюс имена методов кое-где не сменил или не совсем верно указал
author_association: NONE
user: login: Microcompressor
created_at: 2025-03-23T08:45:31Z
body: Из общего:
1) Старайся не использовать сложные селекторы по типу таких:
private By buttonNext = By.xpath(".//button [@class = 'Button_Button__ra12g Button_Middle__1CSJM' and contains(text(), 'Далее')]")
Они ненадёжны, потому что содержат очень много условий по которому надо искать текст и любые фронт-изменения поломать могут этот селектор. В реальных проектах обычно фронт-разработчики договариваются с автотестерами и делают специальные теги, аттрибуты уникальные для каждого UI-элемента. В данном случае, селектор .//button [contains(text(), 'Далее')] также бы эту кнопку нашёл
2) Кое-где есть неиспользуемые части, но, вроде бы, в основном они намеренно оставлены тобою. Просто имей в виду, что в реальных проектах закомментированного кода должно быть не особо много, а вот комментарии-пояснения только на пользу
3) Осталась кое-где путаница между expected и actual

В целом молодец, хорошо, основную проблему с дублированием кода считай исправил уж точно

author_association: NONE
user: login: Microcompressor
created_at: 2025-03-23T15:04:27Z
body: https://github.com/Nerofanat/sprint_4/pull/1#discussion_r1976373812 - в этом комментарии я имел в виду немного другое, чтобы ты строчки:
 driver.findElement(name).clear();
        driver.findElement(name).sendKeys(yoursName);
        driver.findElement(surname).clear();
        driver.findElement(surname).sendKeys(yoursSurname);
        driver.findElement(address).clear();
        driver.findElement(address).sendKeys(yoursAddress);
        
        вынес в отдельный метод, для переиспользования в методах fillOutTheOrderForm и fillOutTheOrderFormExceptForTheMetroStation
        
        Ну это на будущее заметка. А то ты в метод отдельный вынес часть, но у тебя теперь три строчки дублируются:
        fillField(name, yoursName);
        fillField(surname, yoursSurname);
        fillField(address, yoursAddress);
author_association: NONE