0d3cb498a3
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Waiting to run
Test and Publish Multi-arch Docker Image / test (push) Waiting to run
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Blocked by required conditions
Validate Renovate Config / Validate Renovate Configuration (push) Waiting to run
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
integration-browser/headless (Headless Browser Automation)
A browser automation example demonstrating how to test web applications using Playwright.
You can run this example with:
npx promptfoo@latest init --example integration-browser/headless
cd integration-browser/headless
Overview
This example demonstrates how to:
- Test a local Gradio application using browser automation
- Handle dynamic JavaScript-rendered content
- Extract data from web interfaces
- Work with complex UI interactions (forms, tabs, buttons)
Prerequisites
Ensure you have Python 3 and Node.js installed on your system.
- Install Node.js dependencies:
npm install playwright @playwright/browser-chromium playwright-extra puppeteer-extra-plugin-stealth
- Install Python dependencies (for the demo application):
pip install -r requirements.txt
That's it! No additional setup scripts or configuration needed.
Running the Example
- Start the Gradio demo application:
python gradio_demo.py
This starts a local server at http://localhost:7860
- Run the browser automation tests:
npx promptfoo@latest eval -c promptfooconfig.yaml
- View the results:
npx promptfoo@latest view
Test Results
Chatbot Example
The main configuration (promptfooconfig.yaml) tests a chatbot interface with a 100% pass rate:
┌─────────────────────────────────────────────────┬─────────────────────────────────────────────────┐
│ topic │ [browser-provider] Tell me about {{topic}} │
├─────────────────────────────────────────────────┼─────────────────────────────────────────────────┤
│ testing browser automation │ [PASS] Test successful! The browser automation │
│ │ is working correctly. │
├─────────────────────────────────────────────────┼─────────────────────────────────────────────────┤
│ how the system works │ [PASS] I received your message: 'Tell me about │
│ │ how the system works'. This is a simple demo │
│ │ response! │
├─────────────────────────────────────────────────┼─────────────────────────────────────────────────┤
│ a simple greeting │ [PASS] I received your message: 'Tell me about │
│ │ a simple greeting'. This is a simple demo │
│ │ response! │
└─────────────────────────────────────────────────┴─────────────────────────────────────────────────┘
Calculator Example
The calculator-example.yaml demonstrates form interactions with a 100% pass rate:
┌───────────────────┬───────────────────┬───────────────────┬───────────────────┬───────────────────┐
│ num1 │ num2 │ operation │ operationSelector │ [browser-provider]│
├───────────────────┼───────────────────┼───────────────────┼───────────────────┼───────────────────┤
│ 10 │ 5 │ Add │ #operation │ [PASS] Calculator │
│ │ │ │ label:nth-child(1)│ interaction │
│ │ │ │ │ successful │
├───────────────────┼───────────────────┼───────────────────┼───────────────────┼───────────────────┤
│ 20 │ 4 │ Multiply │ #operation │ [PASS] Calculator │
│ │ │ │ label:nth-child(3)│ interaction │
│ │ │ │ │ successful │
└───────────────────┴───────────────────┴───────────────────┴───────────────────┴───────────────────┘
This example demonstrates:
- Navigate between tabs in a web application
- Fill multiple input fields
- Select radio button options
- Click buttons and wait for results
- Extract and verify content from the page
Configuration Details
The example configurations demonstrate key concepts:
- Appropriate delays: 2-3 seconds between actions for reliability
- Local testing: Tests run against localhost:7860
- Error handling: Uses
transformResponsefor data extraction - Clear assertions: Validates expected outputs
Selectors Used
The Gradio application provides consistent selectors:
textarea[data-testid="textbox"]- Message input fieldbutton#submit-button- Submit buttondiv[data-testid="bot"]:last-of-type .prose- Latest bot responsebutton[value="calculator"]- Calculator tab buttoninput[type="radio"]- Operation selection
Adapting This Example
Testing Your Own Application
- Update the
urlin the navigation step - Modify selectors to match your UI elements
- Adjust wait times based on your application's response time
- Add appropriate assertions for your use case
Handling Dynamic Content
For single-page applications or AJAX content:
- action: waitForNewChildren
args:
parentSelector: '#results-container'
timeout: 10000
Complex Interactions
Chain multiple actions for sophisticated workflows:
steps:
- action: navigate
args:
url: 'http://localhost:3000'
- action: click
args:
selector: '#menu-button'
- action: wait
args:
ms: 1000
- action: click
args:
selector: '#dropdown-option-2'
Debugging Tips
| Issue | Solution |
|---|---|
| Elements not found | Use browser DevTools to verify selectors |
| Timing issues | Increase wait times or use waitForNewChildren |
| Want to see the browser | Set headless: false in the configuration |
| Need detailed logs | Run with npx promptfoo@latest eval --verbose |