Блог

Selenium Python: первый автотест за 30 минут для QA

Работаешь Manual QA? Хочешь в автоматизацию? Не знаешь с чего начать?
Selenium + Python — популярный стек для автоматизации UI. Я покажу как написать первый автотест за 30 минут. С установкой. С объяснениями. С рабочим кодом.
После статьи запустишь свой первый автотест. И поймёшь как работает автоматизация.

Краткий ответ

Чтобы написать первый автотест на Selenium + Python:
  1. Установи Python 3.8+
  2. Выполни: pip install selenium
  3. Скачай ChromeDriver
  4. Напиши тест: открыть сайт → найти элемент → кликнуть
  5. Запусти: python test.py
Займёт 20-30 минут.

Зачем нужен Selenium

Selenium — инструмент для автоматизации браузера. Пишешь код — он кликает кнопки, заполняет формы, проверяет результаты.
Для чего используют:
✅ Регрессионное тестирование (проверять одно и то же быстро)
✅ Smoke-тесты (критичные сценарии перед релизом)
✅ Кросс-браузерное тестирование (Chrome, Firefox, Safari)
Плюсы:
  • Бесплатный, open source
  • Поддерживает все браузеры
  • Большое комьюнити
  • Интеграция с Pytest, CI/CD
Минусы:
  • Медленнее API-тестов
  • Нестабильные тесты (flaky tests)
  • Требует обслуживания
Selenium — стандарт для UI автотестов. Знать его обязательно для AQA.

Что нужно знать перед стартом

Python базовый:
✓ Переменные, циклы, условия
✓ Функции
✓ Импорты модулей
✓ ООП минимум (классы, методы)
HTML/CSS структура:
✓ Что такое тег, атрибут, класс
✓ Как устроена страница (DOM)
✓ Как найти элемент в DevTools
Не обязательно:
❌ Продвинутый Python
❌ JavaScript
❌ Backend
💡 Не уверен готов ли к автоматизации? Читай план перехода из Manual в Automation

Системные требования

ОС: Windows 10/11, macOS 11+, Linux (Ubuntu 20+)
Python: версия 3.8 или новее
RAM: минимум 4GB (рекомендую 8GB)
Браузер: Chrome 100+ или Firefox 100+
Интернет: для установки пакетов

Установка и настройка окружения

Установка Python

Windows:
  1. Скачай с python.org
  2. При установке поставь галочку "Add Python to PATH"
  3. Проверь: открой cmd, введи python --version
macOS:
brew install python3
python3 --version
Linux:
sudo apt update
sudo apt install python3 python3-pip
python3 --version

Установка Selenium

Открой терминал (cmd на Windows):
pip install selenium
Проверь установку:
pip show selenium
Должна показаться версия 4.х.х

Установка WebDriver (ChromeDriver)

Способ 1: Автоматически (рекомендую)
Selenium 4 скачивает драйвер сам. Просто используй webdriver.Chrome().
Способ 2: Вручную
  1. Узнай версию Chrome: chrome://version
  2. Скачай ChromeDriver с chromedriver.chromium.org
  3. Положи в папку проекта или добавь в PATH
Для Firefox:
pip install webdriver-manager

Проверка установки

Создай файл test_check.py:
from selenium import webdriver

# Открываем браузер
driver = webdriver.Chrome()

# Открываем сайт
driver.get("https://google.com")

# Ждём 3 секунды
import time
time.sleep(3)

# Закрываем браузер
driver.quit()

print("Всё работает!")
Запусти:
python test_check.py
Если открылся Chrome и зашёл на Google — всё ок.

Базовые концепции Selenium

WebDriver — что это

WebDriver — программа которая управляет браузером.
Твой код → WebDriver → Браузер
Для каждого браузера свой WebDriver:
  • Chrome → ChromeDriver
  • Firefox → GeckoDriver
  • Safari → SafariDriver

Локаторы: как найти элемент

Локатор — способ найти элемент на странице.
8 типов локаторов:
Приоритет использования:
  1. ID (если есть и уникальный)
  2. CSS Selector
  3. XPath (если другие не подходят)

Основные методы

# Найти элемент
element = driver.find_element(By.ID, "email")

# Кликнуть
element.click()

# Ввести текст
element.send_keys("test@mail.ru")

# Очистить поле
element.clear()

# Получить текст
text = element.text

# Получить атрибут
value = element.get_attribute("value")

Первый автотест: пошагово

Задача: авторизация на сайте

Напишем тест:
  1. Открыть сайт
  2. Найти поле Email
  3. Ввести email
  4. Найти поле Пароль
  5. Ввести пароль
  6. Нажать кнопку "Войти"
  7. Проверить что вошли

Код теста с комментариями

Создай файл test_login.py:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 1. Создаём объект драйвера (открываем браузер)
driver = webdriver.Chrome()

try:
# 2. Открываем сайт
driver.get("https://example.com/login")

# Ждём загрузки страницы (плохая практика, потом заменим)
time.sleep(2)

# 3. Находим поле Email по ID
email_field = driver.find_element(By.ID, "email")

# 4. Вводим email
email_field.send_keys("test@mail.ru")

# 5. Находим поле пароля
password_field = driver.find_element(By.ID, "password")

# 6. Вводим пароль
password_field.send_keys("qwerty123")

# 7. Находим кнопку "Войти" по CSS селектору
login_button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")

# 8. Кликаем
login_button.click()

# Ждём перехода
time.sleep(3)

# 9. Проверяем что вошли (ищем элемент личного кабинета)
user_menu = driver.find_element(By.CLASS_NAME, "user-menu")

if user_menu:
print("✅ Тест прошёл! Авторизация успешна.")
else:
print("❌ Тест упал! Не нашли user-menu.")

except Exception as e:
print(f"❌ Ошибка: {e}")

finally:
# 10. Всегда закрываем браузер
driver.quit()

Запуск и результат

python test_login.py
Если всё ок:
  • Откроется Chrome
  • Заполнятся поля
  • Кликнется кнопка
  • В консоли: "✅ Тест прошёл!"

Локаторы подробнее

By ID


element = driver.find_element(By.ID, "email")
Когда использовать:
Когда у элемента есть уникальный ID.
HTML:
<input id="email" type="text">

By Class Name

element = driver.find_element(By.CLASS_NAME, "btn-primary")
Внимание: если классов несколько, найдёт первый.

By XPath

# Абсолютный XPath (плохо, ломается при изменениях)
element = driver.find_element(By.XPATH, "/html/body/div/form/input")[1]

# Относительный XPath (лучше)
element = driver.find_element(By.XPATH, "//input[@id='email']")

# По тексту
button = driver.find_element(By.XPATH, "//button[text()='Войти']")

# По части текста
link = driver.find_element(By.XPATH, "//a[contains(text(), 'Регистр')]")
Как получить XPath:
  1. Открой DevTools (F12)
  2. Найди элемент
  3. ПКМ → Copy → Copy XPath

By CSS Selector

# По ID
element = driver.find_element(By.CSS_SELECTOR, "#email")

# По классу
element = driver.find_element(By.CSS_SELECTOR, ".btn-primary")

# По атрибуту
element = driver.find_element(By.CSS_SELECTOR, "input[type='email']")

# Комбинация
element = driver.find_element(By.CSS_SELECTOR, "form.login-form input#email")
CSS обычно быстрее и читабельнее XPath.

Ожидания: implicit и explicit wait

Проблема

driver.get("https://example.com")
element = driver.find_element(By.ID, "slow-element") # ❌ Ошибка! Элемент ещё не загрузился

Implicit Wait (неявное ожидание)

Selenium ждёт до X секунд перед ошибкой.
driver.implicitly_wait(10) # Ждать до 10 секунд

driver.get("https://example.com")
element = driver.find_element(By.ID, "slow-element") # ✅ Подождёт загрузки
Плюсы: настроил один раз, работает везде.
Минусы: ждёт каждый элемент, замедляет тесты.

Explicit Wait (явное ожидание)

Ждём конкретное условие для конкретного элемента.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Ждём до 10 секунд пока элемент станет кликабельным
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "button")))
element.click()
Популярные условия:
  • presence_of_element_located — элемент есть в DOM
  • visibility_of_element_located — элемент видим
  • element_to_be_clickable — элемент кликабельный
  • text_to_be_present_in_element — текст в элементе
Рекомендация: используй explicit wait для важных действий.

Pytest vs unittest для Selenium

unittest (встроенный в Python)

import unittest
from selenium import webdriver

class TestLogin(unittest.TestCase):

def setUp(self):
self.driver = webdriver.Chrome()

def test_successful_login(self):
driver = self.driver
driver.get("https://example.com/login")
# ... тест
self.assertTrue(condition)

def tearDown(self):
self.driver.quit()

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

pytest (рекомендую)

import pytest
from selenium import webdriver

@pytest.fixture
def driver():
driver = webdriver.Chrome()
yield driver
driver.quit()

def test_successful_login(driver):
driver.get("https://example.com/login")
# ... тест
assert condition
Почему pytest лучше:
✅ Проще синтаксис (обычные функции, assert)
✅ Мощные фикстуры
✅ Параметризация тестов
✅ Лучшие отчёты
✅ Больше плагинов
Установка pytest:
pip install pytest
Запуск:
pytest test_login.py

Частые ошибки новичков

1. NoSuchElementException
selenium.common.exceptions.NoSuchElementException: Unable to locate element
Причины:
  • Элемент не загрузился (добавь ожидание)
  • Неправильный локатор (проверь в DevTools)
  • Элемент в iframe (переключись: driver.switch_to.frame())
Решение:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "email")))
2. ElementNotInteractableException
Element is not clickable at point (x, y)
Причины:
  • Элемент перекрыт другим (попап, баннер)
  • Элемент вне видимой области (проскролль)
Решение:
# Скролл к элементу
driver.execute_script("arguments.scrollIntoView();", element)
element.click()
3. StaleElementReferenceException
Stale element reference: element is not attached to the page document
Причина: элемент удалён из DOM (страница обновилась).
Решение: найди элемент заново.
4. time.sleep() везде
❌ Плохо:
time.sleep(5) # Ждём всегда 5 секунд
✅ Хорошо:
WebDriverWait(driver, 10).until(...) # Ждём до 10, но продолжим как только элемент появится
5. Абсолютные XPath
❌ Плохо:
driver.find_element(By.XPATH, "/html/body/div/div/form/input")[2][1]
✅ Хорошо:
driver.find_element(By.XPATH, "//input[@id='email']")

Best practices для начинающих

1. Используй explicit waits
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "button")))
2. Закрывай браузер в finally
try:
driver.get("...")
finally:
driver.quit()
3. Предпочитай ID и CSS локаторам
XPath — последний вариант.
4. Делай скриншоты при ошибке
except Exception as e:
driver.save_screenshot("error.png")
raise e
5. Не храни данные в коде
# ❌ Плохо
password = "qwerty123"

# ✅ Хорошо
import os
password = os.getenv("TEST_PASSWORD")
6. Один тест — одна проверка
Не делай мега-тест на 50 шагов.
7. Используй headless для CI/CD
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)

Troubleshooting: решение частых проблем

Проблема: ChromeDriver not found
Решение:
# Используй webdriver-manager
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
Проблема: Элемент не найден, хотя вижу его на странице
Решение:
  1. Проверь что элемент не в iframe
  2. Добавь ожидание
  3. Проверь локатор в DevTools (Ctrl+F в Elements)
Проблема: Тест работает локально, падает на CI/CD
Решение:
Используй headless режим:
options = Options()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options)

Что изучать дальше

Освоил базу? Двигайся дальше:
1. Page Object Model (POM)
Паттерн для организации кода. Вместо кучи локаторов в тесте — отдельные классы для страниц.
2. Pytest фикстуры
@pytest.fixture для setup/teardown, передачи данных.
3. Параметризация тестов
@pytest.mark.parametrize("username,password", [
("user1", "pass1"),
("user2", "pass2")
])
def test_login(username, password):
...
4. Allure отчёты
Красивые отчёты о прогоне тестов.
5. CI/CD интеграция
Запуск тестов в Jenkins, GitLab CI, GitHub Actions.
6. Selenium Grid
Параллельный запуск тестов на разных машинах.
💡 Хочешь глубже освоить автоматизацию? На курсе Automation Python пройдём всё это с ментором.

Вопросы и ответы

Сколько нужно знать Python для Selenium?
Базовый уровень: переменные, циклы, функции, импорты. ООП на минимуме.
Что лучше: XPath или CSS Selector?
CSS быстрее и читабельнее. XPath используй когда CSS не подходит (поиск по тексту, навигация вверх по DOM).
Нужен ли Selenium Grid новичку?
Нет. Сначала научись писать стабильные тесты. Grid для масштабирования.
Как найти локатор элемента?
Открой DevTools (F12) → Elements → найди элемент → ПКМ → Copy → Copy selector/XPath.
Почему тесты нестабильные (flaky)?
Нет ожиданий, динамическая подгрузка, плохие локаторы. Используй explicit waits.
Pytest или unittest?
Pytest. Проще, мощнее, популярнее.
Можно ли автоматизировать всё?
Нет. Исследовательское тестирование, UX, некоторые mobile-сценарии — руками эффективнее.

Следующие шаги

Теперь знаешь базу Selenium + Python. Написал первый автотест.
Что делать:
  1. Попрактикуйся: автоматизируй 3-5 сценариев
  2. Изучи pytest
  3. Попробуй Page Object Model
  4. Добавь тесты в портфолио

Как я могу помочь

Kонсультация

Не уверен с чего начать автоматизацию?
Запишись на созвон:
✓ Оценю твой уровень Python
✓ Скажу готов ли к Selenium
✓ Дам план обучения
✓ Отвечу на вопросы

Курс автоматизации Python

Хочешь глубже освоить автоматизацию?
✓ Selenium + Pytest от А до Я
✓ Page Object Model
✓ CI/CD интеграция (Jenkins, GitLab)
✓ Портфолио автотестов для резюме
✓ Подготовка к собесам на AQA
Формат: 1:1 с ментором
Срок: 2-3 месяца
Еще больше полезных материалов в моем телеграм-канале https://t.me/yanaoqa
2025-12-03 00:26