# Playwright Form Automation Workflow ## Overview Sistema completo per automatizzare submit di form su siti web usando Playwright con debugging intelligente via page dumps. ## Architettura del Sistema ### 1. **Page Dumping System** (Core Feature) Funzione centrale che estrae informazioni strutturali dalla pagina per debugging: ```javascript async function dumpPageInfo(page, prefix) { const timestamp = Date.now(); const dumpDir = './page-dumps'; // 1. Salva HTML completo const html = await page.content(); fs.writeFileSync(`${dumpDir}/${prefix}-${timestamp}.html`, html); // 2. Screenshot della pagina await page.screenshot({ path: `${dumpDir}/${prefix}-${timestamp}.png`, fullPage: true }); // 3. Estrai TUTTI i form elements (input, textarea, select) const elements = await page.$$eval('input, textarea, select', els => els.map(el => ({ tag: el.tagName.toLowerCase(), type: el.type || '', name: el.name || '', id: el.id || '', placeholder: el.placeholder || '', value: el.value || '', class: el.className || '' })) ); fs.writeFileSync( `${dumpDir}/${prefix}-${timestamp}-selectors.txt`, JSON.stringify(elements, null, 2) ); } ``` **Quando usarlo:** - Prima di compilare un form (per capire la struttura) - Dopo errori di selezione/compilazione - Per analizzare dropdown dinamici (Select2, react-select, etc.) ### 2. **Workflow Iterativo di Debugging** ``` ┌─────────────────────────────────────────────┐ │ 1. ESEGUI SCRIPT │ │ node automation-script.js │ └────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 2. ERRORE? → DUMP AUTOMATICO │ │ - HTML salvato │ │ - Screenshot salvato │ │ - Form selectors estratti │ └────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 3. ANALISI DUMP │ │ cat page-dumps/*-selectors.txt │ │ xdg-open page-dumps/*.png │ └────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 4. CORREGGI SELETTORI NELLO SCRIPT │ │ - Usa i nomi/id reali dai selectors.txt │ │ - Adatta logica per dropdown dinamici │ └────────────┬────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────┐ │ 5. REITERA (torna a step 1) │ └─────────────────────────────────────────────┘ ``` ### 3. **Pattern per Form Elements Comuni** #### A. Input Text Semplici ```javascript await page.fill('input[name="username"]', 'myuser'); await page.fill('input[name="email"]', 'user@example.com'); ``` #### B. CSRF Token (Django/Rails/Laravel) ```javascript // Automaticamente gestito dal browser, ma visibile nei dumps: // { "type": "hidden", "name": "csrfmiddlewaretoken", "value": "..." } // Non serve compilarlo manualmente - submit button lo include ``` #### C. Submit Button ```javascript // PREFERISCI: click esplicito sul submit button await page.click('input[type="submit"]'); await page.click('button[type="submit"]'); // EVITA: form.submit() non trigger eventi JavaScript ``` #### D. Select2 Dropdown (jQuery plugin) Select2 nasconde il `