How to Use Playwright Wait For Navigation Methods
Ini Arthur
Posted On: May 14, 2024
140833 Views
22 Min Read
When users visit a website, they typically have to wait for it to load before interacting fully. This includes waiting for images, text, and other elements to appear. In web automation scripts, we need to replicate this waiting process. Playwright, a web automation testing framework, provides methods to wait for navigation, ensuring that automated tasks are performed only when the page’s content is fully loaded.
Playwright wait for navigation methods is crucial for handling actions like form submissions and ensuring the page’s content is fully loaded before proceeding. This synchronization prevents errors when accessing dynamic elements or content not updated in the Document Object Model (DOM). It ensures smooth, error-free interactions by waiting for events like page loads or button clicks to complete before moving on.
In this blog, we will learn about Playwright and how to use the Playwright wait for navigation method.
So, let’s get started!
TABLE OF CONTENTS
What is Playwright?
Playwright is an open-source automation testing framework for browser and web application testing. This framework can perform tests on browsers like Chromium, Firefox, and WebKit in headless or headed mode with support for programming languages like Node.js, Python, .NET, and Java. It is built to allow cross-browser web automation via a single API that works seamlessly across different Playwright-supported languages, browsers, and platforms (i.e., operating systems).
The framework can be used for web application testing and other web automation tasks as follows:
- End-to-end testing: It validates software by simulating user interactions with live data. It ensures the application works without glitches and meets user requirements. Automating actions like form submission and navigation helps identify bugs early, reducing costs and improving overall quality.
- UI component testing: It focuses on testing parts of an application where users interact with the GUI. It ensures that each element works before integration. Using Playwright for this testing ensures responsiveness and consistency with design requirements.
- Web scraping: It helps in extracting data from websites for analysis, market research, etc. The Playwright automates this process. Organizations use web scraping for big data analysis, AI, and predictive modeling as user-generated content grows. Scraping must comply with protocols and GDPR.
- Task automation: It streamlines repetitive tasks like data entry, form filling, and web scraping, saving time and reducing errors. Playwright’s tools like Codegen, Inspector, and Trace Viewer enhance efficiency and facilitate test case generation and debugging.
In the below section of this blog on using Playwright wait for navigation methods, we will learn about various approaches to ensure that web elements are fully loaded before interacting with them.
What Are Playwright Wait For Navigation Methods?
Waiting for navigation is crucial because modern websites often use dynamic content through technologies like AJAX and the Fetch API. This means that users must wait for new pages or updated content to load, making Playwright’s wait methods essential for automation.
The page object in Playwright provides wait navigation methods that are used to wait for specific actions on a web page to be completed or till the time it results in a timeout/exception. They keep tests on web UI during automation more stable and less flaky. These methods will help ensure that test results are more consistent when used with other features of Playwright to reduce flakiness.
Flakiness can occur for various reasons and pose a challenge for enterprises using Playwright as their automation testing framework, especially when working with complex systems. Identifying flakiness occurrences can become complicated and time-consuming. To overcome this issue with flaky tests and manage your test execution time efficiently, you can leverage cloud-based platforms like LambdaTest. Such platforms can help you deal with flaky tests effectively.
LambdaTest’s Test Intelligence minimizes flaky tests and enhances test stability. It uses machine learning to detect flaky tests, analyze test logs for error trends, forecast error trends in command logs, and identify anomalies in test execution across platforms for improved stability.
Watch this complete video to understand various perspectives on flaky tests and learn how these perspectives can help you handle flakiness.
The page object has four of these wait navigation methods for Python programming:
page.wait_for_event()
The method can be used when we wait for an element to become visible or interactable before taking action. An example would be a form submission button becoming active only after all required form input fields have been filled out or lazy-loading images.
Syntax:
page.wait_for_event(event)
page.wait_for_event(event, **kwargs)
Syntax Explanation:
The syntax page.wait_for_event(event, **kwargs) indicates that the wait_for_event() method on the page object takes an event name as the first argument (event) and allows additional keyword arguments (**kwargs) to be passed. These additional keyword arguments could include options such as a timeout value or a predicate function. Python commonly uses this syntax to indicate that a function accepts variable keyword arguments.
page.wait_for_function()
This method waits for a given JavaScript expression to evaluate a truthy value. It’s useful when you need to wait for specific JavaScript logic to complete, such as executing a function that triggers dynamic content loading. Unlike page.wait_for_url(), which waits for navigation to a specific URL, page.wait_for_function() allows you to wait for arbitrary JavaScript conditions to be met before proceeding.
Syntax:
page.wait_for_function(expression)
page.wait_for_function(expression, **kwargs)
Syntax Explanation:
This method takes a single argument, a JavaScript expression, to be evaluated in the browser context. This syntax will wait until the expression returns a true value before proceeding. It allows additional keyword arguments (**kwargs) to be passed to the expression. It is an optional argument.
page.wait_for_load_state()
Waits until the required load state has been reached before execution is continued. They ensure that execution is in sync with the expected behavior of the web page. The method signals that page resources like images and files may have finished loading before any interaction with UI elements.
When ‘networkidle’ is set as the load state, Playwright initiates the waiting until the DOM structure of a page is loaded. This means that the page has reached a state of stability before accessing data on the web page. It is useful when there is no need to wait for specific actions (e.g., click, navigation), just a general level of page load.
Syntax:
page.wait_for_load_state(state)
page.wait_for_load_state(state, **kwargs)
Syntax Explanation:
- state: “load”|”domcontentloaded”|”networkidle”: Optional load state to wait for, defaults to load.
- load: This waits for a web page, including content like images and other static files.
- domcontentloaded : An event in which the HTML DOM has been loaded and parsed without waiting for stylesheets or images.
- networkidle: This is a state in which network connections on a web page are idle for a while.
page.wait_for_url()
This method waits for the main frame to navigate to the given URL. A typical use case is waiting for a load event after clicking a link to ensure navigation to a new web page. The load event indicates that all page resources (images, files) are fully loaded, domcontentloaded guarantees that the HTML DOM is loaded, and ‘networkidle’ signals that the page is loaded, even though some content might be missing. It also ensures that you are on the web page that matches the URL pattern before proceeding with any other actions.
Syntax:
page.wait_for_url(“url”)
page.wait_for_url(“url”, **kwargs)
Syntax Explanation:
- url: str|Pattern|Callable[URL]: bool – A glob pattern, regex pattern, or predicate receiving URL to match while waiting for the navigation.
- timeout: float (optional) – Maximum operation time in milliseconds, defaults to 30 seconds, pass 0 to disable timeout.
- wait_until: “load”|”domcontentloaded”|”networkidle”|”commit” (optional) – load event to wait for, defaults to load.
- load: This waits for a web page, including content like images and other static files.
- domcontentloaded: An event in which the HTML DOM has been loaded and parsed without waiting for stylesheets or images.
- networkidle: This is a state in which network connections on a web page are idle for a while.
Run Playwright tests over 3000+ browsers and OS combinations. Try LambdaTest Now!
In the below section of this blog on Playwright wait for navigation, we will learn how to set up Playwright in a local machine to perform testing.
How to Setup Playwright?
Here are the steps to set Playwright locally on your system.
Step 1: Create a virtual environment
Create a folder for this project. In this case, we can name it waits_in_playwright.
1 |
mkdir waits_in_python |
Navigate into the new folder and create a virtual environment (env). We’ll use Python’s venv built-in module for this.
1 2 |
cd waits_in_python python3 -m venv waits_in_playwright |
Activate the virtual environment for the project.
1 |
source waits_in_playwright/bin/activate |
Step 2: Install pytest Playwright
Install the Playwright pytest plugin using the following command. Use pip
for Python versions 2.x and pip3
for Python versions 3.x.
1 |
pip3 install pytest-playwright |
Your console should look like this after installation:
Install required browsers for running tests locally.
1 |
playwright install |
After a successful installation of browsers, the output on the console would look like this:
We are done with setting up a virtual environment and installing Playwright. Let’s confirm everything is in order by checking the versions of our dependencies.
The project runs on Python 3.10.12, Playwright 1.41.2, and pytest 8.0.1.
However, using Playwright on the local machine can have limitations, such as manually updating dependencies, a limited variety of browsers for testing, and more. Here are some more drawbacks while testing locally:
- Scalability Issues: Testing locally is not scalable because we’re limited to only one or two browsers on our computer, while a cloud platform provides more varieties and different versions.
- Handling Dependencies Manually: When we test locally, we are responsible for installing, updating, and managing all dependencies related to the project.
- Project Collaboration: Testing on the cloud provides an easy way to share test results and collaborate with team members on a project compared to testing locally.
Using Playwright on the cloud eliminates the need for installations. It provides access to different versions of multiple browsers for testing and enables parallel testing. One such cloud testing platform that can be used to overcome the challenges of local testing is LambdaTest.
It is an AI-powered test orchestration and execution platform that lets you run manual and automated tests at scale with over 3000+ real devices, browsers, and OS combinations. LambdaTest provides test infrastructure and ensures security for your data, helping to increase your test execution time. Additionally, it handles flaky tests with its test intelligence capabilities. The platform allows you to perform web testing and provides mobile device labs for real device testing and emulators and simulators for various devices and OS combinations.
You can also subscribe to the LambdaTest YouTube Channel and stay updated with the latest tutorials on various automation testing frameworks like Selenium, Cypress, Appium, and more.
Now that we have set up Playwright on the local machine, let us see how to start testing with Playwright wait for navigation methods.
How to Use Playwright Wait For Navigation Methods?
In this blog section, we will learn how to use the four Playwright wait for navigation methods and test them on a cloud platform like LambdaTest.
To start testing each Playwright wait for navigation method; we need to meet some prerequisites for the cloud platform. We will use the LambdaTest eCommerce Playground for demonstration purposes to simulate user interactions.
Prerequisites
To test the workings of the Playwright wait for navigation methods on LambdaTest, you must follow the given steps.
- Create an account on LambdaTest.
- To obtain your Username and Access Key, navigate to your Profile avatar in the LambdaTest Dashboard and choose Account Settings from the menu.
- Copy your Username and Access Key from the Password & Security tab.
- Use the LambdaTest Capabilities Generator to create capabilities that specify your preferred browser and its supported operating systems based on your needs.
Note: The capabilities will vary depending on your selected programming language and testing framework.
Now that we have captured all the details from LambdaTest, we only need to paste them into the test script.
In the code below, we have created a file called wait_fixture.py, where we will add all the necessary configurations for LambdaTest.
Below is the code that explains the code given in the file wait_fixtures.py in a step-by-step process.
Code Walkthrough:
Step 1: Import necessary packages and dependencies
In the code below, we have imported all necessary dependencies, including the sync_playwright() function of Playwright.
Step 2: Setup project Capabilities
In the code below, we will set up the LambdaTest capabilities, which we have already generated using the LambdaTest Capabilities Generator, and pass them into a dictionary containing the necessary configuration for the test environment.
The load_dotenv(“../.env”, override=True) method will read your LambdaTest username (LT_USERNAME) and access key (LT_ACCESS_KEY) stored in your .env file.
The capabilities include keys such as “browserName“, “browserVersion“, “LT: Options,” and more, along with their respective values. These parameters are necessary to configure the test environment on the cloud.
Step 3: Setup pytest Fixtures
In the code below, we will set up fixtures for browser and page instances for the cloud grid. This approach keeps the code modular and simple for easy debugging.
In the above code, The playwrightVersion variable holds the Playwright version output by the subprocess module. The lt_cdp_url is a link to establish communication with a headless Chrome browser for automation. The playwright.chromium.connect() method takes lt_cdp_url and timeout arguments to connect to the LambdaTest cloud platform and create a browser instance.
In the above code, we use the @pytest.fixture decorator to decorate the browser function, creating a browser fixture for the test functions. The LambdaTest Playwright browser instance is created using the sync_playwright() function in this context.
In the above code, the browser fixture is passed as a parameter to the page fixture. The browser.new_page() method creates a new page instance. The yield statement returns the page instance, and after the test code is executed, the control returns to the fixture function and the page.close() method closes the page instance.
The set_test_status() function fixture is used to validate whether the test cases passed or failed. Another function, _set_test_status(), takes two parameters, status, and remark, embedded in the outer function. The page uses the parameters.evaluate() method to signal the test status and accompanying remark. The outer function yields _set_test_status().
To learn more about Playwright fixtures, follow this guide on pytest fixtures with examples and get detailed insights.
In the below section of this blog on Playwright wait for navigation methods we will learn how to use each of the methods explained at the start.
Using the Playwright wait_for_event() Method
In this section of the blog on Playwright wait for navigation methods, we will use the first method, which is page.wait_for_event(). As introduced earlier, this method waits for a specific event (such as a load event) to occur on a web page before proceeding with further actions.
We will understand how this method works by defining a test scenario below and executing it for better comprehension.
Test Scenario:
|
Code Implementation:
In this section, we will see the code implementation for the above test scenario.
In this section, we will learn each set of code instructions to understand their purpose in detail, focusing on the first method of Playwright for wait navigation, which is page.wait_for_event().
Code Walkthrough:
Step 1: Import the page, browser, set_test_status fixtures, and the expect() function.
Step 2: Create a test_wait_event_navigation(page) function that takes a page fixture parameter. Go to the LambdaTest eCommerce website using the page.goto() method.
Step 3: Select and click the Shop by Category button using the page.get_by_role() locator.
Use the codegen command and Pick Locator tool to easily locate and generate the line of code for the Shop by Category link element.
Step 4: Select and click the Cameras link using the page.get_by_role() locator.
As stated in step 3 above, use the Pick Locator tool to locate the Cameras link.
To learn more about locating elements using Playwright, follow this guide on Playwright locators.
Step 5: Use the page.wait_for_event() method to wait for DOM tree content to be fully loaded.
Step 6: Get the page title using the page.title() method and validate if it matches the expected value. Use set_test_status to set the status to ‘pass’ or ‘fail’ depending on the outcome, along with an appropriate remark.
Step 7: Use the expect() function to assert that the Cameras category page is fully loaded and has the title Cameras.
Code Execution:
To execute the test code above, run the following command:
1 |
pytest test_wait_event_navigation.py |
Output:
Using the Playwright wait_for_function() Method
In this section of the blog on Playwright wait for navigation methods, we will use the second method, which is page.wait_for_function(). This method waits for a JavaScript function or expression to resolve to a truthy value.
We will understand how this method works by defining a test scenario below and executing it for better comprehension.
Test Scenario:
|
Code Implementation:
In the below section, we will see the code implementation for the above test scenario.
In the below section, we will learn each set of code instructions to understand their purpose in detail and enhance the understanding, particularly focusing on the second method of Playwright wait for navigation, which is page.wait_for_function().
Code Walkthrough:
Step 1: Import the page, browser, set_test_status fixtures, and the expect() function.
Step 2: Create a test_wait_function_navigation(page) function with a page fixture parameter. Go to the LambdaTest eCommerce website using the page.goto() method.
Step 3: Select and click the author Jolio Balia link using the page.get_by_role() locator.
Step 4: Use the page.wait_for_function() method to wait for the resolution of the JavaScript expression, which checks if the document title matches the author’s name, Jolio Balia.
Step 5: Get the page title using the page.title() method and valid if it matches the expected value. Use set_test_status to set the status to ‘passed’ or ‘failed’ depending on the outcome with an appropriate remark.
Step 6: Use the expect() function to assert that the page object has a title, Jolio Balia.
Code Execution:
To execute the above test code, run the following command:
1 |
pytest test_wait_function_navigation.py |
Output:
Using the Playwright wait_for_load_state() Method
In this section of the blog on Playwright wait for navigation methods, we will use the third method, which is page.wait_for_load_state(). This method resolves when a web page has reached an expected load state.
We will understand how this method works by defining a test scenario below and executing it for better comprehension.
Test Scenario:
|
Code Implementation:
In the below section, we will see the code implementation for the above test scenario.
In the below section, we will learn each set of code instructions to understand their purpose in detail and enhance the understanding, particularly focusing on the third method of Playwright wait for navigation, which is page.wait_for_load_state().
Code Walkthrough:
Step 1: Import the page, browser, set_test_status fixtures, and the expect() function.
Step 2: Create a test_wait_state_navigation(page) function with a page fixture parameter.
Go to the LambdaTest eCommerce website using the page.goto() method.
Step 3: Use the page.wait_for_load_state() locator to wait for the complete load of the homepage.
Step 4: Get the page title using the page.title() method and valid if it matches the expected value. Use set_test_status to set the status to ‘passed’ or ‘failed’ depending on the outcome with an appropriate remark.
Step 5: Use the expect() function to validate the homepage’s title.
Code Execution:
To execute the above test code, run the following command:
1 |
pytest test_wait_state_navigation.py |
Output:
Using the Playwright wait_for_url() Method
In this section of the blog on Playwright wait for navigation methods, we will use the fourth method, which is page.wait_for_url(). This method allows a web page’s main frame to navigate to a new URL or match a URL pattern.
We will understand how this method works by defining a test scenario below and executing it for better comprehension.
Test Scenario:
|
Code Implementation:
In the below section, we will see the code implementation for the above test scenario.
In the below section, we will learn each set of code instructions to understand their purpose in detail and enhance the understanding, particularly focusing on the fourth method of Playwright wait for navigation which is page.wait_for_url().
Code Walkthrough:
Step 1: Import regular expression module, re, page, browser, and set_test_status fixtures and the expect() function.
Step 2: Create a test_wait_url_navigation(page) function that takes a page fixture parameter.
In the test function, navigate to the LambdaTest eCommerce homepage using the page.goto() method.
Step 3: Select and click the Blog link using the page.get_by_role() locator.
Step 4: Use the page.wait_for_url() method to wait for navigation to a webpage with a matching URL.
Step 5: Get the page title using the page.title() method and valid if it matches the expected value. Use set_test_status to set the status to ‘passed’ or ‘failed’ depending on the outcome with an appropriate remark.
Step 6: Use the expect() to assert that the new webpage URL matches the expected URL.
Code Execution:
To execute the above test code, run the following command:
1 |
pytest test_wait_url_navigation.py |
Output:
To execute all test cases together, we can use the pytest-xdist plugin. First, install the pytest-xdist plugin using the following command in the console:
1 |
pip install pytest-xdist |
Let’s execute all tests together by running the following command given below.
1 |
pytest -n 4 |
Output:
Let’s head back to the LambdaTest Dashboard to view the test results.
The above image shows a quick summary of all four tests we executed for each of the Playwright wait for navigation methods.
Conclusion
When we simulate user actions, such as navigation, clicking, and form filling, using an automation script, we need to wait at intervals to allow these actions to be completed before proceeding with other steps.
Implementing waiting in browser automation scripts ensures that web pages are fully loaded, elements are interactable, and tests become more stable and less prone to flakiness. Playwright provides methods that can be used to initiate waiting in automation scripts. These methods can be used to wait for an event, function, load state, or a matching URL.
We encourage using these Playwright wait for navigation methods when writing efficient automation scripts.
Frequently Asked Questions (FAQs)
How to navigate back in Playwright?
To navigate back in Playwright, you can use the page.goBack() method.
What is auto wait in Playwright?
Auto wait in Playwright is a feature that automatically waits for elements to be ready before performing actions, improving the reliability and stability of tests.
What if we don’t use await?
If you don’t use await in Playwright, your script may not wait for the action to complete, leading to potential issues like elements not being interactable or actions not being executed in the correct order.
Got Questions? Drop them on LambdaTest Community. Visit now