A выполните этот тест вне основного контроллера тестирования, используя рецепты модель страницы и это.
/**
Used to get the periodic analytic id.
Whenever we are viewing an asset, the server must respond with an id.
This id is later used by the client, to send periodic analytics.
@param {object} t Testcafe's test controller
@param {object} logger A testcafe's RequestLogger.
@returns {string} Returns the periodic analytic id.
*/
async getPeriodicAnalyticId(t, logger) {
const logPrefix = 'Get periodic analytic id > ';
let responseBody;
await t
.expect(logger.requests.length).gt(0, logPrefix + 'No requests logged.');
responseBody = logger.requests[0].response.body;
await t
.expect(responseBody).notTypeOf('undefined', logPrefix + 'Logged request does not have a response a body.')
.expect(Buffer.isBuffer(responseBody)).eql(true, logPrefix + 'Invalid response body (not buffer)');
// Periodic analytic id can be found on the server response of the 1st analytic sent.
return JSON.parse(logger.requests[0].response.body.toString()).id;
}
Ошибка
При запуске этого теста, нацеленного на локальный HTTP-сервер, все работает нормально. Но это не удается, когда тесты нацелены на удаленный сервер https. Я получаю такую ошибку:
SyntaxError: Unexpected token in JSON at position 0
на этой линии
return JSON.parse(logger.requests[0].response.body.toString()).id;
Информация об отладке
Тело ответа от локального HTTP-сервера, который работает: localBuffer Это переводится как: localBufferToString
Тело ответа от удаленного https-сервера, которое не работает: remoteBuffer Это переводится как: remoteBufferToString
Вопрос
Мне интересно, подходит ли метод, который я использую для преобразования тела ответа в json. В настоящее время я использую:
JSON.parse(logger.requests[0].response.body.toString())
Моя среда
operating system: Windows 10
testcafe version: 0.21.1
node.js version: 9.3.0
Спасибо, Марион, я сделаю это и доложу. Я забыл сказать, что локальный сервер находится по http, а удаленный по https, если это важно. (Обновил вопрос)
Я обновил отладочную информацию @Marion скриншотами из отладчика.
Возможно, проблема связана с таймаутами TestCafe: t.expect ждет 3 секунды, и этого времени может быть недостаточно для загрузки ресурса. Попробуйте вызвать "wait" перед "ожидать": await t.wait (4000) .expect (logger.contains (record => record.response.statusCode === 200)). Ok (); Если это не помогает, обновите этот пример, чтобы я мог видеть проблему локально: github.com/MarinaRukavitsyna/TestCafe-RequestLogger-example/…
@Marion Это не тот случай. На главном контроллере тестирования есть задержка и утверждение для statusCode всех собранных запросов, которые проходят. Я попытаюсь воспроизвести это на более простом примере в вашем коде.
Привет @Marion. Я создал похожий тест здесь github.com/prototype23/Testcafe-RequestLogger-example/blob/…. Это не совсем то, что я делаю в своих реальных тестах, но это воспроизводит мою проблему. Как видите, ответ регистратора не читается.
У меня была эта проблема еще и потому, что в моем случае ответом является сжатый поток. Мне пришлось реализовать служебный метод для распаковки основного потока перед анализом данных JSON. Если это ваш случай, я также могу ответить кодом, который я использую для этого.
Привет @ prototype23, ваш тест на моей стороне прошел успешно. На моей стороне в Chrome работает функция JSON.parse (logRecord.response.body). Не могли бы вы указать настройки вашего браузера и ОС?
@Ricovitch Привет. Спасибо за ответ. Не знаю, так ли это. Он пытался реализовать этот рецепт nodejs.org/api/…, но мои response и response.body не являются потоками для конвейерной передачи. Можете ли вы клонировать созданный мной пример и протестировать? Вы можете найти это одним комментарием выше.
Привет @Marion. Мой браузер - это последняя версия Firefox (версия для разработчиков) на windows 10 @ work и windows 7 @ home. Но последний хром тоже терпит неудачу.
Привет, @Marion, возможно, параметр RequestLogger 'stringifyResponseBody': true должен сначала распаковать любой заархивированный ответ, а затем преобразовать его в строку.





У меня была такая же проблема, потому что в моем случае ответ сервера был сжатый ответ, а ответом API логгера testcafe не распаковывает автоматически.
Итак, мы выполнили следующие шаги:
Настройте регистратор с параметром logResponseBody (также, как указано в комментарии, не устанавливайте для параметра stringifyResponseBody значение true)
const logger = RequestLogger(
/yourApiRegex/,
{ logResponseBody: true },
);
Напишите вспомогательный метод для распаковки тела запроса:
import zlib from 'zlib';
export const getBody = async body => new Promise((resolve, reject) => {
zlib.gunzip(body, async (error, buff) => {
if (error !== null) {
return reject(error);
}
return resolve(JSON.parse(buff.toString()));
});
});
Пример использования в тестах
await t.expect(logger.contains(
async (record) => {
const body = await (getBody(record.response.body));
return body.someProps === 'someValue';
},
)).ok();
Спасибо! Я постараюсь это реализовать. Быстрая проверка на моем примере, где я получаю только тело первого зарегистрированного запроса, не сработала. Получаю: Error: incorrect header check. Я поиграюсь и доложу или приму твой ответ завтра.
Надеюсь, у вас это сработало. Пожалуйста, примите мой ответ, если это помогло.
Спасибо за ожидание @Ricovitch. Пока не нашел времени поиграть. Так что я пока не могу принять ответ.
Спасибо, @Ricovitch, это была причина, по которой я начал тарабарщину. Ответ нужно разархивировать. Возможно, нам стоит добавить 'stringifyResponseBody: false в ваш фрагмент RequestLogger. Вот почему я получал ошибки при реализации ваших примеров. Я тоже обновил свой пример здесь.
Для всех, кого это интересует, я создал второе решение, основанное на ответе Риковича. Утилита для распаковки всех заархивированных ответов из регистратора. Благодаря этому вы можете держать свои утверждения в чистоте. Вы можете найти решение на то же репо. Я также разместил 3 тега на коммитах Git.
Получал такой же Error: incorrect header check. stringifyResponseBody на false исправил это и для меня.
Я предлагаю вам отладить ваш тест и проверить значения переменных logger.requests [0], logger.requests [0] .response и logger.requests [0] .response.body. Возможно, что некоторые из них ничего не вернут. В следующих статьях описывается, как отлаживать ваш тест: devexpress.github.io/testcafe/documentation/recipes/…, devexpress.github.io/testcafe/documentation/recipes/…