Python: Selenium

Теория: Первый тест

После установки всех зависимостей можно написать первый тест и проверить, что Selenium управляет браузером. Начинается всё с импорта нужного модуля.

from selenium import webdriver

Модуль webdriver — это основа Selenium. Он отвечает за запуск браузера, отправку команд и получение результатов. Через него создаётся объект драйвера, который управляет браузером во время теста.

Например, чтобы открыть Chrome, используется конструктор webdriver.Chrome(). Этот вызов обращается к установленному драйверу ChromeDriver и запускает новое окно браузера. Если ChromeDriver находится в PATH, Selenium найдёт его автоматически.

driver = webdriver.Chrome()

Дальше браузеру передаётся команда загрузить страницу:

driver.get("https://example.com")

Метод get() открывает указанный адрес и ждёт полной загрузки документа, включая HTML, CSS и JavaScript. Если сайт открылся — значит связка Selenium и драйвера работает правильно.

После выполнения действий браузер нужно закрыть:

driver.quit()

Метод quit() завершает сессию WebDriver и корректно останавливает процессы браузера.

Полный код первого теста:

from selenium import webdriver


driver = webdriver.Chrome()
driver.get("https://example.com")
driver.quit()

При запуске откроется окно браузера, загрузится страница example.com, затем браузер закроется. Это базовая проверка, что окружение Selenium установлено корректно и готово к работе.

Открытие браузера

Когда модуль Selenium установлен, можно запустить браузер из кода. Для этого используется объект WebDriver. Он открывает браузер, управляет вкладками и выполняет действия пользователя.

Чтобы открыть Chrome, создаётся экземпляр драйвера:

from selenium import webdriver

driver = webdriver.Chrome()

Команда webdriver.Chrome() запускает браузер Chrome через программу ChromeDriver. Этот драйвер должен быть установлен в системе и находиться в переменной PATH. Если всё настроено правильно, при выполнении кода откроется новое окно браузера.

Selenium поддерживает и другие браузеры. Для Firefox используется webdriver.Firefox(), для Edge — webdriver.Edge(), для Safari — webdriver.Safari(). Пример для Firefox:

from selenium import webdriver

driver = webdriver.Firefox()

При необходимости драйверу можно передавать настройки, например путь к профилю пользователя, аргументы запуска или флаги безголового режима. Пример запуска без интерфейса:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()
options.add_argument("--headless")  # Запуск без окна браузера
driver = webdriver.Chrome(options=options)

Такой режим используется на серверах и в CI/CD, где браузер должен работать без графической оболочки.

Если при запуске браузер открывается и не выдаёт ошибок, значит WebDriver установлен корректно, и можно переходить к управлению страницей.

Поиск элемента и клик

После открытия страницы браузером можно взаимодействовать с элементами интерфейса: нажимать кнопки, вводить текст, выбирать пункты меню. Всё это выполняется через методы поиска элементов и действий WebDriver.

Чтобы Selenium мог найти элемент, нужно указать, по какому признаку его искать. Для этого используется модуль By:

from selenium.webdriver.common.by import By

Пример простого сценария: открыть страницу и нажать кнопку.

from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get("https://www.w3schools.com/html/html_forms.asp")

## Поиск кнопки по тегу и клик
button = driver.find_element(By.TAG_NAME, "button")
button.click()

driver.quit()

Метод find_element() ищет первый подходящий элемент по заданному признаку. В примере поиск идёт по тегу button. В реальных тестах чаще используются другие способы:

  • По id: driver.find_element(By.ID, "login-button")
  • По имени: driver.find_element(By.NAME, "username")
  • По классу: driver.find_element(By.CLASS_NAME, "btn-primary")
  • По CSS-селектору: driver.find_element(By.CSS_SELECTOR, ".form .submit")
  • По XPath: driver.find_element(By.XPATH, "//button[text()='Login']")

После того как элемент найден, над ним можно выполнять действия:

  • click() — клик мышью,
  • send_keys("текст") — ввод текста,
  • clear() — очистка поля ввода.

Например, тест, который заполняет форму логина:

from selenium import webdriver
from selenium.webdriver.common.by import By


driver = webdriver.Chrome()
driver.get("https://example.com/login")

username = driver.find_element(By.NAME, "username")
password = driver.find_element(By.NAME, "password")
login_button = driver.find_element(By.ID, "submit")

username.send_keys("tester")
password.send_keys("12345")
login_button.click()

driver.quit()

Этот код открывает страницу входа, вводит данные и нажимает кнопку «Войти». Так Selenium выполняет те же действия, что и пользователь, только автоматически.

Проверка результата с помощью assert

После выполнения действий на странице важно убедиться, что результат соответствует ожиданиям. Для этого в тестах используется оператор assert. Он сравнивает фактическое значение с ожидаемым и вызывает ошибку, если условие не выполнено.

Простейший пример: проверка заголовка страницы после открытия сайта.

from selenium import webdriver


driver = webdriver.Chrome()
driver.get("https://example.com")

## Проверка: в заголовке страницы должно быть слово "Example"
assert "Example" in driver.title

driver.quit()

Если условие выполняется, тест проходит успешно. Если заголовок не содержит нужного текста, Pytest покажет сообщение об ошибке с деталями:

AssertionError: assert 'Example' in 'Test Domain'

Оператор assert можно использовать с любыми выражениями. Например, проверка URL после перехода по ссылке:

driver.get("https://example.com")
link = driver.find_element("tag name", "a")
link.click()
assert "iana.org" in driver.current_url

Или проверка содержимого элемента:

message = driver.find_element("tag name", "h1")
assert message.text == "Example Domain"

Если тест должен проверить несколько шагов, можно использовать несколько assert подряд. Каждый из них фиксирует конкретное ожидание:

assert "Example" in driver.title
assert "https://example.com" in driver.current_url
assert driver.find_element("tag name", "h1").text == "Example Domain"

При падении любого из них Pytest укажет, какой именно тест не прошёл.

Рекомендуемые программы

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845