typescript - Hvordan logge alle forespørsler med Playwright
Jeg bruker Playwrights request: APIRequestContext-fixture for å implementere API-tester, og jeg ønsker å logge alle forespørsler/svar, men jeg klarer ikke å finne ut hvordan. Når det gjelder Page-fixtureen, kan jeg overvåke nettverkstrafikken og logge den, men Request-fixtureen gir ingenting lignende.
Jeg bruker en utvidet playwright/test og overstyrer/legger til ekstra fixtures, basert på: https://playwright.dev/docs/test-fixtures#overriding-fixtures
Noen ideer til en overordnet løsning for å logge all trafikk gjort via Request-fixture?
Svar #1
Jeg hadde det samme problemet, ønsket å logge alle forespørselsdata før jeg gjorde en put- eller post-forespørsel og gjøre det synlig i HTML-rapporten også. Det jeg gjorde var å definere en proxy for å logge nødvendige data for post- og put-forespørsler:
const globalTest = test.extend<ProjectProps>({
request: async ({ request }, use) => {
const requestProxy = new Proxy<APIRequestContext>(request, {
get(target, prop: keyof APIRequestContext) {
if (typeof prop === 'string' && ['post', 'put'].includes(prop)) {
return async (url: string, options: Record<string, unknown>) => {
const payload = options?.data || null;
globalTest.step(`Request method: ${prop}, Payload: ${JSON.stringify(payload)}`, () => {});
return await target[prop](url, options);
};
}
return target[prop];
},
});
await use(requestProxy);
},
});
Jeg brukte en tom test.step for å gjøre nyttelasten synlig i HTML-rapporten, du kan erstatte den med hvilken som helst logikk for logging du har. Også for svarene kan du lagre svaret i en variabel fra kallet i stedet for å returnere det som i mitt tilfelle og logge det også.
En endring du vil se i rapporten er at alle trinn for forespørselskontekstmetodene vil være med proxy.{method} i stedet for apiRequestContext.{method}, men det var ikke et problem for meg.
Svar #2
Du kan bruke request.on('response')-hendelsen for å logge responsen:
const request = context.request({
url: 'https://example.com',
method: 'GET',
});
request.on('response', (response) => {
console.log(response.status());
console.log(response.headers());
console.log(response.body());
});
await request.send();
