Sure, let's dive into some best practices for writing resilient tests with @playwright/test.
First off, focus on testing user-visible behavior, not implementation details. Your tests should confirm that the application works for end users. Avoid relying on things like function names or CSS classes that users won't see or use.
Next, make your tests as isolated as possible. Each test should run independently with its own local storage, session storage, data, cookies, etc. This improves reproducibility and debugging, and prevents cascading test failures.
To avoid repetition, use before and after hooks. For example, you can add a before hook to run a part of your test before each test, like navigating to a URL or logging in.
import { test } from '@playwright/test';
test.beforeEach(async ({ page }) => {
await page.goto('https://ray.run');
});
test('my test', async ({ page }) => {
// Your test code here.
});
Use locators that can withstand changes in the DOM structure. Playwright provides several ways to generate locators, including chaining and filtering locators by text or by another locator.
const submitButton = page.locator('text="Submit"');
Finally, when writing assertions, use web first assertions like toBeVisible()
, which waits until an expected condition is met, rather than isVisible()
, which returns immediately.
await expect(page.locator('text="Submit"')).toBeVisible();
For more tips, check out Mastering Playwright Test Automation: Your Comprehensive Cheat Sheet. Happy testing!
If you still have questions, please ask a question and I will try to answer it.
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].