Loading...
Loading...
Write Playwright tests for Hyvä themes with Alpine.js components. This skill should be used when writing e2e tests, creating page objects, or debugging selector issues in Playwright tests for Hyvä Magento storefronts. Trigger phrases include "write playwright test", "playwright alpine", "test hyva page", "e2e test", "playwright selector".
npx skill4agent add hyva-themes/hyva-ai-tools hyva-playwright-test<div x-show="displayErrorMessage" class="message error">.message.error#messages// WRONG — matches hidden Alpine x-show elements throughout DOM
await expect(page.locator('.message.success')).toContainText('Added to cart');
await expect(page.locator('.message-error')).toContainText('Error');
// RIGHT — scoped to the visible messages container
await expect(page.locator('#messages .message.success')).toContainText('Added to cart');
await expect(page.locator('#messages .message-error, #messages .message.error')).toContainText('Error');.message.message.error.message.successdiv.message.message.message.notice#maincontent#messagesgetByRole()sr-onlygetByLabel()getByText()page.locator('#maincontent').getByText(...)getByPlaceholder()getByAltText()getByTestId()data-testidaria-*[aria-label="pagination"][aria-current="page"]#messages .message.success:visible:visible| Pattern | Problem | Solution |
|---|---|---|
| Strict mode: multiple matches | Scope to unique container ( |
| Element not initialized until visible | |
| Elements don't exist in DOM until condition true | Click the trigger first, then query children |
| Alpine clears value after form submit | Don't assert input value post-submit; verify via success message |
| Cart badge updates asynchronously | Use web-first assertions with timeout: |
| Hidden until hover | |
| Alpine form reveal | Fields hidden until checkbox checked | |
| May submit Alpine-bound form unexpectedly | Prefer explicit |
// DO — auto-retries // DON'T — no retry
await expect(loc).toBeVisible(); // expect(await loc.isVisible()).toBe(true);
await expect(loc).toContainText('X'); // expect(await loc.textContent()).toContain('X');waitForTimeout()// Cart count updates asynchronously via Alpine x-text
await expect(page.locator('#menu-cart-icon span[x-text="summaryCount"]'))
.not.toHaveText('0', { timeout: 15_000 });| Element | Hyvä Selector | Luma Selector |
|---|---|---|
| Pagination nav | | |
| Page link | | |
| Active page | | |
| Filter button | | |
| Cart icon badge | | |
| Account menu | | |
| Success message | | |
| Error message | | |
| Main menu | | |
| Footer nav | | |
| Product image | | |
| Add to Cart (card) | | |
references/