Update SKILL.md
This commit is contained in:
@@ -139,6 +139,68 @@ You can collaborate with the user - they can help with captchas, difficult eleme
|
|||||||
- **Wait for load**: use `page.waitForLoadState('domcontentloaded')` not `page.waitForEvent('load')` - waitForEvent times out if already loaded
|
- **Wait for load**: use `page.waitForLoadState('domcontentloaded')` not `page.waitForEvent('load')` - waitForEvent times out if already loaded
|
||||||
- **Avoid timeouts**: prefer proper waits over `page.waitForTimeout()` - there are better ways to wait for elements
|
- **Avoid timeouts**: prefer proper waits over `page.waitForTimeout()` - there are better ways to wait for elements
|
||||||
|
|
||||||
|
## common mistakes to avoid
|
||||||
|
|
||||||
|
**1. Not verifying actions succeeded**
|
||||||
|
Always screenshot and READ the image after important actions (form submissions, uploads, typing). Your mental model can diverge from actual browser state:
|
||||||
|
```js
|
||||||
|
await page.keyboard.type('my text');
|
||||||
|
await page.screenshotWithAccessibilityLabels({ page });
|
||||||
|
// Then READ the screenshot file to verify text appeared correctly
|
||||||
|
```
|
||||||
|
|
||||||
|
**2. Assuming paste/upload worked**
|
||||||
|
Clipboard paste (`Meta+v`) can silently fail. For file uploads, prefer file input:
|
||||||
|
```js
|
||||||
|
// Reliable: use file input
|
||||||
|
const fileInput = page.locator('input[type="file"]').first();
|
||||||
|
await fileInput.setInputFiles('/path/to/image.png');
|
||||||
|
|
||||||
|
// Unreliable: clipboard paste may silently fail, need to focus textarea first for example
|
||||||
|
await page.keyboard.press('Meta+v'); // always verify with screenshot!
|
||||||
|
```
|
||||||
|
|
||||||
|
**3. Using stale refs from old snapshots**
|
||||||
|
`[ref=e23]` refs change when page updates. Always get a fresh snapshot before clicking:
|
||||||
|
```js
|
||||||
|
// BAD: using ref from minutes ago
|
||||||
|
await page.locator('[ref=e23]').click(); // element may have changed
|
||||||
|
|
||||||
|
// GOOD: get fresh snapshot, then immediately use refs from it
|
||||||
|
console.log(await accessibilitySnapshot({ page, showDiffSinceLastCall: true }));
|
||||||
|
// Now use the NEW refs from this output
|
||||||
|
```
|
||||||
|
|
||||||
|
**4. Wrong assumptions about current page/element**
|
||||||
|
Before destructive actions (delete, submit), verify you're targeting the right thing:
|
||||||
|
```js
|
||||||
|
// Before deleting, verify it's the right item
|
||||||
|
await page.screenshotWithAccessibilityLabels({ page });
|
||||||
|
// READ the screenshot to confirm, THEN proceed with delete
|
||||||
|
```
|
||||||
|
|
||||||
|
**5. Text concatenation without line breaks**
|
||||||
|
`keyboard.type()` doesn't insert newlines from `\n` in strings. Use `keyboard.press('Enter')`:
|
||||||
|
```js
|
||||||
|
// BAD: newlines in string don't create line breaks
|
||||||
|
await page.keyboard.type('Line 1\nLine 2'); // becomes "Line 1Line 2"
|
||||||
|
|
||||||
|
// GOOD: use Enter key for line breaks
|
||||||
|
await page.keyboard.type('Line 1');
|
||||||
|
await page.keyboard.press('Enter');
|
||||||
|
await page.keyboard.type('Line 2');
|
||||||
|
```
|
||||||
|
|
||||||
|
**6. Assuming page content loaded**
|
||||||
|
Even after `goto()`, dynamic content may not be ready:
|
||||||
|
```js
|
||||||
|
await page.goto('https://example.com');
|
||||||
|
// Content may still be loading via JavaScript!
|
||||||
|
await page.waitForSelector('article', { timeout: 10000 });
|
||||||
|
// Or use waitForPageLoad utility
|
||||||
|
await waitForPageLoad({ page, timeout: 5000 });
|
||||||
|
```
|
||||||
|
|
||||||
## checking page state
|
## checking page state
|
||||||
|
|
||||||
After any action (click, submit, navigate), verify what happened:
|
After any action (click, submit, navigate), verify what happened:
|
||||||
|
|||||||
Reference in New Issue
Block a user