yao/sandbox/docker/chrome/tests/README.md
Max 95cdf7961c Add Chrome support to sandbox module and update documentation
- Introduce a new Chrome image for the sandbox, enabling VNC access with real Chrome and CDP support (amd64 only).
- Update README to reflect the addition of the Chrome image and its build instructions.
- Modify build script to include a dedicated build process for the Chrome image.
- Enhance .gitignore to exclude the new Chrome plan file.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-06 17:48:49 +08:00

105 lines
3.8 KiB
Markdown

# Chrome Browser Automation Demo Tests
Example scripts demonstrating browser automation inside the `sandbox-claude-chrome` Docker image.
## Scripts
| Script | Description |
|--------|-------------|
| `demo-llm-vision.py` | **LLM-driven universal automation** — works with any search engine, no hardcoded selectors. LLM reads page DOM and decides what to click. |
| `demo-baidu.py` | Baidu search demo — hardcoded selectors |
| `demo-duckduckgo.py` | DuckDuckGo search demo — hardcoded selectors |
## demo-llm-vision.py
The main demo. Uses a layered architecture where each component does what it's best at:
```
LLM reads HTML → returns CSS selectors → DOM locates elements → CDP clicks
```
- **Playwright**: Opens pages, extracts DOM, keyboard input
- **LLM**: Reads page structure, returns CSS selectors for target elements (any cheap text model works)
- **DOM**: Uses LLM's selectors to get precise bounding boxes
- **CDP**: Chrome DevTools Protocol mouse events (`isTrusted=true`) for clicking
No hardcoded selectors — LLM figures out the page structure dynamically. Works with Google, Bing, Baidu, DuckDuckGo, Sogou, and any other search engine.
### Key Features
- **Concurrent LLM Race**: DOM is split into chunks, sent to LLM concurrently. First valid response wins — faster than sequential.
- **CDP Click**: Uses `Input.dispatchMouseEvent` via Chrome DevTools Protocol. Coordinates match `bounding_box()` exactly, no offset issues.
- **Ctrl+Click New Tab**: Search results open in new tabs, keeping the results list intact for clicking more links.
- **Fallback Chain**: CDP click → PyAutoGUI OS-level click → Playwright `.click()` → form submit. Always gets through.
### Environment Variables
| Variable | Description |
|----------|-------------|
| `LLM_API_KEY` | API key for the LLM service |
| `LLM_API_BASE` | OpenAI-compatible endpoint URL |
| `LLM_MODEL` | Model name (e.g. `gpt-4o-mini`) |
### Quick Start
```bash
# Start the container
docker run -d --name chrome-test \
--platform linux/amd64 \
-p 6080:6080 \
yaoapp/sandbox-claude-chrome:latest
# Wait for VNC to start
sleep 5
# Copy the script
docker cp tests/demo-llm-vision.py chrome-test:/workspace/
# Run with any search engine
docker exec \
-e LLM_API_KEY="your-key" \
-e LLM_API_BASE="https://api.openai.com/v1/" \
-e LLM_MODEL="gpt-4o-mini" \
chrome-test bash -c \
'DISPLAY=:99 python3 /workspace/demo-llm-vision.py "https://www.bing.com" "Yao App Engine"'
```
Open `http://localhost:6080` in your browser to watch the automation in real-time via VNC.
### Tested Search Engines
| Engine | Status | Notes |
|--------|--------|-------|
| Bing | Passed | gpt-4o-mini, ~100s |
| Sogou | Passed | gpt-4o-mini, ~83s |
| DuckDuckGo | Passed | gpt-4o-mini, ~87s |
| Baidu | Passed | glm-4-7, ~160s |
| Google | Passed | May show CAPTCHA on shared IPs |
### Flow
```
Phase 1 Open search engine homepage
Phase 2 [LLM Race] Analyze homepage DOM → get input/button selectors
Phase 3 [CDP] Click search input, type query
Phase 4 [CDP] Click search button (fallback: Enter key → form submit)
Phase 5 [LLM Race] Analyze results page DOM → get link selector
Phase 7+ [CDP Ctrl+Click] Open results in new tabs, screenshot, close
```
## Screenshots
Each demo saves screenshots to `/workspace/` at key steps:
| File | Content |
|------|---------|
| `llm-01-homepage.png` | Search engine homepage |
| `llm-02-typed.png` | Query typed in search box |
| `llm-03-results.png` | Search results page |
| `llm-detail.png` | Result detail page (new tab) |
## Notes
- **Google** may show reCAPTCHA due to IP-based rate limiting. Use a clean IP or proxy.
- **Model choice**: `gpt-4o-mini` recommended for speed. Slower models (e.g. `glm-4-7`) may timeout on large DOMs.
- **Concurrent Race** splits DOM into ~2000-char chunks and sends all chunks + full DOM to LLM simultaneously. First valid JSON response wins.