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) =&gt; {
  console.log(response.status());
  console.log(response.headers());
  console.log(response.body());
});

await request.send();

Relaterte artikler