I want to run tests with network data routed from a HAR file. They used to succeed, but now they're failing and I can't figure out why. I added the following code to my test case:
page.on('request', (request) =>
console.log('>>', request.method(), request.url())
);
page.on('response', (response) =>
console.log('<<', response.status(), response.url())
);
and I get console about the request, but not response. If I change the fixture from
await page.routeFromHAR(harFilePath, {
notFound: 'abort',
url: apiUrlsGlob,
});
to
await page.routeFromHAR(harFilePath, {
notFound: 'fallback',
url: apiUrlsGlob,
});
then I also get response, but it's a failing response, because my test cases uses anonymized data etc.
The HAR archive I'm using is loaded in before test is run and contains an entry that should route correctly, but my suspicion is that it's not being used because it's not matched. What attributes need to be identical between a request being made in the code and request/response data in the HAR file for it to be used?
P.S.: the link to "replaying from har" is broken here: https://playwright.dev/docs/api/class-browsercontext#browser-context-route-from-har
This thread is trying to answer question "What attributes need to be identical between a request being made in the code and request/response data in the HAR file for it to be used?"
Related Ask AI answer for "What is the criteria for matching a request in the code with request-response data in a HAR file in @playwright/test?".
To match a request in your code with data in a HAR file, you need to ensure a few things.
First, the URL of the request must match exactly or follow a specified glob pattern. If the URL in your code differs from the one in the HAR file, the response won't be served.
// Example of URL matching in @playwright/test
const { test } = require('@playwright/test');
test('URL should match', async ({ page }) => {
await page.goto('https://ray.run/');
// rest of the code
});
Second, the HTTP method must match exactly. If the HAR file records a GET request but your code makes a POST request, they won't match.
// Example of HTTP method matching in @playwright/test
await page.goto('https://ray.run/');
const [response] = await Promise.all([
page.waitForResponse('https://ray.run/api/data'),
page.click('text=Submit'), // this triggers a POST request
]);
For POST requests, the URL, HTTP method, and payload must all match. If any of these differ, the requests won't be considered identical.
// Example of POST request matching in @playwright/test
await page.goto('https://ray.run/');
await page.fill('input[name="data"]', 'payload');
await page.click('text=Submit'); // this triggers a POST request with payload
If multiple recordings match a request, the one with the most matching headers is picked.
Remember, each response should have its own entry for different scenarios or variations of requests. If these attributes differ during the replaying from HAR process, it won't work as expected.
Rayrun is a community for QA engineers. I am constantly looking for new ways to add value to people learning Playwright and other browser automation frameworks. If you have feedback, email [email protected].