Thursday, July 14, 2011

Jmeter, Как же залогиниться на https, да ещё и с сертификатом? - 2

Предыдущий способ для меня не сработал, потому с помощью нашего программиста мы нашли следующую лазейку.
1. К текущей Thread Group ( о том, что это такое, и с чем его едят, я расскажу чуть позже) добавляем HTTP Cookie Manager (правый клик на имени Thread Group -> Add -> Config Element -> HTTP Cookie Manager).

2. К этой же группе добавляем Add -> Config Element -> HTTP Authorization Manager со следующими параметрами:
Base URL - https://${host}:8181/
Username - ${username}
Password - ${password}

где HOST, username, password - это переменные, заданные в User Defined Variables (об этом тоже чуть позже).

3. В ту же Thread Group добавляем Add -> Sampler-> HTTP Request, с помощью которого мы вытягиваем cookies.
В пути (path) указываем 100% работающую api'ку, у которой мы можем отобрать печеньку. (Именно за этим и нужен программист, ибо у нас просто нет списка апишек с описанием, а он-то уж точно знает, что куда и как).
Переименуем этот запрос, допустим, в Get Cookies (для того, чтобы переименовать достаточно просто написать желаемое в поле Name).

3.1. Правый клик на свежесозданном Get Cookies показывает нам контекстное меню, из которого мы выбираем Add -> Post Processor -> Regular Expressions Extractor. В нём мы записываем следующее:
Reference Name: csrfmiddlewaretoken
Regular Expression: Set-Cookie: csrftoken=(\w+);
Template: $1$
Match No. (0 for Random): 1
Default value: not found

Я подозреваю, что Reference Name и регулярное выражение могут варьироваться для каждого конкретного случая, потому помощь девелоперов тут более чем приветствуется.

4. Создаём ещё один HTTP Request  с именем, скажем, Login to apache со следующими параметрами:
Server Name or IP: ${HOST}
Path: относительный путь к логину, например, /login/ (т.е., что дописывается после имени хоста, чтобы попасть на страничку логина).

Send Parameters with the Request:
username - ${username}
password - ${password}
csrfmiddlewaretoken - ${csrfmiddlewaretoken}

Усё :) После этого у меня заработало!

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

2 comments:

  1. могу посоветовать маленький хинт. Дабы не прописывать Server Name or IP для каждого sampler можно добавить в ThreadGroup HTTP Request Defaults из вкладки Config Elements.
    И там уже прописать 1 раз Server Name or IP. А в других местах оставить пустым. Не факт что при использовании переменной понадобиться где-то что-то когда-то менять. Но если надо менять не только значение ${HOST}, а и разбивать его, то с помощью HTTP Request Defaults это проще

    ReplyDelete
  2. Спасибо за совет, думаю, многим он будет полезен! :)

    На самом деле, я использую HTTP Request Defaults, но в этом посте указывать это не стала, а просто перечислила все заполненные параметры запроса.

    ReplyDelete