JavaRush /Курси /Python SELF UA / Автоматизація роботи з формами та кнопками на веб-сто...

Автоматизація роботи з формами та кнопками на веб-сторінці для збору даних

Python SELF UA
Рівень 37, Лекція 3
Відкрита

1. Технічні основи

Заповнення та відправка форм

Робота з формами часто потрібна для автоматизації реєстрації користувачів, заповнення анкет, збору даних і багато іншого. Коли тобі потрібно заповнити сотні форм, вручну це зробити — ніби спробувати з’їсти кавун через соломинку. А нашими суперздатностями з Selenium ми зробимо це за кілька секунд.

Давай спочатку розберемо, як ми можемо заповнювати текстові поля і відправляти форми. На прикладі типової форми входу на сайт ми вивчимо основні кроки:

Важливо: приклади нижче написані синтаксисом Selenium 3. У Selenium 4 методи find_element_by_* прибрано (остаточно — з версії 4.3.0): замість них використовують універсальний find_element() зі стратегією з класу By. Тому після кожного прикладу наведено його варіант для Selenium 4.

Python

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()
    

Те саме на Selenium 4:

Python

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

# Налаштування драйвера (наприклад, 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 для перехоплення помилок і ведемо логи, щоб розібратися, що пішло не так.

Python

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)
    

Те саме на Selenium 4:

Python

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().

Python

checkbox = driver.find_element_by_id("checkbox_id")
if not checkbox.is_selected():
    checkbox.click()
    

Те саме на Selenium 4:

Python

checkbox = driver.find_element(By.ID, "checkbox_id")
if not checkbox.is_selected():
    checkbox.click()
    

3. Перемикачі (Radio Buttons)

Перемикачі дозволяють вибирати тільки одну опцію з декількох. Працювати з ними можна як з прапорцями: вибирати опцію за допомогою методу click() і перевіряти стан за допомогою is_selected().

Python

radio_button = driver.find_element_by_id("radio_button_id")
if not radio_button.is_selected():
    radio_button.click()
    

Те саме на Selenium 4:

Python

radio_button = driver.find_element(By.ID, "radio_button_id")
if not radio_button.is_selected():
    radio_button.click()
    

4. Випадаючі списки (Dropdowns)

Випадаючі списки містять кілька варіантів на вибір. У Selenium є клас Select, який надає методи для роботи з такими списками.

Python

from selenium.webdriver.support.ui import Select

dropdown = Select(driver.find_element_by_id("dropdown_id"))
dropdown.select_by_visible_text("Option 1")
    

Те саме на Selenium 4:

Python

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)

Текстові області схожі на текстові поля, але зазвичай використовуються для введення великого обсягу тексту. Робота з ними ідентична роботі з текстовими полями.

Python

text_area = driver.find_element_by_id("textarea_id")
text_area.send_keys("This is a sample text for the text area.")
    

Те саме на Selenium 4:

Python

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() для введення значення у потрібному форматі.

Python

date_field = driver.find_element_by_id("date_field_id")
date_field.send_keys("2023-12-25")  # Формат дати може варіюватися залежно від сайту
    

Те саме на Selenium 4:

Python

date_field = driver.find_element(By.ID, "date_field_id")
date_field.send_keys("2023-12-25")  # Формат дати може варіюватися залежно від сайту
    

Однак деякі поля календаря потребують додаткових дій, таких як відкриття спливаючого календаря і вибору дати.

7. Файлові поля (File Upload)

Ці поля дозволяють завантажувати файли на сервер. Взаємодіяти з ними можна також через метод send_keys(), вказавши шлях до файлу на локальному комп'ютері.

Python

file_input = driver.find_element_by_id("file_upload_id")
file_input.send_keys("/path/to/file.txt")
    

Те саме на Selenium 4:

Python

file_input = driver.find_element(By.ID, "file_upload_id")
file_input.send_keys("/path/to/file.txt")
    

8. Приховані поля (Hidden Fields)

Приховані поля не відображаються на сторінці, але можуть використовуватися для зберігання інформації, необхідної для відправки форми. Взаємодіяти з ними можна, тільки якщо у вас є доступ до їх значення (наприклад, для перевірки чи зміни значення).

Python

hidden_field = driver.find_element_by_id("hidden_field_id")
value = hidden_field.get_attribute("value")
print("Hidden field value:", value)
    

Те саме на Selenium 4:

Python

hidden_field = driver.find_element(By.ID, "hidden_field_id")
value = hidden_field.get_attribute("value")
print("Hidden field value:", value)
    

9. Перевірка успішності виконання дій

Отримання даних про виконання дій — твій барометр успіху. Після відправки форми ти, звичайно, хочеш переконатися, що заявка успішно прийнята, чи не так? Ось як це можна зробити:

Python

># Перевірка успішної авторизації на сайті
if "Ласкаво просимо" in driver.page_source:
    print("Авторизація пройшла успішно!")
else:
    print("Сталася помилка під час авторизації.")
    

10. Проблеми та рішення

Проблеми

  • Нестабільність роботи: Веб-сторінки часто змінюються. Зміна структури сторінки може призвести до збоїв у скриптах, тому регулярна перевірка коду на актуальність необхідна.
  • Залежність від швидкості мережі: Час завантаження сторінок і елементів може відрізнятися. Використовуйте явні очікування (explicit waits) для обробки затримок.

Рішення

  • Логування: Ведіть лог усіх дій, щоб краще розбиратися в проблемах. Використання бібліотеки logging значно спростить ведення логів.
  • Модульність коду: Розділяйте складні дії на функції та модулі, щоб легше вносити зміни і тестувати їх.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ