Requirements
- Target platform
- OpenClaw
- Install method
- Manual import
- Extraction
- Extract archive
- Prerequisites
- OpenClaw
- Primary doc
- SKILL.md
Automate web form interactions including login, file upload, text input, and form submission using Playwright. Use when user needs to automate website intera...
Automate web form interactions including login, file upload, text input, and form submission using Playwright. Use when user needs to automate website intera...
Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.
I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete.
I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run.
Automate web form interactions reliably using Playwright with best practices for session management, file uploads, and form submission.
const { chromium } = require('playwright'); // Basic form automation const browser = await chromium.launch({ headless: true }); const page = await browser.newPage(); await page.goto('https://example.com/form'); // Upload compressed images await page.locator('input[type="file"]').setInputFiles('/path/to/image.webp'); // Type text (triggers events properly) await page.locator('textarea').pressSequentially('Your text', { delay: 30 }); // Submit form await page.locator('button[type="submit"]').click({ force: true });
When user provides a JSON file with session data: const sessionData = JSON.parse(fs.readFileSync('session.json', 'utf8')); // Set cookies before navigating for (const cookie of sessionData.cookies || []) { await context.addCookies([cookie]); } // Set localStorage/sessionStorage await page.evaluate((data) => { for (const [k, v] of Object.entries(data.localStorage || {})) { localStorage.setItem(k, v); } }, sessionData);
Always compress images before upload for reliability: # Convert to webp for best compression convert input.png output.webp # Or resize if needed convert input.png -resize 1024x1024 output.webp Size comparison: Original PNG: ~4MB Compressed PNG: ~1MB WebP: ~30-50KB (99% smaller)
// 1. Find file inputs const fileInputs = await page.locator('input[type="file"]').all(); // 2. Upload with waiting time await fileInputs[0].setInputFiles('/path/to/start.webp'); await page.waitForTimeout(3000); // Wait for upload to process await fileInputs[1].setInputFiles('/path/to/end.webp'); await page.waitForTimeout(3000);
โ Don't use fill() - doesn't trigger input events: await textInput.fill('text'); // May not activate submit button โ Use pressSequentially() - simulates real typing: await textInput.pressSequentially('text', { delay: 30 });
await page.evaluate(() => { const el = document.querySelector('textarea'); el.dispatchEvent(new Event('input', { bubbles: true })); el.dispatchEvent(new Event('change', { bubbles: true })); });
If button appears disabled but should be clickable: await button.click({ force: true });
const isEnabled = await button.isEnabled(); const isVisible = await button.isVisible();
const { chromium } = require('playwright'); const fs = require('fs'); async function submitVideoForm(sessionFile, startImage, endImage, prompt) { const browser = await chromium.launch({ headless: true, args: ['--no-sandbox'] }); const context = await browser.newContext(); const page = await context.newPage(); // Load session if provided if (fs.existsSync(sessionFile)) { const session = JSON.parse(fs.readFileSync(sessionFile, 'utf8')); // Set cookies, localStorage... } // Navigate await page.goto('https://example.com/video', { waitUntil: 'domcontentloaded' }); await page.waitForTimeout(3000); // Upload images (webp compressed) const inputs = await page.locator('input[type="file"]').all(); await inputs[0].setInputFiles(startImage); await page.waitForTimeout(3000); await inputs[1].setInputFiles(endImage); await page.waitForTimeout(3000); // Select options await page.click('text=Seedance 2.0 Fast'); await page.click('text=15s'); // Type prompt const textarea = page.locator('textarea').first(); await textarea.pressSequentially(prompt, { delay: 30 }); await page.waitForTimeout(2000); // Submit await page.locator('button[class*="submit"]').click({ force: true }); // Wait and screenshot await page.waitForTimeout(5000); await page.screenshot({ path: 'result.png' }); await browser.close(); }
The scripts/ directory contains reusable automation scripts: webp-compress.sh - Convert images to webp format form-submit.js - Generic form submission template
Wait longer after file upload (3+ seconds) Ensure text input triggers events (use pressSequentially) Check if images are still uploading
Compress images to webp format first Reduce image dimensions if very large
Use force: true for click Check button selector is correct Verify all required fields are filled
Code helpers, APIs, CLIs, browser automation, testing, and developer operations.
Largest current source with strong distribution and engagement signals.