Automate Browser Testing with Playwright
Browser automation example demonstrating web application testing using Playwright in a headless environment for automated quality assurance workflows.
Why it matters
Streamline your web application testing by automating browser interactions. This asset leverages Playwright to execute tests in a headless browser environment, ensuring consistent and efficient validation of your web UIs.
Outcomes
What it gets done
Drive browser actions for automated testing.
Scrape web page data for verification.
Write and execute browser-based tests.
Integrate with Playwright for robust automation.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/pfoo-headless | bash Capabilities
What this chain does
Controls a real browser to automate web workflows.
Fetches and parses content from web pages.
Creates unit, integration, or end-to-end test cases.
Overview
Headless
What it does
This is a browser automation example that demonstrates how to test web applications using Playwright. It provides a working implementation of headless browser testing, showing how to structure automated test scenarios for web application quality assurance.
How it connects
Use this example when you need to understand how to implement automated browser testing with Playwright, or when you want a reference implementation for headless web application testing workflows. It's ideal for developers setting up continuous integration testing pipelines or learning browser automation patterns.
Source README
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 |
Additional Resources
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.