Как получить заголовки ответов в Selenium?
Как я могу получить журналы запросов/ответов в selenium? У меня есть вызов ajax, который возвращает информацию для входа, и всякий раз, когда я пытаюсь захватить его через:
selenium.captureNetworkTraffic("json");
он возвращает только элементы на стороне клиента (например, изображения .pn), но не фактический ответ JSON, который меня интересует.
4 ответов
к сожалению, не похоже, что вы можете сделать это только с селеном в автоматическом режиме, так как это против их принципов проектирования для Селена. Я не согласен с этим (поскольку он поддерживает получение информации о cookie-файлах-какой пользователь на самом деле проходит и анализирует свои файлы cookie?).
их "schtick" - это то, что selenium помогает вам автоматизировать то, что делает пользователь; поскольку пользователь не заботится о заголовках ответов, почему бы этой структуре? Для меня это разочаровывает, потому что мне нужно убедиться, что возвращаемый тип контента-это то, что я считаю, что это должно быть (для тестирования API). Он появляется еще один вопрос переполнения стека пришел к аналогичному выводу.
Я понимаю, что этот вопрос стар, как ад, но я разработал способ сделать это для firefox + selenium, изменив webdriver.xpi и создание драйвера.http_logger.variousLogMethods (). Пожалуйста, ответьте на этот пост, если есть интерес к этому, и я могу отправить код в github.
вы можете сделать это, введя XMLHttpRequest и ожидая результата:
Object response = ((JavascriptExecutor) driver).executeAsyncScript(
"var callback = arguments[arguments.length - 1];" +
"var xhr = new XMLHttpRequest();" +
"xhr.open('GET', '/resource/data.json', true);" +
"xhr.onreadystatechange = function() {" +
" if (xhr.readyState == 4) {" +
" callback(xhr.getResponseHeader());" +
" }" +
"};" +
"xhr.send();");
JsonObject json = new JsonParser().parse((String) response);
assertEquals("cheese", json.get("food").getAsString());
вы можете изменить обратный вызов xhr, чтобы получить то, что вы хотите.
Я нашел трюк, если вы используете jquery, вы можете зарегистрировать глобальный слушатель:
сначала вам нужно объявить глобальную переменную в вашем основном скрипте:
var globalVariableForSelenium = "";
в вашем Селене вы регистрируете слушателя:
if (driver instanceof JavascriptExecutor) {
((JavascriptExecutor) driver)
.executeScript("$(document).ajaxSuccess(function(event, xhr, settings) { globalVariableForSelenium = settings.headers });");
}
затем вы выполняете свое действие
Finaly вы получаете значение глобальной переменной:
if (driver instanceof JavascriptExecutor) {
Object res = ((JavascriptExecutor) driver)
.executeScript("return serializeGlobalvariable();");
}
serializeGlobalvariable () - это функция, которая будет сериализовать globalVariableForSelenium, которая содержит массив заголовка.
ps: мне нужно было получить доступ к ответу ajax, поэтому я установил глобальную переменную с помощью xhr.responseJSON.путь mypath