Playwright tests are simple, they
There is no need to wait for anything prior to performing an action: Playwright automatically waits for the wide range of actionability checks to pass prior to performing each action.
There is also no need to deal with the race conditions when performing the checks - Playwright assertions are designed in a way that they describe the expectations that need to be eventually met.
That's it! These design choices allow Playwright users to forget about flaky timeouts and racy checks in their tests altogether.
You will learn
Take a look at the following example to see how to write a test. Note how the file name follows the test_
prefix convention as well as each test name.
test_example.py
import re
from playwright.sync_api import Page, expect
def test_has_title(page: Page):
page.goto("https://playwright.dev/")
expect(page).to_have_title(re.compile("Playwright"))
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/")
page.get_by_role("link", name="Get started").click()
expect(page.get_by_role("heading", name="Installation")).to_be_visible()
Actions Navigation
Most of the tests will start with navigating page to the URL. After that, test will be able to interact with the page elements.
page.goto("https://playwright.dev/")
Playwright will wait for page to reach the load state prior to moving forward. Learn more about the page.goto() options.
InteractionsPerforming actions starts with locating the elements. Playwright uses Locators API for that. Locators represent a way to find element(s) on the page at any moment, learn more about the different types of locators available. Playwright will wait for the element to be actionable prior to performing the action, so there is no need to wait for it to become available.
get_started = page.get_by_role("link", name="Get started")
get_started.click()
In most cases, it'll be written in one line:
page.get_by_role("link", name="Get started").click()
Basic actions
This is the list of the most popular Playwright actions. Note that there are many more, so make sure to check the Locator API section to learn more about them.
AssertionsPlaywright includes assertions that will wait until the expected condition is met. Using these assertions allows making the tests non-flaky and resilient. For example, this code will wait until the page gets the title containing "Playwright":
import re
from playwright.sync_api import expect
expect(page).to_have_title(re.compile("Playwright"))
Here is the list of the most popular async assertions. Note that there are many more to get familiar with:
Test isolationThe Playwright Pytest plugin is based on the concept of test fixtures such as the built in page fixture, which is passed into your test. Pages are isolated between tests due to the Browser Context, which is equivalent to a brand new browser profile, where every test gets a fresh environment, even when multiple tests run in a single Browser.
test_example.py
from playwright.sync_api import Page
def test_example_test(page: Page):
pass
def test_another_test(page: Page):
pass
Using fixtures
You can use various fixtures to execute code before or after your tests and to share objects between them. A function
scoped fixture e.g. with autouse behaves like a beforeEach/afterEach. And a module
scoped fixture with autouse behaves like a beforeAll/afterAll which runs before all and after all the tests.
test_example.py
import pytest
from playwright.sync_api import Page, expect
@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):
print("before the test runs")
page.goto("https://playwright.dev/")
yield
print("after the test runs")
def test_main_navigation(page: Page):
expect(page).to_have_url("https://playwright.dev/")
What's next
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4