命令式网页自动化,源于高中遗留项目,Powered by GPT-5
使用python 3.10.10开发
下载最新release文件
- 解压本软件
- 选择浏览器,并使用
--install-driver安装浏览器自动化驱动。 - 在commands文件夹内新建命令文件(文本文件
.txt即可) - 回到上一级文件夹修改
run.bat内容,将--commands .\command\cmd1.txt中的'cmd1.txt改为你刚刚新建的命令文件 - 自定义其他参数
- 运行
run.bat,等待任务完成
- me
- GPT-5
- 跨浏览器:支持 Edge、Chrome、Firefox,支持 headless。
- 命令直观:点击、输入、等待、滚动、frame/tab、下拉框、上传、断言、键盘、JS、Cookie。
- 引号与空格:命令使用 shlex 解析,参数可包含空格与中文。
- 默认等待超时时间:15s
--driver:启动浏览器类型,支持edge、chrome、firefox(可选,默认为edge)--driver-path:浏览器驱动程序路径(可选,默认为同级文件夹下的edge驱动)--start-url:启动后访问的初始 URL(可选,默认为空)--commands:命令文件路径(可选,默认为同级下的command.txt)--maximize:启动后最大化窗口(可选)--headless:无头模式启动,即不打开浏览器窗口(可选)--timeout:超时时间,(可选,默认为15s)--version或-v:显示软件版本--download-driver:下载浏览器驱动文件,支持edge与chrome--user-agent:设置UA--anti-ac:反“反爬虫”--user-data:用户浏览器数据文件夹路径(可选,默认为空)--profile-data:用户资料文件夹路径(可选,默认为空)--weixin-emu:启动微信浏览器仿真--net-harden:启用网络栈容错(禁QUIC、忽略证书错误等)--netlog:写出 Chrome NetLog 到文件(可选)--debugger-address:附着调试地址--error-no-quit:命令错误时暂停,不退出--ignore-error:忽略错误命令,出错时继续运行
-
基础元素操作
- click/rclick/dclick:
click <BY> <selector> - hover:
hover <BY> <selector> - click_js:
click_js <BY> <selector> - write:
write <BY> <selector> "<text 可含空格>" - clear:
clear <BY> <selector> - send_keys:
send_keys <BY> <selector> <keys...> - press:
press <keys...>(发给当前焦点元素) - write_ce:
write_ce <BY> <selector> "<text 可含空格>"(专门处理div输入框) - write_js:
write_js <BY> <selector> "<text 可含空格>"(通用 JS 写入) - 支持键名:
{ENTER} {TAB} {ESC} CTRL_A CTRL_C CTRL_V ...;普通文本可用引号。
- click/rclick/dclick:
-
拖拽
- drag_drop:
drag_drop <BY> <src> <BY> <dst> - drag_offset:
drag_offset <BY> <selector> <x> <y>
- drag_drop:
-
导航与窗口
- goto/back/forward/refresh:
goto <url> - maximize/minimize/set_window:
set_window <width> <height> - window_latest/window_index/window_close:
window_index 1
- goto/back/forward/refresh:
-
Frame
- frame/frame_index/frame_parent/frame_default:
frame XPATH "//iframe[@id='f']"frame_index 0frame_parentframe_default
- frame/frame_index/frame_parent/frame_default:
-
等待(显式)
- wait_present:
wait_present <BY> <selector> [timeout] - wait_visible:
wait_visible <BY> <selector> [timeout] - wait_clickable:
wait_clickable <BY> <selector> [timeout] - wait_invisible:
wait_invisible <BY> <selector> [timeout] - wait_text:
wait_text <BY> <selector> "<text>" [timeout] - wait_url_contains:
wait_url_contains "<substr>" [timeout] - wait_title_contains:
wait_title_contains "<substr>" [timeout]
- wait_present:
-
滚动
- scroll_into_view:
scroll_into_view <BY> <selector> [block](center|start|end) - scroll_by:
scroll_by <x> <y> - scroll_top/scroll_bottom
- scroll_into_view:
-
下拉框
- select:
select <BY> <selector> (text|value|index) <value>
- select:
-
上传/截图/JS
- upload:
upload <BY> <selector> "<file_path>" - screenshot:
screenshot "<file_path>" - screenshot_element:
screenshot_element <BY> <selector> "<file_path>" - exec_js:
exec_js "window.scrollTo(0,0)"
- upload:
-
断言/打印
- assert_text:
assert_text <BY> <selector> "<expected_substr>" - assert_url_contains:
assert_url_contains "<substr>" - assert_title_contains:
assert_title_contains "<substr>" - print_text/print_attr:
print_text <BY> <selector>/print_attr <BY> <selector> <name> - echo:
echo "消息"
- assert_text:
-
Cookie
- cookie_set/cookies_set/cookie_get/cookie_delete/cookie_clear
-
其他
- sleep:
sleep <seconds> - pause:
pause - keep_open:
keep_open
- sleep:
-
BY 取值
- XPATH, CSS, ID, NAME, CLASS, TAG, LINK(全匹配链接文本), PLINK(部分匹配链接文本)
-
兼容旧指令别名
- L_click/ R_click/ D_click/ put/ write/ jump/ delay/ pause/ keep_open
-
常见选择器示例
- XPATH:
//input[@name="q"] - CSS:
input[name="q"] - LINK:
登录,PLINK:登
- XPATH:
- 选择器定位(BY,大小写不敏感)
- XPATH、CSS、ID、NAME、CLASS、TAG、LINK(链接文本全匹配)、PLINK(链接文本部分匹配)
- 引号与空格
- 参数若包含空格或特殊字符,使用引号("…" 或 '…')包裹
- 键盘输入
- 特殊键:使用花括号包裹,如
{ENTER} {TAB} {ESC} - 组合键别名:
CTRL_A CTRL_C CTRL_V …;也可{CTRL} a
- 特殊键:使用花括号包裹,如
- 显式等待超时
- 未显式提供
timeout的 wait_* 命令使用全局默认(CLI 参数--timeout,默认 15 秒)
- 未显式提供
- 错误类型(常见)
- 找不到元素:选择器无匹配或元素尚未渲染
- 查询表达式错误:BY 与 selector 不匹配或 selector 语法错误
- 不可交互:元素不可见/被遮挡/禁用
- 参数不足/格式错误:命令参数缺失或类型不正确
在此引用文章:
XPATH教程(tips:在开发者工具(按下F12里右键元素即可复制完整Xpath))
CSS选择器教程
- L_click → click
- R_click → rclick
- D_click → dclick
- put → hover
- jump → goto
- delay → sleep
- pause → pause
- keep_open → keep_open
- 语法:
click <BY> <selector> - 说明:对目标元素执行左键点击
- 参数:
- BY:定位方式(如 XPATH/CSS/ID…)
- selector:选择器字符串
- 常见错误:找不到元素、不可交互、查询表达式错误
- 示例:
click CSS button.submit click XPATH "//button[@type='submit']"
- 语法:
rclick <BY> <selector> - 说明:右键点击(上下文菜单)
- 参数:同 click
- 示例:
rclick CSS .file-item
- 语法:
dclick <BY> <selector> - 说明:双击
- 参数:同 click
- 示例:
dclick PLINK "详情"
- 语法:
hover <BY> <selector> - 说明:鼠标悬停(触发悬浮菜单/提示等)
- 参数:同 click
- 示例:
hover CSS .menu
- 语法:
click_js <BY> <selector> - 说明:通过 JavaScript 触发元素点击(绕开遮挡/布局问题)
- 参数:同 click
- 示例:
click_js CSS .hidden-button
- 语法:
clear <BY> <selector> - 说明:清空输入框内容
- 参数:同 click
- 示例:
clear NAME username
- 语法:
write <BY> <selector> "<text>" - 说明:点击输入框并输入文本;文本可包含空格
- 参数:
- text:输入内容,建议使用引号
- 示例:
write CSS input[name="q"] "关键字 搜索"
- 语法:
send_keys <BY> <selector> <keys...> - 说明:向元素发送按键序列(可混合文本与特殊键/组合键)
- 参数:
- keys:如
"hello"{ENTER}CTRL_A{CTRL} c
- keys:如
- 示例:
send_keys CSS input[name="q"] "hello world" {ENTER} send_keys CSS input[name="name"] CTRL_A "新名字"
- 语法:
press <keys...> - 说明:向“当前焦点元素”发送按键序列
- 示例:
press {CTRL} "l" press CTRL_A {DELETE}
- 语法:
write_ce <BY> <selector> "<text>" - 说明:向div输入框输入文本;文本可包含空格
- 示例:
write_ce CSS div[name="q"][contenteditable="true"] "关键字 搜索"
- 语法:
write_ce <BY> <selector> "<text>" - 说明:通用 js 写入;文本可包含空格
- 示例:
write_js CSS .example-input "关键字 搜索"
- 语法:
drag_drop <BY> <src_selector> <BY> <dst_selector> - 说明:将源元素拖拽到目标元素上
- 示例:
drag_drop CSS .drag-src CSS .drop-zone
- 语法:
drag_offset <BY> <selector> <x> <y> - 说明:将元素按位移拖拽(像素)
- 参数:
- x, y:整数(可为负)
- 示例:
drag_offset CSS .slider 80 0
- 语法:
goto <url> - 说明:跳转到指定 URL,一定要带上"https://"等协议头
- 示例:
goto https://example.com/login
- 语法:
back/forward/refresh - 说明:浏览器后退/前进/刷新
- 示例:
back refresh
- 语法:
maximize/minimize - 说明:最大化/最小化窗口(headless 下部分浏览器无效)
- 示例:
maximize
- 语法:
set_window <width> <height> - 说明:设置窗口大小(整数像素)
- 示例:
set_window 1920 1080
- 语法:
frame <BY> <selector> - 说明:切换到 iframe(通过元素定位)
- 示例:
frame XPATH "//iframe[@id='content']"
- 语法:
frame_index <index> - 说明:按索引切入 frame(0 基)
- 示例:
frame_index 0
- 语法:
frame_parent/frame_default - 说明:切换到上一级 frame / 回到默认文档上下文
- 示例:
frame_parent frame_default
- 语法:
window_latest - 说明:切换到最新打开的窗口/标签页
- 示例:
window_latest
- 语法:
window_index <i> - 说明:按索引切换窗口(0 基);索引越界会报错
- 示例:
window_index 1
- 语法:
window_close - 说明:关闭当前窗口(关闭后需手动切换到其他窗口,如果还有)
- 示例:
window_close
注:未提供 timeout 时,使用全局默认超时(CLI --timeout)。
- 语法:
wait_present <BY> <selector> [timeout] - 说明:等待元素存在于 DOM(不保证可见/可点)
- 示例:
wait_present CSS .list-item 10
- 语法:
wait_visible <BY> <selector> [timeout] - 说明:等待元素可见
- 示例:
wait_visible ID login-form 15
- 语法:
wait_clickable <BY> <selector> [timeout] - 说明:等待元素可点击(可见且可交互)
- 示例:
wait_clickable CSS button.submit 10
- 语法:
wait_invisible <BY> <selector> [timeout] - 说明:等待元素不可见或从 DOM 移除
- 示例:
wait_invisible CSS .loading 20
- 语法:
wait_text <BY> <selector> "<text>" [timeout] - 说明:等待元素文本包含指定子串
- 示例:
wait_text CSS .result "成功" 15
- 语法:
wait_url_contains "<substr>" [timeout] - 说明:等待当前 URL 包含子串
- 示例:
wait_url_contains "/dashboard" 10
- 语法:
wait_title_contains "<substr>" [timeout] - 说明:等待页面标题包含子串
- 示例:
wait_title_contains "仪表盘"
- 语法:
scroll_into_view <BY> <selector> [block] - 说明:滚动使元素进入视口;block 指定对齐位置
- 参数:
- block:
center(默认)|start|end
- block:
- 示例:
scroll_into_view CSS .footer start
- 语法:
scroll_by <x> <y> - 说明:按位移滚动窗口(像素,整数)
- 示例:
scroll_by 0 800
- 语法:
scroll_top/scroll_bottom - 说明:滚动到顶部/底部
- 示例:
scroll_bottom
- 语法:
select <BY> <selector> (text|value|index) <value> - 说明:对
<select>元素进行选项选择 - 参数:
- 模式:
- text:按可见文本
- value:按值属性
- index:按索引(整数,0 基)
- 模式:
- 示例:
select ID city text "上海市" select NAME lang value "zh-CN" select CSS select#page index 2
- 语法:
upload <BY> <selector> "<file_path>" - 说明:向
<input type="file">输入文件路径(需可访问) - 注意:路径将解析为绝对路径;不存在会报错
- 示例:
upload CSS input[type="file"] "./data/upload.png"
- 语法:
screenshot "<file_path>" - 说明:页面全屏截图;会自动创建父目录
- 示例:
screenshot "./out/page.png"
- 语法:
screenshot_element <BY> <selector> "<file_path>" - 说明:元素截图;会自动创建父目录
- 示例:
screenshot_element CSS .result "./out/result.png"
- 语法:
exec_js "<javascript 代码>" - 说明:在页面上下文直接执行 JS(无返回处理)
- 示例:
exec_js "window.scrollTo(0,0)" exec_js "console.log('hello from automation')"
- 语法:
assert_text <BY> <selector> "<expected_substr>" - 说明:断言元素文本包含子串;失败抛出错误
- 示例:
assert_text CSS .toast "操作成功"
- 语法:
assert_url_contains "<substr>" - 说明:断言当前 URL 包含子串
- 示例:
assert_url_contains "/dashboard"
- 语法:
assert_title_contains "<substr>" - 说明:断言页面标题包含子串
- 示例:
assert_title_contains "仪表盘"
- 语法:
print_text <BY> <selector> - 说明:打印元素文本到控制台
- 示例:
print_text CSS .user-name
- 语法:
print_attr <BY> <selector> <name> - 说明:打印元素属性值到控制台
- 示例:
print_attr CSS a.download href
- 语法:
echo "<message>" - 说明:输出一条消息到控制台
- 示例:
echo "步骤完成,继续下一步"
- 语法:
cookie_set <name> <value> - 说明:设置 Cookie(需在某域名上下文下)
- 示例:
cookie_set token 123456
- 语法:
cookie_set <value> - 说明:设置多个Cookie(需在某域名上下文下),格式为
name1:value1;name2:value2;...... - 示例:
cookies_set name1:value1;name2:value2
- 语法:
cookie_get <name> - 说明:打印指定 Cookie
- 示例:
cookie_get token
- 语法:
cookie_delete <name> - 说明:删除指定 Cookie
- 示例:
cookie_delete token
- 语法:
cookie_clear - 说明:清空所有 Cookie
- 示例:
cookie_clear
- 语法:
sleep <seconds> - 说明:线程休眠若干秒(整数)
- 示例:
sleep 2
- 语法:
pause - 说明:暂停执行,等待用户回车继续(无交互终端时自动跳过)
- 示例:
pause
- 语法:
keep_open - 说明:脚本结束后保持浏览器不关闭(按 Ctrl+C 退出或手动关闭)
- 示例:
keep_open
- 语法:
set_var <name> <value> - 说明:设置变量的值,如果不存在则创建并设置,使用变量的方法为
${<变量名>} - 示例:
set_var url https://example.com
- XPATH:
//input[@name='q']、//button[contains(.,'登录')] - CSS:
input[name="q"]、button.submit、#id .class - ID/NAME/CLASS/TAG:
ID login-btn、NAME username、CLASS item、TAG input - LINK/PLINK:
LINK "下载"(全匹配)、PLINK "下"(包含)
建议优先选用稳定的定位(ID、data-* 属性、语义明确的 CSS),或者直接复制元素的完整Xpath。
- 点击失败请优先加入
wait_clickable;被遮挡可尝试scroll_into_view或click_js - iframe 内元素必须先
frame/frame_index切换 - 异步加载用
wait_*系列避免“找不到元素” - headless 下窗口相关命令可能表现不同,可使用
set_window 1920 1080 upload仅适用于原生<input type="file">,自定义组件需改用exec_js或触发原生输入框