Урок 26. Создание модульного Selenium-проекта и организация кода

Когда скрипты становятся сложными, важно правильно организовать код. Модульная структура упрощает поддержку, тестирование и повторное использование функций. В этом уроке мы разберём, как создать Selenium-проект с разделением на модули и папки.

Почему важна модульность

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

Структура проекта

Пример базовой структуры проекта Selenium:

selenium_project/
│
├── main.py             # Основной скрипт
├── pages/              # Модуль с классами страниц (Page Object)
│   ├── base_page.py
│   ├── login_page.py
│   └── dashboard_page.py
├── utils/              # Вспомогательные функции
│   ├── browser.py
│   ├── logger.py
│   └── helpers.py
├── tests/              # Тестовые скрипты
│   ├── test_login.py
│   └── test_dashboard.py
└── requirements.txt    # Зависимости проекта

Пример модуля для работы с браузером

from selenium import webdriver

def create_driver(headless=False):
    options = webdriver.ChromeOptions()
    if headless:
        options.add_argument("--headless")
    options.add_argument("--start-maximized")
    driver = webdriver.Chrome(options=options)
    return driver

Пример модуля с логированием

import logging

def setup_logger(log_file="selenium_project.log"):
    logging.basicConfig(
        filename=log_file,
        level=logging.INFO,
        format="%(asctime)s [%(levelname)s] %(message)s"
    )
    return logging

Пример Page Object для страницы входа

from selenium.webdriver.common.by import By

class LoginPage:
    def __init__(self, driver):
        self.driver = driver
        self.username_input = (By.ID, "username")
        self.password_input = (By.ID, "password")
        self.login_button = (By.XPATH, "//button[@type='submit']")

    def login(self, username, password):
        self.driver.find_element(*self.username_input).send_keys(username)
        self.driver.find_element(*self.password_input).send_keys(password)
        self.driver.find_element(*self.login_button).click()

Основной скрипт с использованием модулей

from utils.browser import create_driver
from utils.logger import setup_logger
from pages.login_page import LoginPage

log = setup_logger()
driver = create_driver(headless=False)

try:
    driver.get("https://example.com/login")
    login_page = LoginPage(driver)
    login_page.login("ivan", "password123")
    log.info("Вход выполнен успешно")
except Exception as e:
    log.error("Ошибка: %s", e)
finally:
    driver.quit()
    log.info("Браузер закрыт")

Модульная структура упрощает развитие проекта, облегчает тестирование и позволяет поддерживать чистоту кода. Использование Page Object, модулей для браузера, логирования и вспомогательных функций делает проект более профессиональным и масштабируемым.

Больше уроков по парсингу на parsertools.ru/lessons.