1. Технические основы
Заполнение и отправка форм
Работа с формами часто требуется для автоматизации регистрации пользователей, заполнения анкет, сбора данных и многого другого. Когда вам нужно заполнить сотни форм, вручную это сделать — как попробовать съесть арбуз через соломинку. А нашими суперспособностями с Selenium мы сделаем это за считанные секунды.
Давайте для начала разберём, как мы можем заполнять текстовые поля и отправлять формы. На примере типичной формы входа на сайт мы изучим основные шаги:
from selenium import webdriver
# Настройка драйвера (например, ChromeDriver)
driver = webdriver.Chrome()
try:
# Открытие веб-страницы
driver.get("https://example.com/login")
# Поиск поля ввода для имени пользователя и ввод текста
username_input = driver.find_element_by_name("username")
username_input.send_keys("мой_логин")
# Поиск поля ввода для пароля и ввод текста
password_input = driver.find_element_by_name("password")
password_input.send_keys("мой_пароль")
# Поиск кнопки отправки формы и нажатие на неё
submit_button = driver.find_element_by_name("submit")
submit_button.click()
finally:
# Закрытие драйвера
driver.quit()
Валидация и обработка ошибок
Ничто не портит день программиста больше, чем ошибки, выскакивающие в ненужный момент. Поэтому обрабатываем их заранее. Используем try/except для перехвата ошибок и ведем логи, чтобы разобраться в том, что пошло не так.
try:
username_input = driver.find_element_by_name("username")
username_input.send_keys("мой_логин")
except Exception as e:
print(f"Ошибка при заполнении имени пользователя: {e}")
logging.error("Ошибка при заполнении имени пользователя", exc_info=True)
2. Флажки (Checkboxes)
Теперь, когда мы уже научились нажимать кнопки, давайте попробуем выбирать несколько опций из списка. Чтобы поставить или снять флажок, можно также использовать метод click(). Если нужно проверить, установлен ли флажок, используется атрибут is_selected().
checkbox = driver.find_element_by_id("checkbox_id")
if not checkbox.is_selected():
checkbox.click()
3. Переключатели (Radio Buttons)
Переключатели позволяют выбирать только одну опцию из нескольких. Работать с ними можно как с флажками: выбирать опцию с помощью метода click() и проверять состояние с помощью is_selected().
radio_button = driver.find_element_by_id("radio_button_id")
if not radio_button.is_selected():
radio_button.click()
4. Выпадающие списки (Dropdowns)
Выпадающие списки содержат несколько вариантов на выбор. В Selenium есть класс Select, который предоставляет методы для работы с такими списками.
from selenium.webdriver.support.ui import Select
dropdown = Select(driver.find_element_by_id("dropdown_id"))
dropdown.select_by_visible_text("Option 1")
Также можно выбирать варианты с помощью select_by_index() или select_by_value().
5. Текстовые области (Text Areas)
Текстовые области похожи на текстовые поля, но обычно используются для ввода большого объема текста. Работа с ними идентична работе с текстовыми полями.
text_area = driver.find_element_by_id("textarea_id")
text_area.send_keys("This is a sample text for the text area.")
6. Календарь (Date Picker)
Календарные поля позволяют пользователям выбирать даты. Если это обычное текстовое поле, поддерживающее формат даты, можно использовать send_keys() для ввода значения в нужном формате.
date_field = driver.find_element_by_id("date_field_id")
date_field.send_keys("2023-12-25") # Формат даты может варьироваться в зависимости от сайта
Однако некоторые поля календаря требуют дополнительных действий, таких как открытие всплывающего календаря и выбор даты.
7. Файловые поля (File Upload)
Эти поля позволяют загружать файлы на сервер. Взаимодействовать с ними можно также через метод send_keys(), указав путь к файлу на локальном компьютере.
file_input = driver.find_element_by_id("file_upload_id")
file_input.send_keys("/path/to/file.txt")
8. Скрытые поля (Hidden Fields)
Скрытые поля не отображаются на странице, но могут использоваться для хранения информации, необходимой для отправки формы. Взаимодействовать с ними можно, только если у вас есть доступ к их значению (например, для проверки или изменения значения).
hidden_field = driver.find_element_by_id("hidden_field_id")
value = hidden_field.get_attribute("value")
print("Hidden field value:", value)
9. Проверка успешности выполнения действий
Получение данных о выполнении действий — ваш барометр успешности. После отправки формы вы непременно хотите убедиться, что заявка успешно принята, верно? Вот как это можно сделать:
># Проверка успешной авторизации на сайте
if "Добро пожаловать" in driver.page_source:
print("Авторизация прошла успешно!")
else:
print("Произошла ошибка при авторизации.")
10. Проблемы и решения
Проблемы
- Нестабильность работы: Веб-страницы часто меняются. Изменение структуры страницы может привести к сбоям в скриптах, поэтому регулярная проверка кода на актуальность необходима.
- Зависимость от скорости сети: Время загрузки страниц и элементов может отличаться. Используйте явные ожидания (explicit waits) для обработки задержек.
Решения
- Логирование: Ведите лог всех действий, чтобы лучше разбираться в проблемах. Использование библиотеки
loggingзначительно упростит ведение логов. - Модульность кода: Разделяйте сложные действия на функции и модули, чтобы легче вносить изменения и тестировать их.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ