← Назад к вопросам

Приведи пример тестов на Selenium

1.6 Junior🔥 161 комментариев
#Автоматизация тестирования#Инструменты тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Примеры тестов с использованием Selenium

Selenium — это мощный инструмент для автоматизации взаимодействия с веб-браузером, и в контексте тестирования он чаще всего применяется для функционального, интеграционного и регрессионного тестирования веб-приложений. Основная задача таких тестов — проверить, что ключевые пользовательские сценарии работают корректно в реальном браузерном окружении. Я покажу примеры для популярных фреймворков: Selenium WebDriver с Python (unittest) и Selenium с Java (JUnit).

Пример 1: Тест на Python с использованием unittest и Selenium WebDriver

Этот тест проверяет базовый сценарий поиска на сайте Google. Мы используем паттерн Page Object Model (POM) для улучшения читаемости и поддерживаемости кода.

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# Page Object для страницы поиска Google
class GoogleSearchPage:
    def __init__(self, driver):
        self.driver = driver
        self.search_box = (By.NAME, 'q')
        self.search_results = (By.CSS_SELECTOR, 'div.g')

    def open(self):
        self.driver.get("https://www.google.com")

    def search_for(self, query):
        search_input = self.driver.find_element(*self.search_box)
        search_input.clear()
        search_input.send_keys(query)
        search_input.send_keys(Keys.RETURN)

    def get_first_result_title(self):
        results = self.driver.find_elements(*self.search_results)
        if results:
            return results[0].find_element(By.CSS_SELECTOR, 'h3').text
        return None

# Класс теста
class GoogleSearchTest(unittest.TestCase):
    def setUp(self):
        # Инициализация драйвера (здесь используется Chrome)
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(10)  # Неявное ожидание элементов
        self.search_page = GoogleSearchPage(self.driver)

    def tearDown(self):
        # Закрытие браузера после каждого теста
        self.driver.quit()

    # Тест-кейс: успешный поиск с проверкой первого результата
    def test_search_for_selenium_and_verify_first_result(self):
        self.search_page.open()
        self.search_page.search_for("Selenium WebDriver")
        
        # Проверка, что заголовок первого результата содержит ключевое слово
        first_title = self.search_page.get_first_result_title()
        self.assertIsNotNone(first_title)
        self.assertIn("Selenium", first_title.lower())

    # Тест-кейс: проверка поведения при пустом запросе
    def test_empty_search_query(self):
        self.search_page.open()
        self.search_page.search_for("")
        
        # Ожидание, что страница не перенаправляет и остается на главной
        current_url = self.driver.current_url
        self.assertTrue("google.com" in current_url)

if __name__ == "__main__":
    unittest.main()

Ключевые моменты в этом примере:

  • Использование Page Object Model для абстрагирования структуры страницы.
  • setUp и tearDown для управления жизненным циклом браузера.
  • Неявные ожидания (implicit wait) для устойчивости к загрузке динамического контента.
  • Четкие assert утверждения для проверки ожидаемых результатов.

Пример 2: Тест на Java с использованием JUnit 5 и Selenium WebDriver

Этот тест проверяет процесс логина на демо-сайте. Мы также используем POM и добавляем более сложные ожидания.

import org.junit.jupiter.api.*;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;

// Page Object для страницы логина
class LoginPage {
    private WebDriver driver;
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By loginButton = By.cssSelector("button[type='submit']");
    private By successMessage = By.className("flash.success");

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

    public void open(String url) {
        driver.get(url);
    }

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

    public String getSuccessMessageText() {
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        WebElement message = wait.until(ExpectedConditions.visibilityOfElementLocated(successMessage));
        return message.getText();
    }
}

// Класс теста
public class LoginFunctionalityTest {
    private WebDriver driver;
    private LoginPage loginPage;

    @BeforeEach
    public void setUp() {
        // Установка пути к драйверу и инициализация
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        driver = new ChromeDriver();
        loginPage = new LoginPage(driver);
    }

    @AfterEach
    public void tearDown() {
        if (driver != null) {
            driver.quit();
        }
    }

    // Тест-кейс: успешный логин с корректными кредами
    @Test
    public void testSuccessfulLogin() {
        loginPage.open("https://the-internet.herokuapp.com/login");
        loginPage.login("tomsmith", "SuperSecretPassword!");

        String message = loginPage.getSuccessMessageText();
        Assertions.assertTrue(message.contains("You logged into a secure area!"),
                "Сообщение об успешном логине не появилось или некорректно.");
    }

    // Тест-кейс: неуспешный логин с неправильным паролем
    @Test
    public void testFailedLoginWithWrongPassword() {
        loginPage.open("https://the-internet.herokuapp.com/login");
        loginPage.login("tomsmith", "WrongPassword");

        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
        WebElement errorMessage = wait.until(
                ExpectedConditions.visibilityOfElementLocated(By.className("flash.error")));

        Assertions.assertTrue(errorMessage.getText().contains("Your password is invalid!"),
                "Сообщение об ошибке логина не появилось или некорректно.");
    }
}

Ключевые моменты в этом примере:

  • Использование явных ожиданий (WebDriverWait) для точного контроля состояния элементов (например, visibilityOfElementLocated). Это более надежно, чем неявные ожидания.
  • Четкое разделение позитивных и негативных тест-кейсов.
  • JUnit 5 (@BeforeEach, @AfterEach, @Test) для структуризации тестов.

Общие принципы написания хороших Selenium тестов

На основе этих примеров можно выделить несколько важных практик:

  • Использование Page Object Model (POM): Это позволяет отделить логику теста от структуры HTML, упрощает рефакторинг и улучшает читаемость.
  • Управление ожиданиями: Правильное использование Implicit Waits и Explicit Waits критично для работы с динамическими веб-приложениями и предотвращения ошибок NoSuchElementException.
  • Инициализация и очистка (setUp/tearDown): Каждый тест должен запускаться в чистом состоянии, а браузер — корректно закрываться, чтобы избежать утечек ресурсов.
  • Выбор селекторов: Использовать стабильные и уникальные селекторы (например, id, data-testid), избегать сложных XPath, зависящих от структуры DOM.
  • Проверка не только "happy path": Включать тесты на негативные сценарии (неправильные данные, отсутствие элементов) и граничные условия.

Эти примеры демонстрируют базовый, но профессиональный подход к созданию автоматизированных тестов с Selenium. В реальных проектах это часто дополняется интеграцией с CI/CD системами (Jenkins, GitLab CI), использованием фреймворков для отчетов (Allure), и управлением тестовыми данными.