Intercept Tjänst
wdio-intercept-service är ett tredjepartspaket, för mer information se GitHub | npm
🕸 Fånga och utvärdera HTTP ajax-anrop i webdriver.io
Detta är ett plugin för webdriver.io. Om du inte känner till det än, kolla in det, det är ganska coolt.
Även om selenium och webdriver används för e2e och särskilt UI-testning, kanske du vill utvärdera HTTP-förfrågningar som görs av din klientkod (t.ex. när du inte har omedelbar UI-feedback, som i mätvärden eller spårningsanrop). Med wdio-intercept-service kan du fånga ajax HTTP-anrop som initieras av vissa användaråtgärder (t.ex. ett knapptryck, etc.) och göra påståenden om förfrågan och motsvarande svar senare.
Det finns dock en hake: du kan inte fånga HTTP-anrop som initieras vid sidladdning (som i de flesta SPA:er), eftersom det kräver viss inställning som bara kan göras efter att sidan har laddats (på grund av begränsningar i selenium). Det betyder att du bara kan fånga förfrågningar som initierades inuti ett test. Om du är okej med det kan detta plugin vara något för dig, så läs vidare.
Förutsättningar
- webdriver.io v5.x eller nyare.
Observera! Om du fortfarande använder webdriver.io v4, använd v2.x-grenen av detta plugin!
Installation
npm install wdio-intercept-service -D
Användning
Användning med WebDriver CLI
Det bör vara så enkelt som att lägga till wdio-intercept-service till din wdio.conf.js:
exports.config = {
// ...
services: ['intercept']
// ...
};
och då är du klar.
Användning med WebDriver Standalone
När du använder WebdriverIO Standalone måste funktionerna before och beforeTest / beforeScenario anropas manuellt.
import { remote } from 'webdriverio';
import WebdriverAjax from 'wdio-intercept-service'
const WDIO_OPTIONS = {
port: 9515,
path: '/',
capabilities: {
browserName: 'chrome'
},
}
let browser;
const interceptServiceLauncher = WebdriverAjax();
beforeAll(async () => {
browser = await remote(WDIO_OPTIONS)
interceptServiceLauncher.before(null, null, browser)
})
beforeEach(async () => {
interceptServiceLauncher.beforeTest()
})
afterAll(async () => {
await client.deleteSession()
});
describe('', async () => {
... // See example usage
});
När det är initierat läggs några relaterade funktioner till i din webbläsarkommandokedja (se API).
Snabbstart
Exempel på användning:
browser.url('http://foo.bar');
browser.setupInterceptor(); // capture ajax calls
browser.expectRequest('GET', '/api/foo', 200); // expect GET request to /api/foo with 200 statusCode
browser.expectRequest('POST', '/api/foo', 400); // expect POST request to /api/foo with 400 statusCode
browser.expectRequest('GET', /\/api\/foo/, 200); // can validate a URL with regex, too
browser.click('#button'); // button that initiates ajax request
browser.pause(1000); // maybe wait a bit until request is finished
browser.assertRequests(); // validate the requests
Få detaljer om förfrågningar:
browser.url('http://foo.bar')
browser.setupInterceptor();
browser.click('#button')
browser.pause(1000);
var request = browser.getRequest(0);
assert.equal(request.method, 'GET');
assert.equal(request.response.headers['content-length'], '42');
Webbläsare som stöds
Det borde fungera med någorlunda nyare versioner av alla webbläsare. Rapportera gärna ett problem om det inte verkar fungera med din.
API
Se TypeScript-deklarationsfilen för fullständig syntax för de anpassade kommandon som läggs till i WebdriverIO webbläsarobjektet. Generellt kan alla metoder som tar ett "options"-objekt som parameter anropas utan den parametern för att få standardbeteendet. Dessa "valfria options"-objekt följs av ?: = {} och standardvärdena som antas beskrivs för varje metod.
Alternativbeskrivningar
Detta bibliotek erbjuder en liten mängd konfiguration när du utfärdar kommandon. Konfigurationsalternativ som används av flera metoder beskrivs här (se varje metoddefinition för att bestämma specifikt stöd).
orderBy('START' | 'END'): Detta alternativ kontrollerar ordningen av förfrågningar som fångas av interceptorn, när de returneras till ditt test. För bakåtkompatibilitet med befintliga versioner av detta bibliotek är standardordningen'END', vilket motsvarar när förfrågan slutfördes. Om du ställer inorderBy-alternativet till'START', kommer förfrågningarna att ordnas enligt tiden då de startades.includePending(boolean): Detta alternativ kontrollerar om ännu-inte-slutförda förfrågningar ska returneras. För bakåtkompatibilitet med befintliga versioner av detta bibliotek är standardvärdetfalse, och endast slutförda förfrågningar kommer att returneras.
browser.setupInterceptor()
Fångar ajax-anrop i webbläsaren. Du måste alltid anropa inställningsfunktionen för att kunna utvärdera förfrågningar senare.
browser.disableInterceptor()
Förhindrar ytterligare fångst av ajax-anrop i webbläsaren. All fångad förfrågningsinformation tas bort. De flesta användare behöver inte inaktivera interceptorn, men om ett test är särskilt långkörande eller överskrider sessionlagringsutrymmet, kan det vara hjälpsamt att inaktivera interceptorn.