Запрос веб — формы Locust- drupal

#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» я использовал имя машины, и именно поэтому данные не сохранялись.

Фактический идентификатор веб-формы был взят из инструментов разработчика браузера на вкладке сеть.