Playwright + Qirabot
Playwright 套件原样保留——选择器、fixture、CI 都不动——只在选择器难受的 地方加 AI:动态内容、canvas、第三方组件,以及关于"页面看起来怎样"而非 "DOM 里有什么"的断言。
python
from playwright.sync_api import sync_playwright
from qirabot import Qirabot
bot = Qirabot()
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://github.com/trending")
# 你的选择器和 AI 步骤自由穿插
repos = bot.extract(page, "提取前 5 个热门仓库的名字")
print(repos)
browser.close()
bot.close()零配置:每个 Qirabot 动作的第一个参数就是 Playwright 的 page。
各类调用的价值
bot.verify(page, "购物车显示 1 件商品")—— 用视觉断言取代 element-exists 断言。改标记、改文案、重构 CSS 都不影响。bot.extract(page, "把结果列表里的价格提取为 JSON 数组")—— 直接从 渲染后的页面拿结构化数据,不写解析逻辑。bot.click(page, "登录按钮")—— 没有稳定选择器时的自然语言定位。bot.ai(page, "以 John Doe、邮编 10001 完成结算")—— 把整段易碎的 流程交给 AI,断言result.success。
新标签页:重新赋值返回的 page
点击可能打开新标签页;click / type_text / press_key 的返回值就是 下一步原生调用应该用的 page。Playwright 下保持显式写法(而不是 bind()),让标签页切换始终可见:
python
page = bot.click(page, "打开第一个视频") # 可能返回新标签页
page.fill("#comment", "nice") # 原生调用落在正确的 page 上
for i in range(4):
page = bot.click(page, f"打开第 {i + 1} 个视频")
bot.screenshot(page)
page = bot.go_back(page) # 智能:关闭无历史的新标签页,回到列表用 bot.press_key(page, "ctrl+w") 关闭标签页同样会切换活动标签页——同一 条规则,重新赋值。如果确实用了绑定代理,当前活动页面可通过 bot.current_page() 获取。
自动等待
AI 定位的动作会轮询到元素出现再执行:
python
bot.click(page, "登录按钮", timeout=15.0, interval=2.0)
bot.wait_for(page, "仪表盘已加载完成", timeout=15.0)你的原生调用仍由 Playwright 自己的 auto-waiting 处理;Qirabot 在 Playwright 上不额外加 settle 延迟(信任框架)。
底层机制
截图上传到 Qirabot 服务器做推理和元素定位;动作通过你的 Playwright 会话 在本地执行。代码、cookie、凭据都不离开你的机器——只上传截图。