#python-3.x #locust #drupal-9
Вопрос:
Я пытался загрузить тестовую веб — страницу с некоторыми веб-формами на ней. Сценарий, который я создал, кажется, работает, потому что все запросы выполняются и данные фактически собираются:
Проблема, с которой я сталкиваюсь, связана с веб-формой, я хочу сохранить данные, которые отправляю, с помощью теста, имитирующего пользователя, вручную заполняющего веб-форму. Вот сценарий, который я сейчас создаю:
import requests, logging
from random import seed
from random import randint
from bs4 import BeautifulSoup
from locust import HttpUser, TaskSet, task, events, between
#from locust.clients import HttpSession
from requests.auth import HTTPBasicAuth
class Tests(TaskSet):
wait_time = between(1, 5)
def __init__(self, *args, **kwargs):
super(Tests, self).__init__(*args, **kwargs)
def on_start(self):
""" on_start is called when a Locust start before any task is scheduled """
self.login()
def login(self):
response = requests.get(
"http://127.0.0.1",
auth=HTTPBasicAuth("username", "password")
)
self.client.headers.update(response.request.headers)
# logging.info(response.request.headers)
return response
@task
def testForm(self):
random_number = randint(1, 999)
url = 'form'
data = {
"form_id": "webform_id",
"form_build_id": self.getFormId(url),
"first_name":"test-" str(random_number),
"last_name":"user" str(random_number),
"email_address": "test" str(random_number) "@user.com",
"op": "Send"
}
self.postFormData(url, data)
def getFormId(self, url):
path = "http://127.0.0.1" url
response = requests.get(
path,
auth=HTTPBasicAuth("username", "password")
)
content = BeautifulSoup(response.content, "lxml")
form_build_id = content.body.find('input', {'name': 'form_build_id'})['value']
return form_build_id
def postFormData(self, url, data):
self.client.post(url, json=data)
logging.info('Sending data: %s to the form in: /%s', data, url)
class WebUser(HttpUser):
tasks = [Tests]
min_wait = 5000
max_wait = 10000
host = "http://127.0.0.1"
Некоторый контекст в коде, сначала я должен выполнить базовую проверку подлинности на странице, а затем обновить заголовки клиентов, чтобы в следующих задачах я вошел в систему.
Затем задачи выполняются, и на диаграмме начинает отображаться информация. Я добавил строку регистрации, чтобы проверить, как отправляется запрос:
[2021-09-25 16:12:27,800] ubuntu/INFO/root: Sending data: {'form_id': 'webform_id', 'form_build_id': 'form-8PgUKZXFIOq29EPfhTC2U9PqXjHy1dsVImWXHK8U0LI', 'first_name': 'test-262', 'last_name': 'user262', 'email_address': 'test262@user.com', 'op': 'Send'} to the form in: /form
Я не уверен, чего мне не хватает или действительно ли возможно сохранить эти данные так, как я их отправляю.
Обновить:
Моя ошибка, попробовав это в браузере и проверив запрос на публикацию, я обнаружил, что мне не хватает некоторых параметров для тела сообщения. Теперь задача выглядит следующим образом:
@task
def testForm(self):
random_number = randint(1, 999)
url = 'form'
data = {
"first_name":"test-" str(random_number),
"last_name":"user" str(random_number),
"email_address": "test" str(random_number) "@user.com",
**"source_code": "",
**"webform_type": "petition_template",
"op": "Send",
"form_build_id": self.getFormId(url),
**"form_id": "webform_submission_form",
}
Я пропустил 3 параметра, отмеченных»**», не уверен в «исходном коде», но все равно отправляю его. По поводу «form_id» я использовал имя машины, и именно поэтому данные не сохранялись.
Фактический идентификатор веб-формы был взят из инструментов разработчика браузера на вкладке сеть.