autoreg-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
46
skills/grok-autoreg/references/react-form-filling.md
Normal file
46
skills/grok-autoreg/references/react-form-filling.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# React Form Filling Pattern for Browser Automation
|
||||
|
||||
## Problem
|
||||
React controlled inputs ignore `Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set` — the form validation sees empty values and refuses to submit.
|
||||
|
||||
## Solution
|
||||
Use `locator.fill()` + dispatch `input` event after each fill.
|
||||
|
||||
## Working Code Snippet
|
||||
```python
|
||||
# Fill name
|
||||
name_input = page.locator("input[autocomplete='given-name']").first
|
||||
await name_input.click()
|
||||
await name_input.fill("Max")
|
||||
await page.evaluate("""
|
||||
document.querySelector('input[autocomplete="given-name"]')
|
||||
?.dispatchEvent(new Event('input', {bubbles: true}));
|
||||
""")
|
||||
|
||||
# Fill surname
|
||||
surname_input = page.locator("input[autocomplete='family-name']").first
|
||||
await surname_input.click()
|
||||
await surname_input.fill("Mustermann")
|
||||
await page.evaluate("""
|
||||
document.querySelector('input[autocomplete="family-name"]')
|
||||
?.dispatchEvent(new Event('input', {bubbles: true}));
|
||||
""")
|
||||
|
||||
# Fill password (use fill() NOT JS value setter!)
|
||||
pwd_input = page.locator("input[type='password']").first
|
||||
await pwd_input.click()
|
||||
await pwd_input.fill(password)
|
||||
await page.evaluate("""
|
||||
document.querySelector('input[type="password"]')
|
||||
?.dispatchEvent(new Event('input', {bubbles: true}));
|
||||
""")
|
||||
|
||||
# Click submit — use Playwright locator, NOT JS querySelector with :has-text()
|
||||
btn = page.locator("button:has-text('Завершить регистрацию')").first
|
||||
await btn.click()
|
||||
```
|
||||
|
||||
## Pitfalls
|
||||
- **`:has-text()` in JS**: `document.querySelector('button:has-text("...")')` throws SyntaxError. `:has-text()` is a Playwright pseudo-selector, not valid CSS.
|
||||
- **JS fallback**: Use `textContent.includes()` loop if JS click is needed
|
||||
- **OneTrust buttons**: `button:has-text('Подтвердить')` matches cookie consent buttons. Check `class` attribute for "onetrust" and skip.
|
||||
Reference in New Issue
Block a user