| name | browser-use-e2e |
| description | Run E2E verification of the Browser Use Chrome extension against real websites. 3-tier system: Tier 1 (surgical single-ATS, 3-5min), Tier 2 (full LinkedIn flow, 15min), Tier 3 (batch 15 jobs, 60min). OpenClaw acts as passive commander while the extension autonomously executes.
|
Browser Use Extension — E2E Test Runner
Two-layer architecture:
- OpenClaw = commander: start browser, load extension, send prompt, passively monitor
- Browser Use extension = executor: autonomously fill forms, navigate, recover from errors
Do NOT touch the main page tab during execution. Do NOT try to fill forms yourself. The extension does ALL the work. You are a read-only observer after sending the prompt.
Absolute Paths
| Item | Path |
|---|
| Extension source | <REPO_ROOT>/extension |
| Extension dist | <REPO_ROOT>/extension/dist |
| Extension ID | ghibnmkjcnbmdkgidopbbadcoehhhbff |
| Side panel URL | chrome-extension://ghibnmkjcnbmdkgidopbbadcoehhhbff/src/sidepanel/index.html |
| Browser | Microsoft Edge, profile: openclaw |
| E2E results dir | <REPO_ROOT>/e2e-results/runs |
| Working dir | <REPO_ROOT> |
3-Tier System
Tier 1 — Surgical (3-5 min)
Single ATS provider, direct URL. No LinkedIn navigation needed.
Prompt to send the extension:
Navigate to {url} and fill all application form fields with my profile information. Upload my resume. Submit the application. Report which fields filled, which failed.
Curated test URLs (pick one, or use the URL provided in the task):
| Provider | URL | Updated |
|---|
| Workday (Boeing) | https://boeing.wd1.myworkdayjobs.com/external_subsidiary/job/USA---Seal-Beach-CA/Software-Engineer-Developer--Development-_JR2026502111 | 2026-04-16 |
| Workday (Booz Allen) | https://bah.wd1.myworkdayjobs.com/BAH_Jobs/job/Software-Engineer--Senior_R0237681 | 2026-04-16 |
| Workday (Blue Origin) | https://blueorigin.wd5.myworkdayjobs.com/en-US/BlueOrigin/job/Software-Development-Engineer-I---Early-Career--2026-Starts-_R58467 | 2026-04-16 |
| Greenhouse (SimpliSafe) | https://job-boards.greenhouse.io/simplisafe/jobs/7785254 | 2026-04-16 |
| Ashby (Cohere) | https://jobs.ashbyhq.com/cohere/9baccd88-c051-474f-bfe8-6867fca54cee/application | 2026-04-16 |
| Ashby (Cohere) | https://jobs.ashbyhq.com/cohere/75c0032c-7200-48bf-9d6d-355880dd93d9/application | 2026-04-16 |
NOTE: Job URLs expire. If a URL 404s, find a fresh one from these job boards:
- Workday:
site:myworkdayjobs.com software engineer apply (Google search)
- Greenhouse: browse
https://job-boards.greenhouse.io/simplisafe
- Ashby: browse
https://jobs.ashbyhq.com/cohere
Pass criteria (Tier 1):
- Extension loaded and responded to the prompt
- Navigated to the ATS page successfully
- Filled at least name + email fields
- Attempted submission (or reported what failed with actionable detail)
Tier 2 — Flow (15 min)
Full LinkedIn → find job → external ATS → fill → submit. Tests the complete end-to-end navigation flow.
Requires: Active LinkedIn session (see Pre-flight step 5).
Prompt to send the extension:
Go to linkedin.com/jobs and search for "software engineer". Find a job with an external ATS application (not Easy Apply). Navigate to the external application, fill all fields with my profile, upload my resume, and submit.
Pass criteria (Tier 2):
- Successfully navigated LinkedIn job search
- Found and clicked through to an external ATS application
- Filled form fields on the external ATS page
- Attempted submission
If LinkedIn search yields no external jobs: Record as partial with note explaining no external jobs were found. This is not an extension failure.
Tier 3 — Batch (60 min)
Apply to multiple external ATS jobs from LinkedIn recommendations. Tests sustained multi-job workflows.
Requires: Active LinkedIn session (see Pre-flight step 5).
Prompt to send the extension:
Use the browser tool navigate to my LinkedIn Jobs Recommendation page. Go through each job in the pool and try to apply the first 15 jobs that are listed in our recommendation pool. Skip any LinkedIn Easy Apply jobs — only apply to jobs with external ATS applications. Then for each job, fill all the forms for me and submit job application for me. If an ATS requires account creation, use my email and temp_password from my profile to create an account and proceed.
Pass criteria (Tier 3):
- Navigated to LinkedIn recommendations
- Attempted at least 3 external ATS applications
- Score = succeeded / attempted (target: >30%)
Workflow
Phase 0 — Pre-flight
-
Build the extension:
cd <REPO_ROOT>/extension && npm run build
Stop if build fails.
-
Do NOT nuke user-data-dir for Tier 2 & 3. LinkedIn session cookies live there. Only nuke for Tier 1 when the service worker must be reloaded, and use the safe script:
./scripts/safe-nuke-user-data.sh
This backs up LinkedIn cookies to the vault before nuking and restores them after.
-
Start browser with the extension loaded. Verify the extension service worker appears in the browser targets.
-
CRITICAL: Sync and verify API keys (mandatory before every E2E test):
cd <REPO_ROOT>/extension && npm run verify-keys
This script performs two essential checks:
- Sync check: Verifies stored key in chrome.storage.local matches MINIMAX_API_KEY from ~/.zshrc
- API validation: Makes test API call to MiniMax to verify key is accepted (not expired/invalid)
If the script fails:
- Sync mismatch: Keys are out of sync — the script will auto-sync them, just re-run
- API validation failure (401/403): Key is expired/invalid — get a fresh key from api.minimax.io, update ~/.zshrc, then re-run
Do NOT proceed with E2E if validation fails. Running with expired keys wastes time and produces false negatives (Issue #382).
-
LinkedIn session check (Tier 2 & 3 only):
cd <REPO_ROOT>
node scripts/restore-linkedin-cookies.mjs --verify-only
If the check passes (exit 0): Session is active, proceed.
If the check fails (exit 1): Try automatic restore from cookie vault:
node scripts/restore-linkedin-cookies.mjs
If vault restore also fails: Session needs manual login. Record failure:
{"status": "error", "error": "linkedin_session_expired", "error_detail": "LinkedIn session expired. Vault restore failed. Run ./scripts/restore-linkedin-session.sh for manual login."}
Do NOT attempt to log in automatically. Report the failure and exit.
Phase 1 — Open the extension side panel
Navigate to: chrome-extension://ghibnmkjcnbmdkgidopbbadcoehhhbff/src/sidepanel/index.html
Take a snapshot. Confirm you see a chat input field and a Send button. Record the targetId of this tab.
Phase 2 — Send prompt to the extension
Pick the prompt from the tier section above.
Type the prompt into the chat input field and click Send. Use the browser tool's type and click actions on the side panel tab. This is how you communicate with the extension — through its chat UI.
Phase 3 — Passive monitoring
You are now a READ-ONLY observer. The extension will autonomously:
- Navigate to job pages
- Fill form fields
- Upload resumes
- Submit applications
Poll the side panel snapshot every 20-30 seconds to track progress.
Rules:
- Do NOT interact with ANY tab other than the side panel (for snapshot only)
- Do NOT help the extension when it struggles
- Do NOT fill forms yourself via CDP or browser tool — the extension does this
- Do NOT send additional prompts
- On timeout: capture final snapshot, proceed to Phase 4
Phase 4 — Evaluate
Inspect the result:
- Snapshot the side panel — read extension's final messages
- Snapshot the main page tab — see final state
- Screenshot the main page tab (full page)
- Check if the extension reported success or failure in its chat messages
Score:
- Count how many applications the extension attempted vs succeeded
- Calculate:
succeeded / attempted
Phase 5 — Record results
Write a structured JSON file:
<REPO_ROOT>/e2e-results/runs/YYYY-MM-DD-HH-MM.json
JSON format:
{
"timestamp": "2026-04-16T12:00:00Z",
"test_id": "tier1-workday-boeing",
"tier": 1,
"target": "https://boeing.wd1.myworkdayjobs.com/...",
"provider": "workday",
"status": "pass",
"score": { "met": 1, "total": 1, "pct": 100 },
"attempted": 1,
"succeeded": 1,
"head_commit": "abc1234",
"ats_providers": [
{
"provider": "workday",
"site": "Boeing",
"url": "https://...",
"result": "pass",
"fields_filled": 8,
"fields_total": 10,
"notes": "Extension self-reported successful submission"
}
],
"issues_found": [],
"failures": [],
"notes": "Extension filled 8/10 fields and submitted successfully"
}
Required fields: timestamp, test_id, tier, status, score, attempted, succeeded, head_commit, ats_providers, issues_found
Get head_commit from: git -C <REPO_ROOT> rev-parse --short HEAD
Commit results to git:
cd <REPO_ROOT>
git add e2e-results/runs/
git commit -m "e2e: tier {N} results - {STATUS} {score}%"
Return one-line summary: E2E tier{N} {test_id}: {STATUS} {score}% (ATS: {s}/{a})