Приведи пример тестов на Selenium
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Примеры тестов с использованием 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), и управлением тестовыми данными.