1. Сценарий действий и его последовательность
Когда мы начинаем планировать сценарий автоматизации, важно понимать, что, как в сказках, нужно идти от простого к сложному. Представьте себе, что ваш скрипт — это герой, который отправляется в путешествие по страницам веб-сайта. Каждый шаг продуман и четко настроен, чтобы не сбиться с пути.
Создание пошагового сценария автоматизации
Начать нужно с составления плана. Что вы хотите достичь? Загрузить страницу, заполнить форму, кликнуть на кнопку? Как это говорят: "Кто не планирует, тот планирует провал". Мы не хотим провала, так что давайте распишем предполагаемые шаги.
from selenium import webdriver
from selenium.webdriver.common.by import By
# Создаём экземпляр драйвера. Используйте драйвер, который подходит для вашего браузера.
driver = webdriver.Chrome()
# Открываем страницу
driver.get('https://example.com/login')
# Заполняем логин
driver.find_element(By.NAME, 'username').send_keys('my_username')
# Заполняем пароль
driver.find_element(By.NAME, 'password').send_keys('my_secure_password')
# Нажимаем кнопку логина
driver.find_element(By.ID, 'login-button').click()
Вот мы и задаем ритм нашему танцу. Каждый шаг сценария выполняется последовательно, чтобы ваш скрипт мог с лёгкостью перемещаться по сайту.
Логирование шагов выполнения
Как всякий уважающий себя герой, наш скрипт должен оставлять следы, чтобы мы знали, где он был и что делал. Логирование — это как дневник вашего скрипта. Оно помогает отследить выполнение шагов и выявить ошибки, если что-то пойдет не так.
import logging
# Настраиваем логирование
logging.basicConfig(level=logging.INFO)
# Пример логирования действия
logging.info("Открываем страницу входа")
driver.get('https://example.com/login')
Логирование не только помогает в отладке, но и дает спокойствие, зная, что ваш скрипт выполняет каждый шаг как положено. Если вдруг что-то пойдет не так, вы сможете вернутся и посмотреть, на каком моменте что-то пошло не так.
2. Организация кода для чтения и модификации
Когда сценарий становится более сложным, важно держать код в порядке. Представьте себе юбилейное торжество с кучей гостей и блюд: если всё не разложить по местам, то получится хаос. В нашем случае — хаос в коде.
Настройка структуры кода
Чтобы делать изменения в коде с минимальными усилиями, ему нужно быть хорошо организованным. Как сортировщик носков, нужно все упорядочить. Используйте функции, чтобы выделить повторяющиеся действия в отдельные блоки.
def login_to_site(driver, username, password):
logging.info("Вводим логин")
driver.find_element(By.NAME, 'username').send_keys(username)
logging.info("Вводим пароль")
driver.find_element(By.NAME, 'password').send_keys(password)
logging.info("Нажимаем кнопку логина")
driver.find_element(By.ID, 'login-button').click()
# Используем функцию для входа
login_to_site(driver, 'my_username', 'my_secure_password')
Использование функций делает код более собранным и позволяет легко вносить изменения, к примеру, если изменится ID кнопки входа, вы просто измените это в одной функции, а не по всему коду.
3. Пример: Автоматизация процесса покупки на сайте
Представим, что нам нужно настроить автоматизацию процесса покупки на сайте, включающего следующие шаги:
- Открытие сайта и вход в учетную запись.
- Переход в каталог товаров и добавление товара в корзину.
- Переход в корзину и оформление покупки.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# Инициализация драйвера с настройками
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10) # Неявное ожидание
return driver
# Функция для входа в учетную запись
def login(driver, username, password):
driver.get("https://example.com")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login_button").click()
# Функция для перехода в каталог товаров и добавления товара в корзину
def add_product_to_cart(driver):
driver.get("https://example.com/catalog")
product = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.CLASS_NAME, "product_item"))
)
product.click()
add_to_cart_button = driver.find_element_by_id("add_to_cart")
add_to_cart_button.click()
# Функция для перехода в корзину и оформления покупки
def checkout(driver):
driver.get("https://example.com/cart")
checkout_button = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "checkout"))
)
checkout_button.click()
# Функция для завершения работы драйвера
def close_driver(driver):
driver.quit()
# Основной скрипт для выполнения последовательности действий
def main():
# Настройка данных
username = "myusername"
password = "mypassword"
# Инициализация драйвера
driver = initialize_driver()
try:
# Вход на сайт
login(driver, username, password)
# Переход в каталог и добавление товара в корзину
add_product_to_cart(driver)
# Переход в корзину и оформление покупки
checkout(driver)
finally:
# Закрытие драйвера
close_driver(driver)
# Запуск основного скрипта
main()
Объяснение функций
-
initialize_driver()— функция для инициализации веб-драйвера. Она устанавливает неявное ожидание для всех элементов и возвращает объект драйвера. -
login()— функция для выполнения входа на сайт. Она принимает параметрыusernameиpassword, которые используются для заполнения формы входа и нажатия кнопки. -
add_product_to_cart()— функция для перехода в каталог, выбора продукта и добавления его в корзину. -
checkout()— функция для перехода в корзину и оформления покупки. -
close_driver()— функция для завершения работы с драйвером. -
main()— основная функция, которая управляет последовательностью действий. В ней происходит вызов всех этапов, а также указание данных для входа.
Преимущества такого подхода
-
Читабельность— каждый этап оформлен в виде отдельной функции, что упрощает понимание кода. -
Повторное использование— отдельные функции можно использовать независимо от основного скрипта, например, для выполнения отдельных действий на сайте. -
Легкость тестирования— каждый этап можно протестировать отдельно, чтобы убедиться, что все работает корректно. -
Гибкость— при необходимости можно добавить другие функции или изменить порядок вызова действий вmain().
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ