C4A-Script API Reference
Complete reference for all C4A-Script commands, syntax, and advanced features.
Command Categories
๐งญ Navigation Commands
Navigate between pages and manage browser history.
GO <url>
Navigate to a specific URL.
Syntax:
Parameters:
- url
- Target URL (string)
Examples:
Notes: - Supports both absolute and relative URLs - Automatically handles protocol detection - Waits for page load to complete
RELOAD
Refresh the current page.
Syntax:
Examples:
Notes: - Equivalent to pressing F5 or clicking browser refresh - Waits for page reload to complete - Preserves current URL
BACK
Navigate back in browser history.
Syntax:
Examples:
Notes: - Equivalent to clicking browser back button - Does nothing if no previous page exists - Waits for navigation to complete
FORWARD
Navigate forward in browser history.
Syntax:
Examples:
Notes: - Equivalent to clicking browser forward button - Does nothing if no next page exists - Waits for navigation to complete
โฑ๏ธ Wait Commands
Control timing and synchronization with page elements.
WAIT <time>
Wait for a specified number of seconds.
Syntax:
Parameters:
- seconds
- Number of seconds to wait (number)
Examples:
Notes: - Accepts decimal values - Useful for giving dynamic content time to load - Non-blocking for other browser operations
WAIT <selector> <timeout>
Wait for an element to appear on the page.
Syntax:
Parameters:
- selector
- CSS selector for the element (string in backticks)
- timeout
- Maximum seconds to wait (number)
Examples:
WAIT `#content` 10
WAIT `.loading-spinner` 5
WAIT `button[type="submit"]` 15
WAIT `.results .item:first-child` 8
Notes: - Fails if element doesn't appear within timeout - More reliable than fixed time waits - Supports complex CSS selectors
WAIT "<text>" <timeout>
Wait for specific text to appear anywhere on the page.
Syntax:
Parameters:
- text
- Text content to wait for (string in quotes)
- timeout
- Maximum seconds to wait (number)
Examples:
Notes: - Case-sensitive text matching - Searches entire page content - Useful for dynamic status messages
๐ฑ๏ธ Mouse Commands
Simulate mouse interactions and movements.
CLICK <selector>
Click on an element specified by CSS selector.
Syntax:
Parameters:
- selector
- CSS selector for the element (string in backticks)
Examples:
CLICK `#submit-button`
CLICK `.menu-item:first-child`
CLICK `button[data-action="save"]`
CLICK `a[href="/dashboard"]`
Notes: - Waits for element to be clickable - Scrolls element into view if necessary - Handles overlapping elements intelligently
CLICK <x> <y>
Click at specific coordinates on the page.
Syntax:
Parameters:
- x
- X coordinate in pixels (number)
- y
- Y coordinate in pixels (number)
Examples:
Notes: - Coordinates are relative to viewport - Useful when element selectors are unreliable - Consider responsive design implications
DOUBLE_CLICK <selector>
Double-click on an element.
Syntax:
Parameters:
- selector
- CSS selector for the element (string in backticks)
Examples:
Notes: - Triggers dblclick event - Common for opening files or editing inline content - Timing between clicks is automatically handled
RIGHT_CLICK <selector>
Right-click on an element to open context menu.
Syntax:
Parameters:
- selector
- CSS selector for the element (string in backticks)
Examples:
Notes: - Opens browser/application context menu - Useful for testing context menu interactions - May be blocked by some applications
SCROLL <direction> <amount>
Scroll the page in a specified direction.
Syntax:
Parameters:
- direction
- Direction to scroll: UP
, DOWN
, LEFT
, RIGHT
- amount
- Number of pixels to scroll (number)
Examples:
Notes: - Smooth scrolling animation - Useful for infinite scroll pages - Amount can be larger than viewport
MOVE <x> <y>
Move mouse cursor to specific coordinates.
Syntax:
Parameters:
- x
- X coordinate in pixels (number)
- y
- Y coordinate in pixels (number)
Examples:
Notes: - Triggers hover effects - Useful for testing mouseover interactions - Does not click, only moves cursor
DRAG <x1> <y1> <x2> <y2>
Drag from one point to another.
Syntax:
Parameters:
- x1
, y1
- Starting coordinates (numbers)
- x2
, y2
- Ending coordinates (numbers)
Examples:
Notes: - Simulates click, drag, and release - Useful for sliders, resizing, reordering - Smooth drag animation
โจ๏ธ Keyboard Commands
Simulate keyboard input and key presses.
TYPE "<text>"
Type text into the currently focused element.
Syntax:
Parameters:
- text
- Text to type (string in quotes)
Examples:
Notes: - Requires an input element to be focused - Types character by character with realistic timing - Supports special characters and Unicode
TYPE $<variable>
Type the value of a variable.
Syntax:
Parameters:
- variable
- Variable name (without quotes)
Examples:
Notes: - Variable must be defined with SETVAR first - Variable values are strings - Useful for reusable credentials or data
PRESS <key>
Press and release a special key.
Syntax:
Parameters:
- key
- Key name (see supported keys below)
Supported Keys:
- Tab
, Enter
, Escape
, Space
- ArrowUp
, ArrowDown
, ArrowLeft
, ArrowRight
- Delete
, Backspace
- Home
, End
, PageUp
, PageDown
Examples:
Notes: - Simulates actual key press and release - Useful for form navigation and shortcuts - Case-sensitive key names
KEY_DOWN <key>
Hold down a modifier key.
Syntax:
Parameters:
- key
- Modifier key: Shift
, Control
, Alt
, Meta
Examples:
Notes: - Must be paired with KEY_UP - Useful for key combinations - Meta key is Cmd on Mac, Windows key on PC
KEY_UP <key>
Release a modifier key.
Syntax:
Parameters:
- key
- Modifier key: Shift
, Control
, Alt
, Meta
Examples:
Notes: - Must be paired with KEY_DOWN - Releases the specified modifier key - Good practice to always release held keys
CLEAR <selector>
Clear the content of an input field.
Syntax:
Parameters:
- selector
- CSS selector for input element (string in backticks)
Examples:
Notes: - Works with input, textarea elements - Faster than selecting all and deleting - Triggers appropriate change events
SET <selector> "<value>"
Set the value of an input field directly.
Syntax:
Parameters:
- selector
- CSS selector for input element (string in backticks)
- value
- Value to set (string in quotes)
Examples:
SET `#email` "user@example.com"
SET `#age` "25"
SET `textarea#message` "Hello, this is a test message."
Notes: - Directly sets value without typing animation - Faster than TYPE for long text - Triggers change and input events
๐ Control Flow Commands
Add conditional logic and loops to your scripts.
IF (EXISTS <selector>) THEN <command>
Execute command if element exists.
Syntax:
Parameters:
- selector
- CSS selector to check (string in backticks)
- command
- Command to execute if condition is true
Examples:
IF (EXISTS `.cookie-banner`) THEN CLICK `.accept-cookies`
IF (EXISTS `#popup-modal`) THEN CLICK `.close-button`
IF (EXISTS `.error-message`) THEN RELOAD
Notes: - Checks for element existence at time of execution - Does not wait for element to appear - Can be combined with ELSE
IF (EXISTS <selector>) THEN <command> ELSE <command>
Execute command based on element existence.
Syntax:
Parameters:
- selector
- CSS selector to check (string in backticks)
- First command
- Execute if condition is true
- Second command
- Execute if condition is false
Examples:
IF (EXISTS `.user-menu`) THEN CLICK `.logout` ELSE CLICK `.login`
IF (EXISTS `.loading`) THEN WAIT 5 ELSE CLICK `#continue`
Notes: - Exactly one command will be executed - Useful for handling different page states - Commands must be on same line
IF (NOT EXISTS <selector>) THEN <command>
Execute command if element does not exist.
Syntax:
Parameters:
- selector
- CSS selector to check (string in backticks)
- command
- Command to execute if element doesn't exist
Examples:
Notes: - Inverse of EXISTS condition - Useful for error handling - Can check for missing required elements
IF (<javascript>) THEN <command>
Execute command based on JavaScript condition.
Syntax:
Parameters:
- javascript
- JavaScript expression that returns boolean (string in backticks)
- command
- Command to execute if condition is true
Examples:
IF (`window.innerWidth < 768`) THEN CLICK `.mobile-menu`
IF (`document.readyState === "complete"`) THEN CLICK `#start`
IF (`localStorage.getItem("user")`) THEN GO /dashboard
Notes: - JavaScript executes in browser context - Must return boolean value - Access to all browser APIs and globals
REPEAT (<command>, <count>)
Repeat a command a specific number of times.
Syntax:
Parameters:
- command
- Command to repeat
- count
- Number of times to repeat (number)
Examples:
Notes: - Executes command exactly count times - Useful for pagination, scrolling, navigation - No delay between repetitions (add WAIT if needed)
REPEAT (<command>, <condition>)
Repeat a command while condition is true.
Syntax:
Parameters:
- command
- Command to repeat
- condition
- JavaScript condition to check (string in backticks)
Examples:
REPEAT (SCROLL DOWN 500, `document.querySelector(".load-more")`)
REPEAT (PRESS ArrowDown, `window.scrollY < document.body.scrollHeight`)
Notes: - Condition checked before each iteration - JavaScript condition must return boolean - Be careful to avoid infinite loops
๐พ Variables and Data
Store and manipulate data within scripts.
SETVAR <name> = "<value>"
Create or update a variable.
Syntax:
Parameters:
- name
- Variable name (alphanumeric, underscore)
- value
- Variable value (string in quotes)
Examples:
SETVAR username = "john@example.com"
SETVAR password = "secret123"
SETVAR base_url = "https://api.example.com"
SETVAR counter = "0"
Notes: - Variables are global within script scope - Values are always strings - Can be used with TYPE command using $variable syntax
EVAL <javascript>
Execute arbitrary JavaScript code.
Syntax:
Parameters:
- javascript
- JavaScript code to execute (string in backticks)
Examples:
EVAL `console.log("Script started")`
EVAL `window.scrollTo(0, 0)`
EVAL `localStorage.setItem("test", "value")`
EVAL `document.title = "Automated Test"`
Notes: - Full access to browser JavaScript APIs - Useful for custom logic and debugging - Return values are not captured - Be careful with security implications
๐ Comments and Documentation
# <comment>
Add comments to scripts for documentation.
Syntax:
Examples:
# This script logs into the application
# Step 1: Navigate to login page
GO /login
# Step 2: Fill credentials
TYPE "user@example.com"
Notes: - Comments are ignored during execution - Useful for documentation and debugging - Can appear anywhere in script - Supports multi-line documentation blocks
๐ง Procedures (Advanced)
Define reusable command sequences.
PROC <name> ... ENDPROC
Define a reusable procedure.
Syntax:
Parameters:
- name
- Procedure name (alphanumeric, underscore)
- commands
- Commands to include in procedure
Examples:
PROC login
CLICK `#email`
TYPE $email
CLICK `#password`
TYPE $password
CLICK `#submit`
ENDPROC
PROC handle_popups
IF (EXISTS `.cookie-banner`) THEN CLICK `.accept`
IF (EXISTS `.newsletter-modal`) THEN CLICK `.close`
ENDPROC
Notes: - Procedures must be defined before use - Support nested command structures - Variables are shared with main script scope
<procedure_name>
Call a defined procedure.
Syntax:
Examples:
Notes: - Procedure must be defined before calling - Can be called multiple times - No parameters supported (use variables instead)
Error Handling Best Practices
1. Always Use Waits
# Bad - element might not be ready
CLICK `#button`
# Good - wait for element first
WAIT `#button` 5
CLICK `#button`
2. Handle Optional Elements
# Check before interacting
IF (EXISTS `.popup`) THEN CLICK `.close`
IF (EXISTS `.cookie-banner`) THEN CLICK `.accept`
# Then proceed with main flow
CLICK `#main-action`
3. Use Descriptive Variables
# Set up reusable data
SETVAR admin_email = "admin@company.com"
SETVAR test_password = "TestPass123!"
SETVAR staging_url = "https://staging.example.com"
# Use throughout script
GO $staging_url
TYPE $admin_email
4. Add Debugging Information
# Log progress
EVAL `console.log("Starting login process")`
GO /login
# Verify page state
IF (`document.title.includes("Login")`) THEN EVAL `console.log("On login page")`
# Continue with login
TYPE $username
Common Patterns
Login Flow
# Complete login automation
SETVAR email = "user@example.com"
SETVAR password = "mypassword"
GO /login
WAIT `#login-form` 5
# Handle optional cookie banner
IF (EXISTS `.cookie-banner`) THEN CLICK `.accept-cookies`
# Fill and submit form
CLICK `#email`
TYPE $email
PRESS Tab
TYPE $password
CLICK `button[type="submit"]`
# Wait for redirect
WAIT `.dashboard` 10
Infinite Scroll
# Load all content with infinite scroll
GO /products
# Scroll and load more content
REPEAT (SCROLL DOWN 500, `document.querySelector(".load-more")`)
# Alternative: Fixed number of scrolls
REPEAT (SCROLL DOWN 800, 10)
WAIT 2
Form Validation
# Handle form with validation
SET `#email` "invalid-email"
CLICK `#submit`
# Check for validation error
IF (EXISTS `.error-email`) THEN SET `#email` "valid@example.com"
# Retry submission
CLICK `#submit`
WAIT `.success-message` 5
Multi-step Process
# Complex multi-step workflow
PROC navigate_to_step
CLICK `.next-button`
WAIT `.step-content` 5
ENDPROC
# Step 1
WAIT `.step-1` 5
SET `#name` "John Doe"
navigate_to_step
# Step 2
SET `#email` "john@example.com"
navigate_to_step
# Step 3
CLICK `#submit-final`
WAIT `.confirmation` 10
Integration with Crawl4AI
Use C4A-Script with Crawl4AI for dynamic content interaction:
from crawl4ai import AsyncWebCrawler, CrawlerRunConfig
# Define interaction script
script = """
# Handle dynamic content loading
WAIT `.content` 5
IF (EXISTS `.load-more-button`) THEN CLICK `.load-more-button`
WAIT `.additional-content` 5
# Accept cookies if needed
IF (EXISTS `.cookie-banner`) THEN CLICK `.accept-all`
"""
config = CrawlerRunConfig(
c4a_script=script,
wait_for=".content",
screenshot=True
)
async with AsyncWebCrawler() as crawler:
result = await crawler.arun("https://example.com", config=config)
print(result.markdown)
This reference covers all available C4A-Script commands and patterns. For interactive learning, try the tutorial or live demo.