C4A-Script API 参考

所有 C4A-Script 命令、语法和高级功能的完整参考。

命令类别

在页面之间导航并管理浏览器历史记录。

GO <url>

导航到特定的 URL。

句法:

GO <url>

参数: -url - 目标 URL(字符串)

例子:

GO https://example.com
GO https://api.example.com/login
GO /relative/path

注意: - 支持绝对和相对 URL - 自动处理协议检测 - 等待页面加载完成


RELOAD

刷新当前页面。

句法:

RELOAD

例子:

RELOAD

注意: - 相当于按 F5 或单击浏览器刷新 - 等待页面重新加载完成 - 保留当前 URL


BACK

在浏览器历史记录中返回。

句法:

BACK

例子:

BACK

注意: - 相当于单击浏览器后退按钮 - 如果不存在上一页则不执行任何操作 - 等待导航完成


FORWARD

在浏览器历史记录中向前导航。

句法:

FORWARD

例子:

FORWARD

注意: - 相当于单击浏览器前进按钮 - 如果不存在下一页则不执行任何操作 - 等待导航完成

⏱️等待命令

控制时间和与页面元素的同步。

WAIT <time>

等待指定的秒数。

句法:

WAIT <seconds>

参数: -seconds - 等待的秒数(数字)

例子:

WAIT 3
WAIT 1.5
WAIT 10

注意: - 接受十进制值 - 有助于为动态内容提供加载时间 - 不阻塞其他浏览器操作


WAIT <selector> <timeout>

等待元素出现在页面上。

句法:

WAIT `<selector>` <timeout>

参数: -selector - 元素的 CSS 选择器(反引号中的字符串)-timeout - 等待的最大秒数(数字)

例子:

WAIT `#content` 10
WAIT `.loading-spinner` 5
WAIT `button[type="submit"]` 15
WAIT `.results .item:first-child` 8

注意: - 如果元素在超时时间内未出现,则失败 - 比固定时间等待更可靠 - 支持复杂的 CSS 选择器


WAIT "<text>" <timeout>

等待特定文本出现在页面上的任何位置。

句法:

WAIT "<text>" <timeout>

参数: -text - 等待的文本内容(引号中的字符串) -timeout - 等待的最大秒数(数字)

例子:

WAIT "Loading complete" 10
WAIT "Welcome back" 5
WAIT "Search results" 15

注意: - 区分大小写的文本匹配 - 搜索整个页面内容 - 适用于动态状态消息

🖱️ 鼠标命令

模拟鼠标交互和移动。

CLICK <selector>

单击 CSS 选择器指定的元素。

句法:

CLICK `<selector>`

参数: -selector - 元素的 CSS 选择器(反引号中的字符串)

例子:

CLICK `#submit-button`
CLICK `.menu-item:first-child`
CLICK `button[data-action="save"]`
CLICK `a[href="/dashboard"]`

注意: - 等待元素可点击 - 必要时将元素滚动到视图中 - 智能处理重叠元素


CLICK <x> <y>

单击页面上的特定坐标。

句法:

CLICK <x> <y>

参数: -x - X 坐标(像素)(数字)-y - Y 坐标(像素)(数字)

例子:

CLICK 100 200
CLICK 500 300
CLICK 0 0

注意: - 坐标相对于视口 - 当元素选择器不可靠时有用 - 考虑响应式设计的影响


DOUBLE_CLICK <selector>

双击一个元素。

句法:

DOUBLE_CLICK `<selector>`

参数: -selector - 元素的 CSS 选择器(反引号中的字符串)

例子:

DOUBLE_CLICK `.file-icon`
DOUBLE_CLICK `#editable-cell`
DOUBLE_CLICK `.expandable-item`

注意: - 触发 dblclick 事件 - 常用于打开文件或编辑内联内容 - 自动处理点击之间的时间


RIGHT_CLICK <selector>

右键单击元素以打开上下文菜单。

句法:

RIGHT_CLICK `<selector>`

参数: -selector - 元素的 CSS 选择器(反引号中的字符串)

例子:

RIGHT_CLICK `#context-target`
RIGHT_CLICK `.menu-trigger`
RIGHT_CLICK `img.thumbnail`

注意: - 打开浏览器/应用程序上下文菜单 - 用于测试上下文菜单交互 - 可能被某些应用程序阻止


SCROLL <direction> <amount>

沿指定方向滚动页面。

句法:

SCROLL <direction> <amount>

参数: -direction - 滚动方向:UPDOWNLEFTRIGHT -amount - 滚动的像素数(数字)

例子:

SCROLL DOWN 500
SCROLL UP 200
SCROLL LEFT 100
SCROLL RIGHT 300

注意: - 平滑滚动动画 - 适用于无限滚动页面 - 数量可以大于视口


MOVE <x> <y>

将鼠标光标移动到特定坐标。

句法:

MOVE <x> <y>

参数: -x - X 坐标(像素)(数字)-y - Y 坐标(像素)(数字)

例子:

MOVE 200 100
MOVE 500 400

注意: - 触发悬停效果 - 用于测试鼠标悬停交互 - 不点击,仅移动光标


DRAG <x1> <y1> <x2> <y2>

从一个点拖动到另一个点。

句法:

DRAG <x1> <y1> <x2> <y2>

参数: -x1y1 - 起始坐标(数字) -x2y2 - 结束坐标(数字)

例子:

DRAG 100 100 500 300
DRAG 0 200 400 200

注意: - 模拟点击、拖动和释放 - 适用于滑块、调整大小、重新排序 - 平滑的拖动动画

⌨️ 键盘命令

模拟键盘输入和按键。

TYPE "<text>"

在当前焦点元素中输入文本。

句法:

TYPE "<text>"

参数: -text - 要输入的文本(引号中的字符串)

例子:

TYPE "Hello, World!"
TYPE "user@example.com"
TYPE "Password123!"

注意: - 需要输入元素获得焦点 - 以实际时间逐个字符输入 - 支持特殊字符和 Unicode


TYPE $<variable>

输入变量的值。

句法:

TYPE $<variable>

参数: -variable - 变量名称(不带引号)

例子:

SETVAR email = "user@example.com"
TYPE $email

注意: - 必须先用 SETVAR 定义变量 - 变量值是字符串 - 适用于可重复使用的凭证或数据


PRESS <key>

按下并释放一个特殊键。

句法:

PRESS <key>

参数: -key - 键名(见下面支持的键)

支持的按键:-TabEnterEscapeSpace -ArrowUpArrowDownArrowLeftArrowRight -DeleteBackspace -HomeEndPageUpPageDown

例子:

PRESS Tab
PRESS Enter
PRESS Escape
PRESS ArrowDown

注意: - 模拟实际的按键按下和释放 - 适用于表单导航和快捷方式 - 区分大小写的键名


KEY_DOWN <key>

按住修饰键。

句法:

KEY_DOWN <key>

参数: -key - 修饰键:ShiftControlAltMeta

例子:

KEY_DOWN Shift
KEY_DOWN Control

注意: - 必须与 KEY_UP 配对 - 适用于组合键 - Meta 键在 Mac 上为 Cmd,在 PC 上为 Windows 键


KEY_UP <key>

释放修饰键。

句法:

KEY_UP <key>

参数: -key - 修饰键:ShiftControlAltMeta

例子:

KEY_UP Shift
KEY_UP Control

注意: - 必须与 KEY_DOWN 配对 - 释放指定的修饰键 - 始终释放按住的键的良好做法


CLEAR <selector>

清除输入字段的内容。

句法:

CLEAR `<selector>`

参数: -selector - 输入元素的 CSS 选择器(反引号中的字符串)

例子:

CLEAR `#search-box`
CLEAR `input[name="email"]`
CLEAR `.form-input:first-child`

注意: - 适用于输入、文本区域元素 - 比全选和删除更快 - 触发适当的更改事件


SET <selector> "<value>"

直接设置输入字段的值。

句法:

SET `<selector>` "<value>"

参数: -selector - 输入元素的 CSS 选择器(反引号中的字符串)-value - 要设置的值(引号中的字符串)

例子:

SET `#email` "user@example.com"
SET `#age` "25"
SET `textarea#message` "Hello, this is a test message."

注意: - 直接设置值,无需输入动画 - 对于长文本比 TYPE 更快 - 触发更改和输入事件

🔀 控制流命令

向您的脚本添加条件逻辑和循环。

IF (EXISTS <selector>) THEN <command>

如果元素存在则执行命令。

句法:

IF (EXISTS `<selector>`) THEN <command>

参数: -selector - 要检查的 CSS 选择器(反引号中的字符串)-command - 如果条件为真则执行的命令

例子:

IF (EXISTS `.cookie-banner`) THEN CLICK `.accept-cookies`
IF (EXISTS `#popup-modal`) THEN CLICK `.close-button`
IF (EXISTS `.error-message`) THEN RELOAD

注意: - 执行时检查元素是否存在 - 不等待元素出现 - 可以与 ELSE 结合使用


IF (EXISTS <selector>) THEN <command> ELSE <command>

根据元素存在执行命令。

句法:

IF (EXISTS `<selector>`) THEN <command> ELSE <command>

参数: -selector - 要检查的 CSS 选择器(反引号中的字符串)- 第一个command- 如果条件为真则执行 - 第二command- 如果条件为假则执行

例子:

IF (EXISTS `.user-menu`) THEN CLICK `.logout` ELSE CLICK `.login`
IF (EXISTS `.loading`) THEN WAIT 5 ELSE CLICK `#continue`

注意: - 只会执行一个命令 - 适用于处理不同的页面状态 - 命令必须在同一行


IF (NOT EXISTS <selector>) THEN <command>

如果元素不存在则执行命令。

句法:

IF (NOT EXISTS `<selector>`) THEN <command>

参数: -selector - 要检查的 CSS 选择器(反引号中的字符串)-command - 如果元素不存在则执行的命令

例子:

IF (NOT EXISTS `.logged-in`) THEN GO /login
IF (NOT EXISTS `.results`) THEN CLICK `#search-button`

注意: - EXISTS 条件的逆 - 用于错误处理 - 可以检查是否缺少必需元素


IF (<javascript>) THEN <command>

根据 JavaScript 条件执行命令。

句法:

IF (`<javascript>`) THEN <command>

参数: -javascript - 返回布尔值(反引号中的字符串)的 JavaScript 表达式 -command - 如果条件为真则执行的命令

例子:

IF (`window.innerWidth < 768`) THEN CLICK `.mobile-menu`
IF (`document.readyState === "complete"`) THEN CLICK `#start`
IF (`localStorage.getItem("user")`) THEN GO /dashboard

注意: - JavaScript 在浏览器上下文中执行 - 必须返回布尔值 - 访问所有浏览器 API 和全局变量


REPEAT (<command>, <count>)

重复命令特定次数。

句法:

REPEAT (<command>, <count>)

参数: -command - 重复命令 -count - 重复次数(数字)

例子:

REPEAT (SCROLL DOWN 300, 5)
REPEAT (PRESS Tab, 3)
REPEAT (CLICK `.load-more`, 10)

注意: - 执行命令精确计数次 - 适用于分页、滚动、导航 - 重复之间没有延迟(如果需要,添加 WAIT)


REPEAT (<command>, <condition>)

当条件为真时重复命令。

句法:

REPEAT (<command>, `<condition>`)

参数: -command - 重复命令 -condition - 要检查的 JavaScript 条件(反引号中的字符串)

例子:

REPEAT (SCROLL DOWN 500, `document.querySelector(".load-more")`)
REPEAT (PRESS ArrowDown, `window.scrollY < document.body.scrollHeight`)

注意: - 每次迭代前检查条件 - JavaScript 条件必须返回布尔值 - 小心避免无限循环

💾 变量和数据

在脚本中存储和操作数据。

SETVAR <name> = "<value>"

创建或更新变量。

句法:

SETVAR <name> = "<value>"

参数: -name - 变量名称(字母数字、下划线)-value - 变量值(引号中的字符串)

例子:

SETVAR username = "john@example.com"
SETVAR password = "secret123"
SETVAR base_url = "https://api.example.com"
SETVAR counter = "0"

注意: - 变量在脚本范围内是全局的 - 值始终是字符串 - 可以使用 $variable 语法与 TYPE 命令一起使用


EVAL <javascript>

执行任意 JavaScript 代码。

句法:

EVAL `<javascript>`

参数: -javascript - 要执行的 JavaScript 代码(反引号中的字符串)

例子:

EVAL `console.log("Script started")`
EVAL `window.scrollTo(0, 0)`
EVAL `localStorage.setItem("test", "value")`
EVAL `document.title = "Automated Test"`

注意: - 完全访问浏览器 JavaScript API - 适用于自定义逻辑和调试 - 不捕获返回值 - 注意安全隐患

📝 评论和文档

# <comment>

为脚本添加注释以供记录。

句法:

# <comment text>

例子:

# This script logs into the application
# Step 1: Navigate to login page
GO /login

# Step 2: Fill credentials
TYPE "user@example.com"

注意: - 执行期间忽略注释 - 对于文档和调试很有用 - 可以出现在脚本中的任何位置 - 支持多行文档块

🔧 程序(高级)

定义可重复使用的命令序列。

PROC <name> ... ENDPROC

定义可重复使用的程序。

句法:

PROC <name>
  <commands>
ENDPROC

参数: -name - 程序名称(字母数字、下划线)-commands - 包含在程序中的命令

例子:

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

注意: - 使用前必须定义程序 - 支持嵌套命令结构 - 变量与主脚本范围共享


<procedure_name>

调用已定义的过程。

句法:

<procedure_name>

例子:

# Define procedure first
PROC setup
  GO /login
  WAIT `#form` 5
ENDPROC

# Call procedure
setup
login

注意: - 调用之前必须定义过程 - 可以多次调用 - 不支持参数(使用变量代替)

错误处理最佳实践

1. 始终使用等待

# Bad - element might not be ready
CLICK `#button`

# Good - wait for element first
WAIT `#button` 5
CLICK `#button`

2.处理可选元素

# 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.使用描述性变量

# 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.添加调试信息

# 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

常见模式

登录流程

# 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

无限滚动

# 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

表单验证

# 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

多步骤流程

# 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

与 Crawl4AI 集成

使用 C4A-Script 与 Crawl4AI 进行动态内容交互:

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)

本参考涵盖所有可用的 C4A-Script 命令和模式。如需互动学习,请尝试教程现场演示


> Feedback