Работал ли ты с Selenium?

Ответ

Да, я использовал Selenium WebDriver для автоматизации UI-тестов веб-приложений. Мой основной стек — Java, Selenium, TestNG/JUnit, Maven/Gradle с обязательным применением Page Object Model (POM) для поддержания читаемости и реюзабельности кода.

Ключевые практики, которые я применяю:

  1. Page Object Model: Каждая страница или значимый компонент представлен отдельным классом, что изолирует локаторы и действия.
  2. Explicit Waits: Использую WebDriverWait для ожидания элементов, что делает тесты стабильнее.
  3. Параллельный запуск: Настраивал Selenium Grid или использовал возможности TestNG для параллельного выполнения тестов в разных браузерах.
  4. Интеграция с системами отчетности: Настраивал генерацию подробных отчетов через Allure или ExtentReports.

Пример теста на Java (TestNG + Page Object):

// Page Object Class
public class LoginPage {
    private WebDriver driver;
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton = By.cssSelector("button[type='submit']");
    private By errorMessage = By.className("alert-error");

    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    public void login(String username, String password) {
        driver.findElement(usernameField).sendKeys(username);
        driver.findElement(passwordField).sendKeys(password);
        driver.findElement(submitButton).click();
    }

    public boolean isErrorMessageDisplayed() {
        return driver.findElement(errorMessage).isDisplayed();
    }
}

// Test Class
public class LoginTests {
    WebDriver driver;
    LoginPage loginPage;

    @BeforeMethod
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.get("https://example.com/login");
        loginPage = new LoginPage(driver);
    }

    @Test
    public void testLoginWithInvalidCredentialsShowsError() {
        loginPage.login("wrongUser", "wrongPass");

        // Используем Explicit Wait для ожидания ошибки
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        wait.until(ExpectedConditions.visibilityOfElementLocated(
            loginPage.getErrorMessageLocator()
        ));

        Assert.assertTrue(loginPage.isErrorMessageDisplayed(), 
            "Error message should be visible after invalid login");
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }
}

Для быстрого написания стабильных тестов на Java я также использовал Selenide — обертку над Selenium с более лаконичным синтаксисом.

Ответ 18+ 🔞

Хули ты думал, я, как какой-нибудь лох, руками всё кликаю? Конечно, Selenium WebDriver юзал, чтобы эти веб-интерфейсы автоматизировать. Мой основной набор — это Java, Selenium, TestNG/JUnit, Maven/Gradle, и без Page Object Model (POM) я вообще не представляю, как можно писать тесты, которые через месяц не превратятся в пиздапроебибну.

Что я делаю, чтобы не сойти с ума и не убить коллег:

  1. Page Object Model: Каждая страница — это отдельный класс, блядь. Все локаторы и методы там, в одном месте. Не надо потом пол-проекта перелопачивать, если кнопку переименовали.
  2. Explicit Waits: Только WebDriverWait, ёпта. Никаких Thread.sleep() — это признак того, что у человека в голове хуй с винтом. Ждём конкретные условия, тесты стабильнее, нервы целее.
  3. Параллельный запуск: Настраивал Selenium Grid, чтобы всё летало быстрее. Либо фичи TestNG использовал, чтобы тесты по потокам гонять в разных браузерах. Время — деньги, ебать.
  4. Отчёты, которые можно показать: Подключал Allure или ExtentReports. Чтобы не просто «упал/не упал», а красивая хуйня, где видно, на каком шаге всё пошло по пизде. Для менеджеров — самое то.

Вот, смотри, как это примерно выглядит в коде (TestNG + Page Object): (Блок кода не трогаю, оставляю как есть)

// Page Object Class
public class LoginPage {
    private WebDriver driver;
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By submitButton = By.cssSelector("button[type='submit']");
    private By errorMessage = By.className("alert-error");

    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    public void login(String username, String password) {
        driver.findElement(usernameField).sendKeys(username);
        driver.findElement(passwordField).sendKeys(password);
        driver.findElement(submitButton).click();
    }

    public boolean isErrorMessageDisplayed() {
        return driver.findElement(errorMessage).isDisplayed();
    }
}

// Test Class
public class LoginTests {
    WebDriver driver;
    LoginPage loginPage;

    @BeforeMethod
    public void setUp() {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        driver.get("https://example.com/login");
        loginPage = new LoginPage(driver);
    }

    @Test
    public void testLoginWithInvalidCredentialsShowsError() {
        loginPage.login("wrongUser", "wrongPass");

        // Используем Explicit Wait для ожидания ошибки
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        wait.until(ExpectedConditions.visibilityOfElementLocated(
            loginPage.getErrorMessageLocator()
        ));

        Assert.assertTrue(loginPage.isErrorMessageDisplayed(), 
            "Error message should be visible after invalid login");
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }
}

А ещё, честно говоря, когда уже овердохуища этих findElement и WebDriverWait писать, брал Selenide. Это такая обёртка над Selenium, там синтаксис в разы короче и приятнее. Для быстрого написания стабильных проверок на Java — просто ядрёна вошь, рекомендую.