自定义 Adapter 与挂载
Qirabot 的设计是加入你已有的技术栈,而不是替换它。每个动作的第一个 参数就是框架对象(page / driver / 设备 / 模块)——传你的进来,AI 步骤 和现有代码自由混合:
| 你在用 | 传入 | 说明 |
|---|---|---|
| Playwright | page | 保持显式写法——点击可能返回新标签页 |
| Selenium | driver | pip install qirabot selenium |
| Appium | driver | qirabot[appium];Android 和 iOS |
| pyautogui | pyautogui 模块 | qirabot[desktop]——见桌面 |
| 内置设备 | AdbDevice / WdaClient / Window | 无需 extras |
在 pytest 里跑?同一套逻辑——fixture 持有 bot, 测试传入自己的 page/driver。
bind() —— 省去重复的第一个参数
整个会话只驱动一个稳定目标时,bind() 一次即可:
bot = Qirabot().bind(driver) # Selenium/Appium driver、pyautogui、AdbDevice/WdaClient/Window
bot.click("登录")
bot.type_text("邮箱", "a@b.com")
with Qirabot().bind(driver) as bot: # 也可作为上下文管理器
...bind() 推荐用于设备后端、pyautogui、Appium、Selenium。Playwright 请保持 page = bot.click(page, ...) 的显式写法,让新标签页切换可见;用了绑定 代理时,当前活动页面可通过 bot.current_page() 获取。
编写自定义 Adapter
qirabot 没有内置的后端——云真机 SDK、自定义引擎桥、VNC 会话——都可以通过 继承 qirabot.DeviceAdapter 接入。必需的原语只有:
screenshot · click · double_click · type_text · press_key · scroll · device_info(这些就是平台支持矩阵里列出的动作—— 你的 adapter 定义每个动作如何映射到你的引擎;其余能力都由此派生。)
然后要么直接把实例传给 bind():
bot = Qirabot().bind(MyAdapter(handle))要么实现 accepts() 并注册一次,让 bind() 认识你框架的原生对象:
from qirabot import register_adapter
register_adapter(MyAdapter) # 优先于内置 adapter 检查
bot = Qirabot().bind(native_object)examples/airtest/adapter.py 是一份完整的参考实现。
从 Airtest 迁移(qirabot 1.x)
qirabot 2.0 移除了 airtest 集成——连同与现代环境冲突的 numpy<2 / opencv-contrib 版本锁。内置后端即插即用:
# 1.x # 2.0
connect_device("Android:///emu-5554") AdbDevice("emu-5554")
connect_device("iOS:///http://...:8100") WdaClient("http://...:8100")
connect_device("Windows:///132456") Window(hwnd=132456)想保留 airtest 脚本?把上面的参考 adapter 复制进你的项目(airtest 是 你的依赖,不再是 qirabot 的),register_adapter 注册一次,1.x 的 bind(connect_device(...)) 调用原样运行。1.x 系列在 1.x 分支维护 (只修 bug 和安全问题);pip install "qirabot<2" 始终解析到最新的 1.9.x 补丁版。