Initial commit
This commit is contained in:
438
skills/playwright-flow-recorder/references/playwright-actions.md
Normal file
438
skills/playwright-flow-recorder/references/playwright-actions.md
Normal file
@@ -0,0 +1,438 @@
|
||||
# Playwright Actions Reference
|
||||
|
||||
Comprehensive mapping of natural language actions to Playwright code.
|
||||
|
||||
## Navigation Actions
|
||||
|
||||
### Navigate to Page
|
||||
|
||||
**Natural Language:**
|
||||
- "navigate to X"
|
||||
- "go to X"
|
||||
- "visit X"
|
||||
- "open X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.goto('/x')
|
||||
```
|
||||
|
||||
### Navigate Back
|
||||
|
||||
**Natural Language:**
|
||||
- "go back"
|
||||
- "navigate back"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.goBack()
|
||||
```
|
||||
|
||||
### Navigate Forward
|
||||
|
||||
**Natural Language:**
|
||||
- "go forward"
|
||||
- "navigate forward"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.goForward()
|
||||
```
|
||||
|
||||
### Reload Page
|
||||
|
||||
**Natural Language:**
|
||||
- "reload"
|
||||
- "refresh page"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.reload()
|
||||
```
|
||||
|
||||
## Click Actions
|
||||
|
||||
### Click Button
|
||||
|
||||
**Natural Language:**
|
||||
- "click X button"
|
||||
- "click on X"
|
||||
- "press X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByRole('button', { name: /x/i }).click()
|
||||
```
|
||||
|
||||
### Click Link
|
||||
|
||||
**Natural Language:**
|
||||
- "click X link"
|
||||
- "follow X link"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByRole('link', { name: /x/i }).click()
|
||||
```
|
||||
|
||||
### Double Click
|
||||
|
||||
**Natural Language:**
|
||||
- "double click X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByRole('button', { name: /x/i }).dblclick()
|
||||
```
|
||||
|
||||
### Right Click
|
||||
|
||||
**Natural Language:**
|
||||
- "right click X"
|
||||
- "context menu on X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByRole('button', { name: /x/i }).click({ button: 'right' })
|
||||
```
|
||||
|
||||
## Form Input Actions
|
||||
|
||||
### Fill Text Input
|
||||
|
||||
**Natural Language:**
|
||||
- "fill X with Y"
|
||||
- "enter Y in X"
|
||||
- "type Y in X field"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/x/i).fill('y')
|
||||
```
|
||||
|
||||
### Clear Input
|
||||
|
||||
**Natural Language:**
|
||||
- "clear X"
|
||||
- "empty X field"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/x/i).clear()
|
||||
```
|
||||
|
||||
### Type with Delay
|
||||
|
||||
**Natural Language:**
|
||||
- "slowly type X"
|
||||
- "type X with delay"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/field/i).type('x', { delay: 100 })
|
||||
```
|
||||
|
||||
### Select Dropdown Option
|
||||
|
||||
**Natural Language:**
|
||||
- "select X from Y"
|
||||
- "choose X in Y dropdown"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/y/i).selectOption('x')
|
||||
```
|
||||
|
||||
### Check Checkbox
|
||||
|
||||
**Natural Language:**
|
||||
- "check X"
|
||||
- "enable X checkbox"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/x/i).check()
|
||||
```
|
||||
|
||||
### Uncheck Checkbox
|
||||
|
||||
**Natural Language:**
|
||||
- "uncheck X"
|
||||
- "disable X checkbox"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/x/i).uncheck()
|
||||
```
|
||||
|
||||
### Upload File
|
||||
|
||||
**Natural Language:**
|
||||
- "upload X file"
|
||||
- "attach X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByLabel(/upload/i).setInputFiles('path/to/file.txt')
|
||||
```
|
||||
|
||||
## Keyboard Actions
|
||||
|
||||
### Press Key
|
||||
|
||||
**Natural Language:**
|
||||
- "press Enter"
|
||||
- "hit Escape key"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.keyboard.press('Enter')
|
||||
await page.keyboard.press('Escape')
|
||||
```
|
||||
|
||||
### Type Text
|
||||
|
||||
**Natural Language:**
|
||||
- "type X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.keyboard.type('x')
|
||||
```
|
||||
|
||||
### Key Combination
|
||||
|
||||
**Natural Language:**
|
||||
- "press Ctrl+S"
|
||||
- "use keyboard shortcut Cmd+K"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.keyboard.press('Control+S')
|
||||
await page.keyboard.press('Meta+K')
|
||||
```
|
||||
|
||||
## Mouse Actions
|
||||
|
||||
### Hover
|
||||
|
||||
**Natural Language:**
|
||||
- "hover over X"
|
||||
- "mouse over X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByRole('button', { name: /x/i }).hover()
|
||||
```
|
||||
|
||||
### Drag and Drop
|
||||
|
||||
**Natural Language:**
|
||||
- "drag X to Y"
|
||||
- "move X to Y"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByText('X').dragTo(page.getByText('Y'))
|
||||
```
|
||||
|
||||
## Wait Actions
|
||||
|
||||
### Wait for Element
|
||||
|
||||
**Natural Language:**
|
||||
- "wait for X"
|
||||
- "wait until X appears"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.getByText(/x/i).waitFor()
|
||||
```
|
||||
|
||||
### Wait for Navigation
|
||||
|
||||
**Natural Language:**
|
||||
- "wait for page load"
|
||||
- "wait for navigation"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.waitForLoadState('networkidle')
|
||||
```
|
||||
|
||||
### Wait for Timeout
|
||||
|
||||
**Natural Language:**
|
||||
- "wait 2 seconds"
|
||||
- "pause for 1000ms"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await page.waitForTimeout(2000)
|
||||
```
|
||||
|
||||
## Assertion Actions
|
||||
|
||||
### Assert Visible
|
||||
|
||||
**Natural Language:**
|
||||
- "see X"
|
||||
- "verify X is visible"
|
||||
- "X is displayed"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page.getByText(/x/i)).toBeVisible()
|
||||
```
|
||||
|
||||
### Assert Not Visible
|
||||
|
||||
**Natural Language:**
|
||||
- "X is hidden"
|
||||
- "don't see X"
|
||||
- "X not visible"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page.getByText(/x/i)).not.toBeVisible()
|
||||
```
|
||||
|
||||
### Assert URL
|
||||
|
||||
**Natural Language:**
|
||||
- "is redirected to X"
|
||||
- "URL is X"
|
||||
- "page is X"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page).toHaveURL(/x/)
|
||||
```
|
||||
|
||||
### Assert Text Content
|
||||
|
||||
**Natural Language:**
|
||||
- "X contains Y"
|
||||
- "X displays Y"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page.getByRole('x')).toContainText(/y/i)
|
||||
```
|
||||
|
||||
### Assert Enabled/Disabled
|
||||
|
||||
**Natural Language:**
|
||||
- "X is enabled"
|
||||
- "X is disabled"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page.getByRole('button', { name: /x/i })).toBeEnabled()
|
||||
await expect(page.getByRole('button', { name: /x/i })).toBeDisabled()
|
||||
```
|
||||
|
||||
### Assert Checked
|
||||
|
||||
**Natural Language:**
|
||||
- "X is checked"
|
||||
- "X is unchecked"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page.getByLabel(/x/i)).toBeChecked()
|
||||
await expect(page.getByLabel(/x/i)).not.toBeChecked()
|
||||
```
|
||||
|
||||
### Assert Count
|
||||
|
||||
**Natural Language:**
|
||||
- "there are X items"
|
||||
- "X items are displayed"
|
||||
|
||||
**Playwright Code:**
|
||||
```typescript
|
||||
await expect(page.getByRole('listitem')).toHaveCount(5)
|
||||
```
|
||||
|
||||
## Selector Patterns
|
||||
|
||||
### By Role
|
||||
|
||||
**Use for semantic elements:**
|
||||
```typescript
|
||||
page.getByRole('button', { name: /submit/i })
|
||||
page.getByRole('link', { name: /home/i })
|
||||
page.getByRole('heading', { name: /title/i, level: 1 })
|
||||
page.getByRole('textbox', { name: /search/i })
|
||||
```
|
||||
|
||||
### By Label
|
||||
|
||||
**Use for form inputs:**
|
||||
```typescript
|
||||
page.getByLabel(/email/i)
|
||||
page.getByLabel(/password/i)
|
||||
```
|
||||
|
||||
### By Text
|
||||
|
||||
**Use for visible text:**
|
||||
```typescript
|
||||
page.getByText(/welcome/i)
|
||||
page.getByText('Exact Text')
|
||||
```
|
||||
|
||||
### By Test ID
|
||||
|
||||
**Use for custom test identifiers:**
|
||||
```typescript
|
||||
page.getByTestId('entity-card')
|
||||
page.getByTestId('create-button')
|
||||
```
|
||||
|
||||
### By Placeholder
|
||||
|
||||
**Use for input placeholders:**
|
||||
```typescript
|
||||
page.getByPlaceholder(/enter name/i)
|
||||
```
|
||||
|
||||
## Common Patterns
|
||||
|
||||
### Fill Form
|
||||
|
||||
```typescript
|
||||
await page.getByLabel(/name/i).fill('John Doe')
|
||||
await page.getByLabel(/email/i).fill('john@example.com')
|
||||
await page.getByLabel(/type/i).selectOption('character')
|
||||
await page.getByRole('button', { name: /submit/i }).click()
|
||||
```
|
||||
|
||||
### Navigate and Verify
|
||||
|
||||
```typescript
|
||||
await page.goto('/entities')
|
||||
await expect(page).toHaveURL(/entities/)
|
||||
await expect(page.getByRole('heading', { name: /entities/i })).toBeVisible()
|
||||
```
|
||||
|
||||
### Conditional Actions
|
||||
|
||||
```typescript
|
||||
const deleteButton = page.getByRole('button', { name: /delete/i })
|
||||
if (await deleteButton.isVisible()) {
|
||||
await deleteButton.click()
|
||||
}
|
||||
```
|
||||
|
||||
### Loop Through Items
|
||||
|
||||
```typescript
|
||||
const items = page.getByRole('listitem')
|
||||
const count = await items.count()
|
||||
|
||||
for (let i = 0; i < count; i++) {
|
||||
await expect(items.nth(i)).toBeVisible()
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user