Привет! Очень давно ничего не писал. Тяжело работал, много самообразовывался, мало спал. Доучивал Python и разбирался в тонкостях Apache JMeter. Готовы повеселиться? На моём сайте есть форма обратной связи (на главной странице, правая колонка):

Сегодня свои теоретические знания буду превращать в практическую магию автоматизации. Задача: заполнить поля формы и отправить данные. Количество итераций, к примеру =10.   Для реализации буду использовать: Python 3.*(3.8) + WebDriver (
geckodriver для Firefox Selenium). Описывать как устанавливать Python и дружить его с  webdriver не буду. В интернете достаточно тутуриалов на эту тему. Да и всегда приятней и полезней самому найти ответ. Таску немного усложню и буду каждый раз заполнять поля новыми сгенерированными данными с типом (форматом) согласно заголовков полей. Если бы не модифицировал задачу то для решения вполне годны TestCafe Studio , Blazemeter (плагин для браузера) или Katalon Automation Recorder (плагин для браузера).

Для начала напишу генераторы. На каждое поле постараюсь отдельный. Зачем так много? Теория хорошо, но практика — всё! Сразу прошу строго не судить самоучку и оставить помидоры для салата. Делаю как умею и понимаю. Итак первое поле — это «Имя». В Phyton есть библиотека uuid которая генерирует строку типа: 0b798a0a-bce3-41db-a39d-bc282b85b59c. Как она формируется и какую имеет структуру можно почитать вот тут. Для формирования имени буду как раз использовать такой буквенно-цифровой номер. Код функции первого генератора:

import uuid #подключаем библиотеку

def random_name(name=10): #функция будет возвращает случайную строку определённой длины
    random = str(uuid.uuid4()) # конвертация формата uuid в string
    random = random.replace("-","") #удаляем из uuid "-".
    return random[0:name] #возвращаем полученное рандомное значение.

Второе поле —  «E-mail». Необходимо чтобы генерировалось что-то типа: name@domain.geo. Ок. Тут понадобиться подключить две библиотеки. Первая — itertool, тут подробно расписано для чего она нужна и как использоват. Вторая библиотека — random.

import itertools #подключаем библиотеку
import random #подключаем библиотеку
def mail():
    letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    #создаём массив letters содержащий буквы алфавита #используем функцию cobination(комбинирование отдельных элементов последовательности) и сформируем список из последовательности содержащих в себе 10 символов
    combination = list(itertools.combinations(letters,10))
    combination = [''.join(combi) for combi in combination ] #приводим combination к типу данных string
    mail = random.sample(combination,1)[0]+'@artem.casa' #из нашей последовательности рандомно выбираем одну и добавляем @artem.casa
    return mail

Третье поле — «Телефон». В моей форме нет какой-то валидации по маске номера телефона. Тем не менее сделаем так чтобы данные генерировались в более менее красивом формате. Подключается дополнительная библиотека functools и в ней используется функция partial.

import functools #подключаем библиотеку functools
n = functools.partial(random.randint, 0, 9)
telephone = lambda: "+{}-{}{}{}-{}{}{}-{}{}{}{}".format(n(), n(), n(), n(), n(), n(), n(), n(), n(), n(), n())
telephone ()

Применять его не буду. Красиво, но не практично. Проще — сгенерирую десятизначное число.

from random import randint
def phone():
    number = 10
    phone =''.join(["%s" % randint(0, 9) for num in range(0, number)])
    return phone

Четвёртое и последнее поле — «Текст новости». В данном поле будем вводить данные которые содержат буквы, цифры, специальные символы. Длину которых как и в предыдущих генераторах смогу регулировать. В данном случае это будет 20 символов.

def text():
    text = [] #создаём пустой список
    chars = '~!@#$%^&*()qwertyuiop1234567890' #набор возможных символов
    symbols = 20 #длина желаемой строки
    for k in range(1, symbols+1):
        text.append(random.choice(chars)) #добавляем рандомные символы в список
    text = "".join(text)
    return text

Объединим код:

import uuid #подключаем библиотеку

def random_name(name=10): #функция будет возвращает случайную строку определённой длины
    random = str(uuid.uuid4()) # конвертация формата uuid в string
    random = random.replace("-","") #удаляем из uuid "-".
    return random[0:name] #возвращаем полученное рандомное значение.

import itertools #подключаем библиотеку
import random #подключаем библиотеку
def mail():
    letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
    #создаём массив letters содержащий буквы алфавита #используем функцию cobination(комбинирование отдельных элементов последовательности) и сформируем список из последовательности содержащих в себе 10 символов
    combination = list(itertools.combinations(letters,10))
    combination = [''.join(combi) for combi in combination ] #приводим combination к типу данных string
    mail = random.sample(combination,1)[0]+'@artem.casa' #из нашей последовательности рандомно выбираем одну и добавляем @artem.casa
    return mail

from random import randint
def phone():
    number = 10
    phone =''.join(["%s" % randint(0, 9) for num in range(0, number)])
    return phone

def text():
    text = [] #создаём пустой список
    chars = '~!@#$%^&*()qwertyuiop1234567890' #набор возможных символов
    symbols = 20 #длина желаемой строки
    for k in range(1, symbols+1):
        text.append(random.choice(chars)) #добавляем рандомные символы в список
    text = "".join(text)
    return text

Если вывести принтом результаты работы каждой функции генератора, то получим примерно следующее:

Если в выдаче ошибки, то скорее всего у вас не установлена какая-нибудь из используемых библиотек. Их названия в коде смотрите после команды import. Для установки необходимо в командной строке (cmd) Windows выполнить pip install «имя_библиотеки» без «. В IntelliJ IDEA это можно сделать через встроенный терминал.

Всё что создавал и генерировал, понятно — фиктивные, не существующие данные. Для Python есть специально написанная библиотека Fakes, которая содержит в себе функции, используя которые можно значительно сократить количество строк кода и добиться похожего результата. Туториал с примерами по использованиюможно посмотреть по ссылке.

Последний шаг реализации задачи — написать блок автоматизации. Сейчас приведу код, а потом отдельно прокомментирую.

import time
from selenium import webdriver
driver = webdriver.Firefox()
driver.maximize_window()
driver.get("http://artem.casa/")
driver.find_element_by_xpath("//a[@class='send-news-title']").click()
def send_data():
    driver.find_element_by_xpath("//input[@placeholder='Имя *']").send_keys(random_name(7))
    time.sleep(2)
    driver.find_element_by_xpath("//input[@placeholder='E-mail *']").send_keys(mail())
    time.sleep(2)
    driver.find_element_by_xpath("//input[@placeholder='Телефон']").send_keys(phone())
    time.sleep(2)
    driver.find_element_by_xpath("//textarea[@placeholder='Текст новости *']").send_keys(text())
    time.sleep(2)
    driver.find_element_by_xpath("//input[@value='Отправить']").click()
    time.sleep(2)
for i in range(10):
    send_data()
driver.quit()

1. Импортировали (подключили) библиотеку time. Она необходима для использования временных задержек между действиями time.sleep().
2. Подключил webdriver.
3. Указал что буду использовать браузер Firefox.
4. Сказал что открывать браузер в полноэкранном режиме.
5. Перейти (открыть) сайт http://artem.casa/.
6. Найти на сайте используя Xpath определённый элемент и кликнуть (.click()) по нему. В моём случае необходимо было кликнуть на «ПРИСЛАТЬ НОВОСТЬ» чтобы раскрыть (активировать) форму. Для поиска привязки к элементу использовал плагин ChroPath. Удобный. Ипользовал его когда писал парсер Instagram.

7. Так как итераций (повторений действий) у нас будет 10, то удобно для последующей работы поместить в функцию последовательность действий по заполнению полей. Разберём одну из строк действий чтобы была понятней логика.

driver.find_element_by_xpath("//input[@placeholder='E-mail *']").send_keys(mail())

driver.find_element_by_xpath() — даём задачу driver найди элемент в нашем xml или (x)html документе по адресу указанному в скобках.

.send_keys(mail) — после того как нашёл элемент отправь туда (в нашем случае это поле «E-mail») данные в скобках. mail — это результат работы функции одного из описанного выше генератора. Аналогично для остальных трёх полей. Так же находим их адреса, прикручиваем действия, данные берём из переменных генератора.

8.При помощи цикла for вызываем функцию send_data() нужное нам количество раз.
9. Завершаем работу, закрываем браузер.

Собираем блоки генераторов и автоматизации, получаем готовый код:

Содержание для зарегистрированных пользователей. Чтобы увидеть скрытую часть контента вам нужно зарегистрироваться или войти под своей учётной записью.

На видео ниже показана работа программы. С цель экономии моего и вашего времени сократил итерации до 5.

Поставленная цель достигнута. Удачи!