Python: Selenium
Теория: Действия на странице
Ввод текста и очистка полей
После того как Selenium открыл страницу и нашёл элемент, с ним можно взаимодействовать. Поля ввода - частый пример. Через них тестировщик имитирует ввод логина, пароля, комментария или любого другого текста.
Для этого используется метод send_keys(). Он передаёт символы в элемент точно так же, как если бы пользователь печатал их с клавиатуры.
Пример: ввод текста в поле поиска Google.
Selenium вводит символы один за другим и запускает поиск, как при ручном вводе.
Если перед вводом нужно очистить поле, используется метод clear(). Он удаляет всё содержимое элемента. Например, если нужно ввести новое значение:
Методы send_keys() и clear() работают с любыми элементами ввода — <input>, <textarea> и даже с полями, созданными через JavaScript. При тестировании форм эти команды применяются почти в каждом сценарии: логин, регистрация, поиск, отправка комментариев.
Когда clear() не работает
В интерфейсах на React (в том числе Material UI) ввод часто контролируется JavaScript-состоянием. Метод clear() очищает значение в DOM, но компонент не получает событие изменения и мгновенно возвращает старое значение. В таких случаях поле очищают клавиатурой: выделить всё → удалить → ввести новое значение.
Такой приём стабильно срабатывает в Kanban-досках и других MUI-приложениях, где напрямую изменить value не удаётся.
Выпадающие списки MUI и role="combobox"
Компоненты Select в MUI скрывают настоящий <input> и рисуют кликабельный div с role="combobox". Если кликнуть в сам input, ничего не произойдёт, поэтому сначала нужно найти «триггер», а уже затем дождаться и выбрать пункт списка:
Ключевые моменты: дождаться появления списка, переключиться на role="combobox", использовать element_to_be_clickable для пункта и не полагаться на implicitly_wait.
Скрытые input в React Admin
Некоторые формы рендерят видимый блок и отдельный скрытый input[type="hidden"], который хранит выбранное значение. Чтобы обновить поле, приходится менять значение через JavaScript и руками отправлять событие:
После обновления значения стоит кликнуть по триггеру или подтвердить форму, чтобы фронтенд синхронизировал состояние. Этот подход полезен для React Admin и других библиотек с контролируемыми полями и скрытыми инпутами.
Получение текста и атрибутов элементов
После того как Selenium нашёл элемент, часто нужно проверить, что в нём отображается правильный текст или что у него есть нужные атрибуты — например, класс, значение или ссылка. Для этого используются свойства .text и метод .get_attribute().
Свойство .text возвращает видимый текст внутри элемента. Например, проверка заголовка страницы:
Selenium извлекает именно тот текст, который виден пользователю в браузере, без скрытых тегов и скриптов.
Если нужно получить не текст, а значение атрибута — используется метод .get_attribute(). Например, у ссылок часто проверяют атрибут href:
С помощью .get_attribute() можно получить любое свойство HTML-элемента:
value— текущее значение поля ввода,class— список CSS-классов,id,name,titleи другие.
Пример с полем ввода:
Эти методы — основа проверки содержимого страницы. .text показывает, что видит пользователь, а .get_attribute() — что записано в коде элемента.
Тест авторизации
Тест авторизации проверяет, что пользователь с валидными данными попадает в личный кабинет, а с неверными — видит сообщение об ошибке. Для предсказуемого примера используется учебная страница https://the-internet.herokuapp.com/login, где логин tomsmith и пароль SuperSecretPassword!.
Ниже приведён вариант на Pytest, который опирается на фикстуру browser из conftest.py. В тесте применяются явные ожидания, чтобы дождаться элементов перед действиями и исключить «гонки» с загрузкой страницы.
Поле username и password ищутся по id, кнопка входа — по CSS-селектору button.radius, флеш-сообщение — по id="flash". Для устойчивости применяются условия visibility_of_element_located, element_to_be_clickable и url_contains, чтобы действия выполнялись только после готовности страницы.
Завершение сессии браузера
После выполнения теста браузер обязательно закрывается. Это предотвращает зависание процессов WebDriver и освобождает ресурсы системы. Завершение выполняется методом quit(). Он закрывает все вкладки, завершает сессию драйвера и разрывает соединение между Selenium и браузером.
Пример минимального сценария:
Иногда в коде встречается метод close(). Он закрывает только текущее окно браузера, но оставляет сессию активной. Если открыто несколько вкладок, остальные остаются работать. В автотестах почти всегда используется именно quit(), потому что он завершает всю сессию целиком.
Для Pytest правильнее управлять закрытием браузера через фикстуры. Тогда WebDriver будет автоматически завершать работу после каждого теста.
В этом примере код после yield выполняется всегда — даже если тест упал с ошибкой. Такой подход гарантирует, что браузер не останется висеть в памяти, а каждый тест начнёт работу с чистой сессией.


