Skip to content

Latest commit

 

History

History
543 lines (401 loc) · 15.4 KB

File metadata and controls

543 lines (401 loc) · 15.4 KB

AutoControl

PyPI Python License: MIT

AutoControl 是一个跨平台的 Python GUI 自动化框架,提供鼠标控制、键盘输入、图像识别、屏幕捕获、脚本执行与报告生成等功能 — 通过统一的 API 在 Windows、macOS 和 Linux (X11) 上运行。

English | 繁體中文


目录


功能特性

  • 鼠标自动化 — 移动、点击、按下、释放、拖拽、滚动,支持精确坐标控制
  • 键盘自动化 — 按下/释放单一按键、输入字符串、组合键、按键状态检测
  • 图像识别 — 使用 OpenCV 模板匹配在屏幕上定位 UI 元素,支持可配置的检测阈值
  • 截图与屏幕录制 — 捕获全屏或指定区域为图片,录制屏幕为视频(AVI/MP4)
  • 动作录制与回放 — 录制鼠标/键盘事件并重新播放
  • JSON 脚本执行 — 使用 JSON 动作文件定义并执行自动化流程
  • 报告生成 — 将测试记录导出为 HTML、JSON 或 XML 报告,包含成功/失败状态
  • 远程自动化 — 启动 TCP Socket 服务器,接收并执行来自远程客户端的自动化命令
  • Shell 集成 — 在自动化流程中执行 Shell 命令,支持异步输出捕获
  • 回调执行器 — 触发自动化函数后自动调用回调函数,实现操作串联
  • 动态包加载 — 在运行时导入外部 Python 包,扩展执行器功能
  • 项目与模板管理 — 快速创建包含 keyword/executor 目录结构的自动化项目
  • 窗口管理 — 直接将键盘/鼠标事件发送至指定窗口(Windows/Linux)
  • GUI 应用程序 — 内置 PySide6 图形界面,支持交互式自动化操作
  • 跨平台 — 统一 API,支持 Windows、macOS、Linux(X11)

架构

je_auto_control/
├── wrapper/                    # 平台无关 API 层
│   ├── platform_wrapper.py     # 自动检测操作系统并加载对应后端
│   ├── auto_control_mouse.py   # 鼠标操作
│   ├── auto_control_keyboard.py# 键盘操作
│   ├── auto_control_image.py   # 图像识别(OpenCV 模板匹配)
│   ├── auto_control_screen.py  # 截图、屏幕大小、像素颜色
│   └── auto_control_record.py  # 动作录制/回放
├── windows/                    # Windows 专用后端(Win32 API / ctypes)
├── osx/                        # macOS 专用后端(pyobjc / Quartz)
├── linux_with_x11/             # Linux 专用后端(python-Xlib)
├── gui/                        # PySide6 GUI 应用程序
└── utils/
    ├── executor/               # JSON 动作执行引擎
    ├── callback/               # 回调函数执行器
    ├── cv2_utils/              # OpenCV 截图、模板匹配、视频录制
    ├── socket_server/          # TCP Socket 服务器(远程自动化)
    ├── shell_process/          # Shell 命令管理器
    ├── generate_report/        # HTML / JSON / XML 报告生成器
    ├── test_record/            # 测试动作记录
    ├── json/                   # JSON 动作文件读写
    ├── project/                # 项目创建与模板
    ├── package_manager/        # 动态包加载
    ├── logging/                # 日志记录
    └── exception/              # 自定义异常类

platform_wrapper.py 模块会自动检测当前的操作系统并导入对应的后端,因此所有 wrapper 函数在不同平台上的行为完全一致。


安装

基本安装

pip install je_auto_control

安装 GUI 支持(PySide6)

pip install je_auto_control[gui]

Linux 前置要求

在 Linux 上安装前,请先安装以下系统包:

sudo apt-get install cmake libssl-dev

系统要求

  • Python >= 3.10
  • pip >= 19.3

依赖包

用途
je_open_cv 图像识别(OpenCV 模板匹配)
pillow 截图捕获
mss 快速多屏幕截图
pyobjc macOS 后端(在 macOS 上自动安装)
python-Xlib Linux X11 后端(在 Linux 上自动安装)
PySide6 GUI 应用程序(可选,使用 [gui] 安装)
qt-material GUI 主题(可选,使用 [gui] 安装)

快速开始

鼠标控制

import je_auto_control

# 获取当前鼠标位置
x, y = je_auto_control.get_mouse_position()
print(f"鼠标位置: ({x}, {y})")

# 移动鼠标到指定坐标
je_auto_control.set_mouse_position(500, 300)

# 在当前位置左键点击(使用按键名称)
je_auto_control.click_mouse("mouse_left")

# 在指定坐标右键点击
je_auto_control.click_mouse("mouse_right", x=800, y=400)

# 向下滚动
je_auto_control.mouse_scroll(scroll_value=5)

键盘控制

import je_auto_control

# 按下并释放单一按键
je_auto_control.type_keyboard("a")

# 逐字输入整个字符串
je_auto_control.write("Hello World")

# 组合键(例如 Ctrl+C)
je_auto_control.hotkey(["ctrl_l", "c"])

# 检查某个按键是否正在被按下
is_pressed = je_auto_control.check_key_is_press("shift_l")

图像识别

import je_auto_control

# 在屏幕上找出所有匹配的图像
positions = je_auto_control.locate_all_image("button.png", detect_threshold=0.9)
# 返回: [[x1, y1, x2, y2], ...]

# 找出单一图像并获取其中心坐标
cx, cy = je_auto_control.locate_image_center("icon.png", detect_threshold=0.85)
print(f"找到位置: ({cx}, {cy})")

# 找出图像并自动点击
je_auto_control.locate_and_click("submit_button.png", mouse_keycode="mouse_left")

截图

import je_auto_control

# 捕获全屏截图并保存
je_auto_control.pil_screenshot("screenshot.png")

# 捕获指定区域的截图 [x1, y1, x2, y2]
je_auto_control.pil_screenshot("region.png", screen_region=[100, 100, 500, 400])

# 获取屏幕分辨率
width, height = je_auto_control.screen_size()

# 获取指定坐标的像素颜色
color = je_auto_control.get_pixel(500, 300)

动作录制与回放

import je_auto_control
import time

# 开始录制鼠标和键盘事件
je_auto_control.record()

time.sleep(10)  # 录制 10 秒

# 停止录制并获取动作列表
actions = je_auto_control.stop_record()

# 重新播放录制的动作
je_auto_control.execute_action(actions)

JSON 脚本执行器

创建 JSON 动作文件(actions.json):

[
    ["AC_set_mouse_position", {"x": 500, "y": 300}],
    ["AC_click_mouse", {"mouse_keycode": "mouse_left"}],
    ["AC_write", {"write_string": "Hello from AutoControl"}],
    ["AC_screenshot", {"file_path": "result.png"}],
    ["AC_hotkey", {"key_code_list": ["ctrl_l", "s"]}]
]

执行方式:

import je_auto_control

# 从文件执行
je_auto_control.execute_action(je_auto_control.read_action_json("actions.json"))

# 或直接从列表执行
je_auto_control.execute_action([
    ["AC_set_mouse_position", {"x": 100, "y": 200}],
    ["AC_click_mouse", {"mouse_keycode": "mouse_left"}]
])

可用的动作命令:

类别 命令
鼠标 AC_click_mouse, AC_set_mouse_position, AC_get_mouse_position, AC_press_mouse, AC_release_mouse, AC_mouse_scroll, AC_mouse_left, AC_mouse_right, AC_mouse_middle
键盘 AC_type_keyboard, AC_press_keyboard_key, AC_release_keyboard_key, AC_write, AC_hotkey, AC_check_key_is_press
图像 AC_locate_all_image, AC_locate_image_center, AC_locate_and_click
屏幕 AC_screen_size, AC_screenshot
录制 AC_record, AC_stop_record
报告 AC_generate_html, AC_generate_json, AC_generate_xml, AC_generate_html_report, AC_generate_json_report, AC_generate_xml_report
项目 AC_create_project
Shell AC_shell_command
进程 AC_execute_process
执行器 AC_execute_action, AC_execute_files

报告生成

import je_auto_control

# 先启用测试记录
je_auto_control.test_record_instance.set_record_enable(True)

# ... 执行自动化动作 ...
je_auto_control.set_mouse_position(100, 200)
je_auto_control.click_mouse("mouse_left")

# 生成报告
je_auto_control.generate_html_report("test_report")   # -> test_report.html
je_auto_control.generate_json_report("test_report")   # -> test_report.json
je_auto_control.generate_xml_report("test_report")    # -> test_report.xml

# 或获取报告内容为字符串
html_string = je_auto_control.generate_html()
json_string = je_auto_control.generate_json()
xml_string = je_auto_control.generate_xml()

报告内容包含:每个记录动作的函数名称、参数、时间戳及异常信息(如有)。HTML 报告中成功的动作以青色显示,失败的动作以红色显示。

远程自动化(Socket 服务器)

启动 TCP 服务器,接收来自远程客户端的 JSON 自动化命令:

import je_auto_control

# 启动服务器(默认:localhost:9938)
server = je_auto_control.start_autocontrol_socket_server(host="localhost", port=9938)

# 服务器在后台线程中运行
# 通过 TCP 发送 JSON 动作命令即可远程执行
# 发送 "quit_server" 关闭服务器

客户端示例:

import socket
import json

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("localhost", 9938))

# 发送自动化命令
command = json.dumps([
    ["AC_set_mouse_position", {"x": 500, "y": 300}],
    ["AC_click_mouse", {"mouse_keycode": "mouse_left"}]
])
sock.sendall(command.encode("utf-8"))

# 接收响应
response = sock.recv(8192).decode("utf-8")
print(response)
sock.close()

Shell 命令执行

import je_auto_control

# 使用默认的 Shell 管理器
je_auto_control.default_shell_manager.exec_shell("echo Hello")
je_auto_control.default_shell_manager.pull_text()  # 输出捕获的结果

# 或创建自定义的 ShellManager
shell = je_auto_control.ShellManager(shell_encoding="utf-8")
shell.exec_shell("ls -la")
shell.pull_text()
shell.exit_program()

屏幕录制

import je_auto_control
import time

# 方法一:ScreenRecorder(管理多个录像)
recorder = je_auto_control.ScreenRecorder()
recorder.start_new_record(
    recorder_name="my_recording",
    path_and_filename="output.avi",
    codec="XVID",
    frame_per_sec=30,
    resolution=(1920, 1080)
)
time.sleep(10)
recorder.stop_record("my_recording")

# 方法二:RecordingThread(简易单一录像,输出 MP4)
recording = je_auto_control.RecordingThread(video_name="my_video", fps=20)
recording.start()
time.sleep(10)
recording.stop()

回调执行器

执行自动化函数后自动触发回调函数:

import je_auto_control

def my_callback():
    print("动作完成!")

# 执行 set_mouse_position 后调用 my_callback
je_auto_control.callback_executor.callback_function(
    trigger_function_name="AC_set_mouse_position",
    callback_function=my_callback,
    x=500, y=300
)

# 带有参数的回调
def on_done(message):
    print(f"完成: {message}")

je_auto_control.callback_executor.callback_function(
    trigger_function_name="AC_click_mouse",
    callback_function=on_done,
    callback_function_param={"message": "点击完成"},
    callback_param_method="kwargs",
    mouse_keycode="mouse_left"
)

包管理器

在运行时动态加载外部 Python 包到执行器中:

import je_auto_control

# 将包的所有函数/类加入执行器
je_auto_control.package_manager.add_package_to_executor("os")

# 现在可以在 JSON 动作脚本中使用 os 函数:
# ["os_getcwd", {}]
# ["os_listdir", {"path": "."}]

项目管理

快速创建包含模板文件的项目目录结构:

import je_auto_control

# 创建项目结构
je_auto_control.create_project_dir(project_path="./my_project", parent_name="AutoControl")

# 会创建以下结构:
# my_project/
# └── AutoControl/
#     ├── keyword/
#     │   ├── keyword1.json        # 模板动作文件
#     │   ├── keyword2.json        # 模板动作文件
#     │   └── bad_keyword_1.json   # 错误处理模板
#     └── executor/
#         ├── executor_one_file.py  # 执行单一文件示例
#         ├── executor_folder.py    # 执行文件夹示例
#         └── executor_bad_file.py  # 错误处理示例

窗口管理

直接将事件发送至指定窗口(仅限 Windows 和 Linux):

import je_auto_control

# 通过窗口标题发送键盘事件
je_auto_control.send_key_event_to_window("Notepad", keycode="a")

# 通过窗口 handle 发送鼠标事件
je_auto_control.send_mouse_event_to_window(window_handle, mouse_keycode="mouse_left", x=100, y=50)

GUI 应用程序

启动内置图形界面(需安装 [gui] 扩展):

import je_auto_control
je_auto_control.start_autocontrol_gui()

或通过命令行:

python -m je_auto_control

命令行界面

AutoControl 可直接从命令行使用:

# 执行单一动作文件
python -m je_auto_control -e actions.json

# 执行目录中所有动作文件
python -m je_auto_control -d ./action_files/

# 直接执行 JSON 字符串
python -m je_auto_control --execute_str '[["AC_screenshot", {"file_path": "test.png"}]]'

# 创建项目模板
python -m je_auto_control -c ./my_project

平台支持

平台 状态 后端 备注
Windows 10 / 11 支持 Win32 API (ctypes) 完整功能支持
macOS 10.15+ 支持 pyobjc / Quartz 不支持动作录制;不支持 send_key_event_to_window / send_mouse_event_to_window
Linux(X11) 支持 python-Xlib 完整功能支持
Linux(Wayland) 暂不支持 未来版本可能加入支持
Raspberry Pi 3B / 4B 支持 python-Xlib 在 X11 上运行

开发

环境配置

git clone https://github.com/Intergration-Automation-Testing/AutoControl.git
cd AutoControl
pip install -r dev_requirements.txt

运行测试

# 单元测试
python -m pytest test/unit_test/

# 集成测试
python -m pytest test/integrated_test/

项目链接


许可证

MIT License © JE-Chen