Rayrun

How to Mock HTTP Traffic in Playwright Tests

In this article, we will explore how to intercept and mock HTTP traffic in Playwright tests. By doing so, we can create more reliable and efficient tests, while also simulating various scenarios that may be difficult to reproduce otherwise. We will discuss the benefits of using this approach, various ways to intercept and mock HTTP requests, and real-world examples to demonstrate the process. So, let's get started!
  1. Benefits of Mocking HTTP Traffic in Playwright Tests
    1. Greater Control Over Test Scenarios
      1. Faster Test Execution
        1. Easier Test Maintenance
        2. Intercepting HTTP Traffic in Playwright
          1. Mocking HTTP Traffic with Playwright
            1. Basic Mocking Example
              1. Mocking Error Responses
                1. Modifying Response Data
                2. Real-World Examples
                  1. Example 1: Mocking a List of Data
                    1. Example 2: Testing Error Handling
                    2. Conclusion

                      Benefits of Mocking HTTP Traffic in Playwright Tests

                      Greater Control Over Test Scenarios

                      By intercepting and mocking HTTP traffic, we can simulate different scenarios that may not be easily reproducible otherwise, such as error responses, slow connections, or specific data sets. This gives us greater control over the test environment and allows us to create more comprehensive test cases.

                      Faster Test Execution

                      When we mock HTTP traffic, we bypass the need to send requests to the actual server, which can significantly reduce test execution time. This is particularly useful when running large test suites or when testing against slow or unreliable network connections.

                      Easier Test Maintenance

                      By controlling the responses returned by the mocked endpoints, we can isolate our tests from external dependencies, making them less brittle and easier to maintain. This also reduces the chance of tests breaking due to changes in external services or APIs.

                      Intercepting HTTP Traffic in Playwright

                      Before we dive into mocking HTTP traffic, let's first understand how to intercept HTTP traffic in Playwright. We can use the page.route() method to intercept network requests made by the page. The method accepts two arguments: a pattern to match the request URL and a route handler function to process the matched requests.

                      Here's a simple example of how to intercept an HTTP request in Playwright:

                      await page.route('https://example.com/api/data', (route) => {
                        // Process the request here
                      });

                      Now that we know how to intercept HTTP traffic let's move on to mocking the responses.

                      Mocking HTTP Traffic with Playwright

                      Basic Mocking Example

                      To mock an HTTP response, we can use the route.fulfill() method within the route handler function. This method allows us to return a custom response for the intercepted request, effectively mocking the endpoint. Here's a basic example of mocking an HTTP response in Playwright:

                      await page.route('https://example.com/api/data', (route) => {
                        route.fulfill({
                          status: 200,
                          body: JSON.stringify({ message: 'Hello, World!' }),
                        });
                      });

                      In this example, we intercept requests to https://example.com/api/data and return a custom JSON response with a status code of 200.

                      Mocking Error Responses

                      We can also use the route.fulfill() method to mock error responses. For example, we might want to test how our application handles a 404 Not Found error. To do this, we can simply change the status property in the fulfill() method:

                      await page.route('https://example.com/api/data', (route) => {
                        route.fulfill({
                          status: 404,
                          body: JSON.stringify({ error: 'Not Found' }),
                        });
                      });

                      Alternatively, we can use the route.abort() method to simulate network errors or request failures. For example, to simulate a failed request due to a network issue, we can do the following:

                      await page.route('https://example.com/api/data', (route) => {
                        route.abort('networkerror');
                      });

                      Modifying Response Data

                      In some cases, we might want to intercept an HTTP request, retrieve the actual response, and then modify it before returning it to the page. We can accomplish this using the route.fetch() method, which performs the request and fetches the result without fulfilling it. This allows us to modify the response before fulfilling the request with the updated data.

                      Here's an example of how to modify the response data for a specific endpoint:

                      await page.route('https://example.com/api/data', async (route) => {
                        const response = await route.fetch();
                        const json = await response.json();
                        json.message = 'Modified message';
                        await route.fulfill({ response, json });
                      });

                      Real-World Examples

                      In this section, we'll walk through a few practical examples to demonstrate how to intercept and mock HTTP traffic in Playwright tests.

                      Example 1: Mocking a List of Data

                      In this example, we will test a feature that fetches a list of items and displays them on the page. To mock the API response, we will use the route.fulfill() method to return a custom JSON array:

                      await page.route('https://example.com/api/items', (route) => {
                        route.fulfill({
                          status: 200,
                          body: JSON.stringify([
                            { id: 1, name: 'Item 1' },
                            { id: 2, name: 'Item 2' },
                            { id: 3, name: 'Item 3' },
                          ]),
                        });
                      });

                      Now, in our test, we can check that the items are displayed correctly on the page:

                      await page.goto('https://example.com/items');
                      await expect(page.locator('.item')).toHaveCount(3);

                      Example 2: Testing Error Handling

                      In this example, we will test how our application handles an error response from the API. We will use the route.fulfill() method to return a custom error response with a status code of 500:

                      await page.route('https://example.com/api/items', (route) => {
                        route.fulfill({
                          status: 500,
                          body: JSON.stringify({ error: 'Internal Server Error' }),
                        });
                      });

                      In our test, we can check that the application displays an error message when the API returns an error:

                      await page.goto('https://example.com/items');
                      await expect(page.locator('.error-message')).toBeVisible();

                      Conclusion

                      Intercepting and mocking HTTP traffic in Playwright tests is a powerful technique that can help you create more reliable, efficient, and comprehensive test cases. In this article, we have explored the different ways to intercept and mock HTTP requests, and provided real-world examples to demonstrate the process. By applying these techniques, you can improve the quality of your tests and ensure that your application works as expected under various scenarios. Happy testing!

                      Thank you!
                      Was this helpful?

                      Now check your email!

                      To complete the signup, click the confirmation link in your inbox.

                      Subscribe to newsletter

                      You will receive a weekly email with the latest posts and QA jobs.

                      TwitterGitHubLinkedIn
                      AboutQuestionsDiscord ForumBrowser ExtensionTagsQA Jobs

                      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 luc@ray.run.