Введение в автоматизацию с Selenium
Selenium — мощный open-source инструмент для автоматизации веб-браузеров. Используется в:
- Функциональном и регрессионном тестировании
- Автоматизации рутинных задач (парсинг, формы)
- Интеграции с CI/CD (Jenkins, GitHub Actions, GitLab CI)
- Кросс-браузерном тестировании
Рекомендация: Используйте
Selenium 4.15+ — поддержка W3C, CDP, относительные локаторы.
Установка и настройка
1. Python и pip
Скачайте с python.org (рекомендуется 3.10+)
2. Установка Selenium
pip install selenium
3. WebDriver Manager (авто-драйверы)
pip install webdriver-manager
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
driver = webdriver.Chrome(ChromeDriverManager().install())
4. Драйверы (если вручную)
| Браузер | Драйвер | Ссылка |
|---|---|---|
| Chrome | ChromeDriver | Chrome for Testing |
| Firefox | GeckoDriver | GitHub |
| Edge | EdgeDriver | Microsoft |
Локаторы: поиск элементов
Приоритет выбора локатора определяет стабильность тестов.
| Приоритет | Локатор | Пример | Стабильность |
|---|---|---|---|
| 1 | ID | By.ID, "email" | ★★★★★ |
| 2 | NAME | By.NAME, "password" | ★★★★☆ |
| 3 | CSS | By.CSS_SELECTOR, ".btn-login" | ★★★★☆ |
| 4 | XPath | By.XPATH, "//button[contains(text(),'Войти')] | ★★★☆☆ |
from selenium.webdriver.common.by import By
email = driver.find_element(By.NAME, "email")
button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
link = driver.find_element(By.PARTIAL_LINK_TEXT, "Забыли")
Основные команды
Навигация:
driver.get("https://example.com")
driver.refresh()
driver.back()
driver.forward()
print(driver.title)
print(driver.current_url)
Действия с элементами:
element.send_keys("text")
element.clear()
element.click()
element.submit()
element.text
element.get_attribute("value")
Ожидания (WebDriverWait):
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 20)
element = wait.until(EC.element_to_be_clickable((By.ID, "submit")))
Избегайте time.sleep() — используйте только явные ожидания!
Page Object Model (POM)
Чистая архитектура: разделение логики страниц и тестов.
page/login_page.py
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.url = "https://example.com/login"
def open(self):
self.driver.get(self.url)
return self
def login(self, email, password):
self.driver.find_element(By.NAME, "email").send_keys(email)
self.driver.find_element(By.NAME, "password").send_keys(password)
self.driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
return DashboardPage(self.driver)
CI/CD интеграция
GitHub Actions
name: Selenium Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- run: pip install selenium pytest webdriver-manager
- run: pytest tests/ --headless --junitxml=report.xml
Headless + CI:
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)
Ресурсы Selenium Python
Selenium Documentation
Официальное руководство (англ.)
Selenium with Python
Подробная документация на Python
SeleniumHQ/selenium
Репозиторий на GitHub
BrowserStack Guide
Облачное тестирование
pytest-selenium
Интеграция с PyTest
Selenium Tutorials (YouTube)
Видеоуроки (пример)