轻量级浏览器自动化库,直连 Chrome CDP
Project description
Tinydrama
一个基于纯 Python 标准库的简易浏览器自动化工具,通过 Chrome DevTools Protocol (CDP) 控制浏览器。
名字灵感来自 Playwright(剧作家),Tinydrama 意为"小戏剧"。
特性
- 零依赖 - 仅使用 Python 标准库,无需安装任何第三方包
- 轻量级 - 模块化设计,约 700 行代码
- 统一的 Frame 模型 - 主页面和 iframe 使用相同的 API,无需切换状态
- 多标签页 - 每个 Tab 独立对象,支持并行操作
- 自动恢复 - iframe 导航后自动恢复 context,无需重新获取
- 学习友好 - 适合学习 WebSocket、CDP 协议和浏览器自动化原理
快速开始
from tinydrama import Browser
browser = Browser()
frame = browser.launch() # 自动查找 Chrome 或 Edge
frame.goto("https://www.baidu.com")
frame.fill("#kw", "Python")
frame.click("#su")
frame.wait_for_text("百度百科")
frame.screenshot("result.png")
browser.close()
iframe 操作
frame = browser.launch()
frame.goto("https://example.com")
# 获取 iframe,返回独立的 Frame 对象
child = frame.iframe("#my-iframe")
child.fill("input", "hello")
child.click("button")
# 主页面和 iframe 可以交替操作,无需切换
frame.click("#submit")
child.click("#confirm")
多标签页
browser = Browser()
tab1 = browser.launch()
# 每个 Tab 是独立的 Frame 对象
tab2 = browser.new_tab("https://example.com")
# 可以交替操作,状态互不影响
tab1.goto("https://site-a.com")
tab1.fill("#user", "alice")
tab2.fill("#search", "query")
tab2.click("#go")
browser.close()
下载文件
browser = Browser()
frame = browser.launch()
frame.goto("https://example.com/downloads")
# 在 Browser 级别启用下载
browser.enable_download("D:/downloads")
# 触发下载
frame.click("#download-btn")
# 等待下载完成
result = browser.wait_for_download(frame=frame, timeout=120)
print(f"下载完成: {result.get('suggestedFilename')}")
browser.close()
API 参考
Browser(浏览器管理器)
| 方法 | 说明 |
|---|---|
launch(kill_existing=True, browser="auto") |
启动浏览器,返回主 Frame |
connect() |
连接已运行的浏览器,返回主 Frame |
new_tab(url) |
新建标签页,返回 Frame |
close_tab(frame) |
关闭指定标签页 |
enable_download(path) |
启用下载到指定目录 |
wait_for_download(frame, timeout) |
等待下载完成 |
close() |
关闭浏览器 |
browser 参数支持:"auto"(自动查找)、"chrome"、"edge" 或浏览器可执行文件路径。
Frame(页面操作)
导航
| 方法 | 说明 |
|---|---|
goto(url) |
导航到 URL |
wait_for_load() |
等待页面加载完成 |
wait_for_url(pattern) |
等待 URL 包含指定字符串 |
元素操作
| 方法 | 说明 |
|---|---|
click(selector, native=False) |
点击元素(默认 JS 点击,native=True 使用鼠标事件) |
click_by_text(text, tag, exact) |
通过文本点击元素 |
double_click(selector, native=False) |
双击元素 |
hover(selector) |
悬停在元素上 |
fill(selector, value) |
填充输入框 |
select(selector, value=, text=) |
选择下拉框选项 |
check(selector, checked) |
勾选/取消复选框 |
元素查询
| 方法 | 说明 |
|---|---|
query_selector(selector) |
查询元素信息 |
query_all(selector) |
查询所有匹配元素 |
wait_for_selector(selector) |
等待元素出现 |
wait_for_text(text) |
等待页面出现指定文本 |
元素读取
| 方法 | 说明 |
|---|---|
get_text(selector) |
获取元素文本 |
get_value(selector) |
获取输入框的值 |
get_attribute(selector, attr) |
获取元素属性 |
is_checked(selector) |
检查复选框是否选中 |
iframe
| 方法 | 说明 |
|---|---|
iframe(selector) |
获取 iframe 的 Frame 对象 |
is_root |
是否是根 Frame(Tab) |
文件与截图
| 方法 | 说明 |
|---|---|
screenshot(path) |
页面截图 |
upload_file(selector, path) |
上传文件 |
其他
| 方法 | 说明 |
|---|---|
execute_script(js) |
执行 JavaScript |
handle_dialog(accept, prompt_text) |
处理弹窗 |
wait_for_dialog() |
等待弹窗出现 |
activate() |
激活此标签页 |
架构
Browser(浏览器管理器)
│
├── browser-level CDPSession(下载事件监听)
│
└── FrameManager(事件管理,内部)
│
├── Frame(主页面)
│ └── Frame(iframe)
│ └── Frame(嵌套 iframe)
│
└── CDPSession(CDP 通信)
└── WebSocketClient(WebSocket 协议)
项目结构
tinydrama/
├── __init__.py # 导出公共 API
├── cdp.py # WebSocket + CDP 通信层 + CDPError
├── frame.py # Frame + FrameManager
└── browser.py # Browser 管理器
环境要求
- Python 3.10+
- Windows + Chrome 或 Edge 浏览器
适用场景
- 个人自动化办公(填表、下载报表)
- 简单的数据抓取
- 学习浏览器自动化原理
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
tinydrama-0.1.1.tar.gz
(18.4 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
tinydrama-0.1.1-py3-none-any.whl
(18.1 kB
view details)
File details
Details for the file tinydrama-0.1.1.tar.gz.
File metadata
- Download URL: tinydrama-0.1.1.tar.gz
- Upload date:
- Size: 18.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8718eb333d0e52f4454f43e7c2fb551a9035b212344be235c39c38a342156bb4
|
|
| MD5 |
f6e20e3d494c55e1da5c78371bd9db96
|
|
| BLAKE2b-256 |
2db528de528fa5a91da97f74dea173952dba45f0de41bf0dea113e023e084dc6
|
File details
Details for the file tinydrama-0.1.1-py3-none-any.whl.
File metadata
- Download URL: tinydrama-0.1.1-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c993c86e8f0028d942a1f028001f7c41f4bfebe301709517f1607663c4fecedd
|
|
| MD5 |
4b447f6eeba4591bf77f0b249e210668
|
|
| BLAKE2b-256 |
0d9207794219cc1077f64eb5b24bacaf59a6f79303bf5ef24c8c4112070a6991
|