panoptical
Version:
A modern testing tool that makes Playwright easy to use with simple YAML syntax
764 lines (598 loc) • 21.5 kB
Markdown
# Playwright Made Simple, Testing Made Delightful
**A modern, unified browser automation tool that makes Playwright easy to use with simple YAML syntax.**
[](https://opensource.org/licenses/MIT)
[](https://nodejs.org/)
[](https://playwright.dev/)
[](https://www.npmjs.com/package/panoptical)
[](https://www.npmjs.com/package/panoptical)

## **Documentation**
**[Full Documentation](https://panoptical.dev)** - Comprehensive guides, examples, and API reference
**[Getting Started](https://panoptical.dev/docs/getting-started)** - Write your first test in minutes
**[Examples](https://panoptical.dev/docs/examples/basic-testing)** - Real-world test scenarios
**[CLI Reference](https://panoptical.dev/docs/cli/commands)** - Complete command reference
## **What is Panoptical?**
**Panoptical is a testing tool that makes Playwright easy to use.** Instead of writing complex JavaScript code, you write simple YAML files that Panoptical converts into Playwright commands.
### **Why Use Panoptical Instead of Raw Playwright?**
**Raw Playwright (Complex JavaScript):**
```javascript
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
await page.click('#button');
await page.screenshot({path: 'test.png'});
await browser.close();
```
**Panoptical (Simple YAML):**
```yaml
test: 'Simple Test'
steps:
- goto: 'https://example.com'
- click: '#button'
- snapshot: 'test'
```
**Panoptical gives you:**
- **Simple YAML syntax** - No JavaScript coding required
- **Auto-healing selectors** - Automatically fix failing selectors
- **Professional CLI** - Clean, colored output with human-readable timing
- **Built-in reliability** - Auto-retries, failure screenshots
- **Playwright's power** - All the browser automation capabilities
- **Advanced Features** - High-level automation methods that make testing delightful
- **Test Report Management** - Clean up and organize test data automatically
## **Advanced Features That Make Testing Delightful**
Panoptical includes **powerful automation methods** that transform it from a basic tool into a **high-level testing framework**. These features make complex testing scenarios simple and enjoyable:
### **Beautiful Test Reports**
- **Web Dashboard** - Beautiful, interactive reports accessible via browser
- **Real-time Updates** - Live data that refreshes automatically
- **Interactive Charts** - Visual test results and performance trends
- **Flakiness Analysis** - Built-in integration with test reliability metrics
- **Team Collaboration** - Share dashboards with your development team
- **Test Data Cleanup** - Remove orphaned tests and manage report data
### **Core Browser Actions**
- **`login`** - Smart authentication with automatic verification
- **`logout`** - Clean session management with verification
- **`goto_with_auth`** - Navigate to protected pages with auth tokens
- **`wait`** - Unified wait action for elements or text with configurable timeout
- **`click_if_visible`** - Smart clicking that won't fail
- **`fill`** - Fast form filling (instant text insertion)
- **`type`** - Realistic typing simulation with configurable delays
### **UI Interaction Helpers**
- **`select_from_dropdown`** - Human-friendly dropdown selection by text
- **`hover_and_click`** - Complex menu navigation made simple
- **`upload_file`** - File upload with automatic verification
- **`download_and_verify`** - Download and verify file contents
- **`take_screenshot`** - Named screenshots for better debugging
### **Data & Verification**
- **`verify_table_row`** - Verify table data without complex selectors
- **`assert_element_count`** - Check element quantities with operators
- **`check_api_response`** - API testing from UI tests
- **`assert_element_not_present`** - Verify elements are removed
- **`measure_performance`** - Built-in performance monitoring
### **Flow Control**
- **`repeat`** - Loop through actions multiple times
- **`run_if`** - Conditional execution based on conditions
- **`store_text`** - Save values in variables for later use
- **`compare_values`** - Compare values with flexible operators
- **`random_fill`** - Generate random test data automatically
### **Mobile & Responsive Testing**
- **`resize_viewport`** - Test responsive design with custom dimensions
- **`swipe`** - Perform swipe gestures (left, right, up, down)
- **`tap`** - Simulate mobile tap interactions
### **Advanced Element Interactions**
- **`drag_and_drop`** - Drag elements to targets with precision
- **`multi_select`** - Select multiple options from checkboxes/dropdowns
- **`press_keys`** - Keyboard shortcuts and key combinations
- **`scroll_to_element`** - Scroll to make elements visible
- **`hover_element`** - Hover interactions with configurable duration
- **`iframe_action`** - Perform actions inside iframes (click, type, get_text, evaluate, etc.)
## **Quick Start**
### **Installation**
**Prerequisites:**
- Node.js 18+
- npm or pnpm
#### **Option 1: NPM Package (Recommended for users)**
```bash
# Install globally for CLI usage
npm install -g panoptical
# Or install locally in your project
npm install --save-dev panoptical
```
#### **Option 2: Development Setup (for contributors)**
```bash
# Clone the repository
git clone https://github.com/PanopticalJS/panoptical.git
cd panoptical
# Install dependencies
pnpm install
# Install Playwright browsers
pnpm exec playwright install
# Make Panoptical globally available
pnpm link --global
```
### **Quick Start**
```bash
# With npm package (global installation)
panoptical run tests
# With npm package (local installation)
npx panoptical run tests
# With development setup
pnpm start
```
### **Your First Test**
Create `tests/example.yaml`:
```yaml
test: "Simple Login Test"
description: "Test user authentication flow"
steps:
- goto: "https://example.com/login"
- wait:
selector: "#username"
- fill:
selector: "#username"
text: "testuser"
- fill:
selector: "#password"
text: "password123"
- click: "#login-button"
- expect:
selector: "#dashboard"
text: "Welcome"
```
### **Advanced Test Example**
```yaml
test: 'Advanced User Journey'
steps:
# Smart login with verification
- login:
username: 'test@example.com'
password: 'password123'
usernameSelector: '#email'
passwordSelector: '#password'
successIndicator: '.dashboard'
# Wait for welcome message
- wait:
text: 'Welcome back'
timeout: 5000
# Fill form with random data
- random_fill:
formData:
'#first-name': 'firstName'
'#email': 'email'
'#company': 'company'
# Verify table data
- verify_table_row:
tableSelector: '#users-table'
expectedRow:
'Name': 'John Doe'
'Role': 'User'
```
### **Mobile & Advanced Interactions Example**
```yaml
test: 'Mobile E-commerce Test'
steps:
# Test responsive design
- resize_viewport:
width: 375
height: 667
device: 'iPhone SE'
# Navigate and interact
- goto: 'https://store.example.com'
- swipe:
selector: '.product-carousel'
direction: 'left'
distance: 200
# Advanced interactions
- drag_and_drop:
source: '#product-item'
target: '#shopping-cart'
- multi_select:
selector: '.size-options'
options: ['Small', 'Medium']
- press_keys:
keys: ['Control', 'A']
targetSelector: '#search-input'
- scroll_to_element:
selector: '#checkout-button'
- hover_element:
selector: '.tooltip-trigger'
duration: 2000
```
### **Fill vs Type Actions Example**
```yaml
test: 'Form Input Testing Demo'
description: 'Demonstrates the difference between fill and type actions'
steps:
- goto: 'https://example.com/form'
# Fast form filling for efficiency
- fill:
selector: '#email'
text: 'user@example.com'
- fill:
selector: '#name'
text: 'John Doe'
# Realistic typing simulation
- type:
selector: '#message'
text: 'This text is typed character by character'
delay: 150 # 150ms delay between characters
# Even slower typing for dramatic effect
- type:
selector: '#notes'
text: 'Very slow typing simulation'
delay: 300 # 300ms delay between characters
```
### **Run the Test**
```bash
# Run with visible browser
panoptical run tests --headed
# Run in headless mode (default)
panoptical run tests
# Use specific browser
panoptical run tests --browser firefox
panoptical run tests --browser webkit
# Run a single test file
panoptical run tests/example.yaml --headed
```
## **Core Features**
### **1. Playwright Made Simple**
- **All Playwright browsers**: Chromium, Firefox, WebKit
- **All Playwright capabilities**: Navigation, clicking, typing, screenshots
- **Simple interface**: YAML instead of JavaScript
- **Same reliability**: Playwright's battle-tested automation
### **2. Simple YAML Syntax**
```yaml
# Navigation
- goto: "https://example.com"
# Interactions
- click: "#button"
- fill:
selector: "#input"
text: "Hello World"
- type:
selector: "#input"
text: "Hello World"
delay: 100 # Optional: customize typing delay (default: 100ms)
# Assertions
- expect:
selector: "#output"
text: "Success"
# Unified Waiting
- wait:
selector: "#element" # Wait for element to appear
- wait:
text: "Loading complete" # Wait for text to appear
- wait:
selector: "#slow-element"
timeout: 60000 # Custom timeout
# Screenshots
- snapshot: "test-result"
# Pausing
- pause: 2000
```
### **3. Built-in Reliability**
- **Auto-retries**: Automatic retry on navigation failures
- **Auto-healing selectors**: Automatically find alternative selectors when elements fail (experimental, disabled by default)
- **Smart waiting**: Intelligent element detection with timeouts
- **Error handling**: Clear, actionable error messages
- **Failure screenshots**: Automatic screenshots on test failures
### **4. Fill vs Type Actions**
Panoptical provides two different text input actions for different testing scenarios:
**`fill` Action - Fast Form Filling:**
```yaml
- fill:
selector: '#email'
text: 'user@example.com'
```
- Uses `page.fill()` for instant text insertion
- Perfect for form automation and fast testing
- No delays between characters
**`type` Action - Realistic Typing Simulation:**
```yaml
- type:
selector: '#email'
text: 'user@example.com'
delay: 100 # Optional: customize delay (default: 100ms)
```
- Uses `page.type()` with configurable delays
- Simulates human typing behavior
- Great for testing realistic user interactions
- Can customize the delay between characters
**Use Cases:**
- **`fill`**: When you want fast, efficient form filling for bulk testing
- **`type`**: When you want to test realistic user behavior, debug timing issues, or simulate human interaction patterns
### **5. Auto-healing Selectors (Experimental)**
Panoptical can automatically try to heal failing selectors using multiple strategies. **This feature is disabled by default** and should be used with caution.
**Enable auto-healing:**
```bash
# Command line flag
panoptical run tests --auto-healing
# Environment variable
export PANOPTICAL_AUTO_HEALING_ENABLED=true
panoptical run tests
# Configuration file (.panopticalrc.json)
{
"autoHealing": {
"enabled": true,
"strategies": ["text", "semantic", "partial", "aria", "data", "class", "parent-child"],
"maxAttempts": 3
}
}
```
**Healing Strategies:**
- **Text content matching**: Find elements by their text
- **Partial text matching**: Match elements with similar text
- **Semantic matching**: Understand action context (click vs fill)
- **ARIA attributes**: Use accessibility attributes as fallbacks
- **Data attributes**: Leverage test-specific attributes
- **Class patterns**: Try variations of CSS classes
- **Parent-child relationships**: Find elements within containers
**Warning**: Auto-healing can make tests slower and sometimes mask real selector issues. Use for experimentation and debugging, not for production reliability.
### **6. Screenshot Management**
```bash
# List all screenshots
panoptical screenshots list
# Clean old screenshots (keep last 10)
panoptical screenshots clean
# Force cleanup (remove all)
panoptical screenshots force-clean
# Clean by age (remove older than N days)
panoptical screenshots clean-old 7
```
### **7. Video Recording on Failure**
Panoptical can record videos during test execution and automatically save them only when tests fail:
```bash
# Enable video recording
panoptical run tests --video
# Or configure permanently
panoptical config set video.enabled true
```
**Video Features:**
- **Automatic recording**: Records all tests when enabled
- **Failure-only storage**: Only saves videos for failed tests
- **Automatic cleanup**: Deletes videos for passing tests
- **Configurable quality**: Set video dimensions and directory
- **Easy management**: CLI commands to list and clean videos
```bash
# List failure videos
panoptical videos list
# Clean old videos (keep last 10)
panoptical videos clean
# Force cleanup (remove all)
panoptical videos force-clean
# Clean by age (remove older than N days)
panoptical videos clean-old 7
```
**Video Configuration:**
```json
{
"video": {
"enabled": false,
"dir": "artifacts/videos",
"onlyOnFailure": true,
"size": {
"width": 1280,
"height": 720
}
}
}
```
### **8. Beautiful Test Reports**
Panoptical provides a beautiful, interactive web dashboard for viewing test results:
```bash
# Start reports server
panoptical reports
# Start on custom port
panoptical reports --port 3001
# Start and auto-open browser
panoptical reports --open
# Bind to all interfaces (for team access)
panoptical reports --host 0.0.0.0 --port 8080
```
**Reports Features:**
- **Interactive Dashboard**: Beautiful statistics and charts
- **Real-time Updates**: Data refreshes automatically every 30 seconds
- **Test Details**: Click any test to see detailed run history
- **Flakiness Analysis**: Built-in integration with reliability metrics
- **Responsive Design**: Works perfectly on all devices
- **Team Access**: Share dashboards with your development team
#### **Test Report Cleanup**
Manage and clean up test data to keep your reports organized:
```bash
# Remove orphaned tests (tests that no longer exist as YAML files)
panoptical reports clean orphaned
# Remove specific test and all its data
panoptical reports clean test <test-name>
# Remove all test data (WARNING: destructive)
panoptical reports clean all
# Skip confirmation prompts (useful for scripts)
panoptical reports clean orphaned --force
panoptical reports clean orphaned --yes
panoptical reports clean orphaned -y
```
**Cleanup Features:**
- **Orphaned Test Detection**: Automatically finds tests without YAML files
- **Recursive Directory Search**: Searches through subdirectories like `tests/demo-tests/`
- **Safe Operations**: Interactive confirmation prompts (can be skipped with force flags)
- **Data Consistency**: Updates both `runs.json` and `flakes.json`
- **Statistics Recalculation**: Automatically updates dashboard statistics after cleanup
- **Script-Friendly**: Force flags for automation and CI/CD pipelines
**When to Use Cleanup:**
- **Test Refactoring**: After renaming or moving test files
- **Project Cleanup**: Remove old test data during development
- **CI/CD Pipelines**: Automated cleanup with `--force` flag
- **Team Collaboration**: Keep reports focused on current tests
- **Performance**: Remove outdated data to improve dashboard speed
**Available Endpoints:**
- **Dashboard**: `http://localhost:3000` (or your custom port)
- **API Data**: `http://localhost:3000/api/test-data`
- **Test Details**: `http://localhost:3000/test/[test-name]`
**NPM Scripts:**
```bash
npm run reports # Start reports server
npm run reports:open # Start and open browser
```
## **Project Structure**
```
panoptical/
├── src/
│ ├── browser/ # Browser automation engine (Playwright wrapper)
│ │ ├── engine.js # Core browser control with auto-healing
│ │ └── compatibility.js # YAML interface compatibility layer
│ ├── cli.js # Command-line interface
│ ├── config.js # Configuration management
│ ├── core/ # Test execution engine & YAML parser
│ ├── flakiness/ # Test reliability analysis
│ ├── healing/ # Auto-healing selector system
│ └── utils/ # Utility functions (screenshots)
├── tests/ # Test files
│ └── test-page.html # Test HTML page
├── docs/ # Documentation (Docusaurus)
├── package.json # Dependencies & scripts
└── README.md # This file
```
## **Configuration**
### **Command Line Options**
```bash
# Browser selection
--browser chromium # Use Chromium (default)
--browser firefox # Use Firefox
--browser webkit # Use WebKit
# Visibility mode
--headed # Visible browser
--headless # Hidden browser (default)
# Performance
--timeout 30000 # Default timeout (ms)
--retries 3 # Retry attempts
```
### **Configuration File**
Create `.panopticalrc.json`:
```json
{
"browser": "chromium",
"headless": false,
"timeout": 30000,
"retries": 3
}
```
### **Environment Variables**
```bash
export PANOPTICAL_BROWSER=firefox
export PANOPTICAL_HEADLESS=true
export PANOPTICAL_TIMEOUT=60000
```
## **Advanced Testing**
### **Complex Test Scenarios**
```yaml
test: "E-commerce Checkout Flow"
description: "Complete purchase process testing"
setup:
- goto: "https://shop.example.com"
- wait:
selector: ".product-grid"
steps:
# Product selection
- click: ".product-card:first-child"
- wait:
selector: "#add-to-cart"
- click: "#add-to-cart"
# Cart management
- expect:
selector: "#cart-count"
text: "1"
- click: "#view-cart"
# Checkout process
- click: "#checkout-button"
- fill:
selector: "#email"
text: "test@example.com"
- fill:
selector: "#card-number"
text: "4242424242424242"
- click: "#complete-order"
# Success verification
- expect:
selector: "#success-message"
text: "Order confirmed"
teardown:
- goto: "https://shop.example.com"
```
### **Auto-healing in Action**
```yaml
test: "Auto-healing Demo"
description: "Demonstrates automatic selector healing"
steps:
# These selectors will fail but auto-healing will find alternatives
- goto: "https://example.com"
- click: "Login" # Auto-healing converts to text="Login"
- type:
selector: "Username" # Auto-healing finds the input field
text: "testuser"
```
## **Performance & Scale**
### **Test Execution**
```bash
# Run all tests in directory
panoptical run tests
# Run specific test file
panoptical run tests/smoke.yaml
# Run with different browsers
panoptical run tests --browser firefox
panoptical run tests --browser webkit
# Enable experimental features
panoptical run tests --auto-healing # Enable auto-healing
panoptical run tests --video # Enable video recording
```
## **Available Commands**
```bash
# Test execution
panoptical run <test-path> [options]
# Screenshot management
panoptical screenshots list
panoptical screenshots clean
panoptical screenshots force-clean
panoptical screenshots clean-old <days>
# Video management
panoptical videos list
panoptical videos clean
panoptical videos force-clean
panoptical videos clean-old <days>
# Reports and cleanup
panoptical reports # Start reports server
panoptical reports clean orphaned # Remove orphaned tests
panoptical reports clean test <name> # Remove specific test
panoptical reports clean all # Remove all test data
panoptical reports clean orphaned --force # Skip prompts
# Configuration
panoptical config show
panoptical config set <key> <value>
panoptical config create
# Flakiness analysis
panoptical analyze-flakes
# Help
panoptical help
```
## **Contributing**
We welcome contributions! Here's how to get started:
1. **Fork the repository**
2. **Create a feature branch**
3. **Make your changes**
4. **Submit a pull request**
### **Development Setup**
```bash
git clone <your-repo-url>
cd panoptical
pnpm install
pnpm exec playwright install
# Run tests
panoptical run tests
```
## **License**
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## **Acknowledgments**
- Built on top of [Playwright](https://playwright.dev/) for robust browser automation
- Inspired by modern testing frameworks and developer experience
- Community feedback and contributions
**Panoptical** - Playwright made simple with YAML. 🚀
**[Full Documentation](https://panoptical.dev)** | **[Report Issues](https://github.com/PanopticalJS/panoptical/issues)** | **[Discussions](https://github.com/PanopticalJS/panoptical/discussions)**