Capture la respuesta JSON del servidor en la prueba de extremo a extremo

Estoy escribiendo una prueba de extremo a extremo que simula la autenticación de usuario con Protractor . Un usuario siente sus credenciales y hace clic en el botón Enviar. Como resultado, el servidor devuelve un token de acceso en una respuesta JSON que se puede usar para otras llamadas a la API REST. Me gustaría guardar este token en un archivo.

Aquí hay una pregunta similar sobre cómo capturar una respuesta de una solicitud GET, pero no estoy seguro de que sea una buena idea enviar otra solicitud después de hacer clic en el botón.

¿Cómo puedo capturar la respuesta después de hacer clic en un botón?

Aquí está mi idea sobre cómo capturar las respuestas HTTP. Protractor proporciona un método browser.addMockModule() ( docs ): se utiliza para agregar módulos Angular personalizados a una página, que generalmente se usan para simular solicitudes salientes y proporcionar una respuesta personalizada. Pero no necesitamos simular solicitudes, sería suficiente con escuchar lo que viene de un servidor. Se puede lograr con la ayuda de los interceptores angulares HTTP . Los interceptores se utilizan para capturar una solicitud o una respuesta y modificarla para cualquier necesidad antes de que llegue a su punto final. Podemos usarlos para recostackr información sobre lo que viene del servidor, almacenarlo y luego dejar que la respuesta avance sin cambios. Dado que este módulo personalizado y las pruebas de especificaciones se ejecutarán en la misma página, la información sobre las respuestas se puede almacenar en alguna propiedad global. Luego, cuando se hace clic en el botón, sería posible inyectar un script personalizado a una página para recuperar las respuestas requeridas a través de browser.executeScript() ( docs ). Aquí está la fuente:

 it('should intercept requests', function () { // Inject custom Angular module on a page // Script should be injected before you "browser.get()" the page browser.addMockModule('e2eHttp', function () { // Note: This function scope is not a Protractor environment angular .module('e2eHttp', []) .config(function ($httpProvider) { // add custom interceptor to all requests $httpProvider.interceptors.push('e2eHttpInterceptor'); }) .factory('e2eHttpInterceptor', function () { return { response: function (response) { // name of the global property to store responses var global = 'e2eHttpResponses'; // responses will be grouped by url // but you can use data from "response.config" to adapt it // it has a lot of info about response headers, method, etc var url = response.config.url; window[global] = window[global] || {}; window[global][url] = window[global][url] || []; window[global][url].push(response); // store response // proceed without changing response return response; } }; }); }); // Load the page browser.get('#/auth/login'); $('#submit').click(); // If we are sure that response has come, then extract it browser.executeScript(function () { // Note: This function scope is not a Protractor environment var global = 'e2eHttpResponses'; var uri = 'api/auth/login.json'; // extract array of stored responses for required uri var responses = (window[global] && window[global][uri]) || []; // return responses to spec return responses; }).then(function (responses) { // and finally, we are now able to get all information we need // about response, and in your case, save it to a file console.log(responses); var data = responses[0].data; // first response body as a string }); // remove injected module not to break another specs browser.removeMockModule('e2eHttp'); }); 

Puede mover las llamadas de configuración e inyección a algunos módulos de utilidad, por lo que las especificaciones de prueba estarán limpias.