RPA工作流框架,支持多种自动化工具的工作流管理和节点执行
Project description
RPA Workflow
一个灵活、可扩展的RPA(机器人流程自动化)工作流框架,支持多种自动化工具的工作流管理和节点执行。
特性
- 统一的工作流管理接口
- 支持多种自动化工具:
- Selenium
- UIAutomator2 (Android)
- Undetected ChromeDriver
- Playwright
- DrissionPage
- 可扩展的节点系统
- 内置错误处理和重试机制
- 上下文数据共享
安装
基本安装
pip install rpaworkflow
安装特定框架依赖
rpaworkflow支持多种自动化框架,您可以根据需要安装特定框架的依赖:
# 安装Selenium依赖
pip install rpaworkflow[selenium]
# 安装Playwright依赖
pip install rpaworkflow[playwright]
# 安装UIAutomator2依赖
pip install rpaworkflow[uiautomator2]
# 安装Undetected ChromeDriver依赖
pip install rpaworkflow[undetected-chromedriver]
# 安装DrissionPage依赖
pip install rpaworkflow[drissionpage]
# 安装所有框架依赖
pip install rpaworkflow[all]
使用uv安装:
# 安装Selenium依赖
uv pip install rpaworkflow[selenium]
# 安装所有框架依赖
uv pip install rpaworkflow[all]
快速开始
Selenium Web 自动化示例
from rpaworkflow.selenium import ConnectBrowserNode, NavigateNode, CloseBrowserNode
from rpaworkflow.manager import WorkflowManager, WorkflowStatus
from rpaworkflow.nodes import WaitTimeNode
# 创建工作流管理器
workflow = WorkflowManager(name="简单Web自动化")
# 添加节点
workflow.add_node(ConnectBrowserNode(name="连接浏览器"))
workflow.add_node(NavigateNode(name="打开网页", url="https://www.example.com"))
workflow.add_node(WaitTimeNode(name="等待加载", min_time=2))
workflow.set_finally_node(CloseBrowserNode(name='关闭浏览器'))
# 执行工作流
result = workflow.run()
print(f"工作流执行状态: {result.status}")
assert result.status == WorkflowStatus.SUCCESS
Android 自动化示例
from rpaworkflow.uiautomator2 import ConnectDeviceNode, ClickNode, LaunchAppNode, StopAppNode
from rpaworkflow.manager import WorkflowManager, WorkflowStatus
# 创建工作流管理器
workflow = WorkflowManager(name="Android自动化")
package_name = '...' # 例如 'com.example.app'
# 添加节点
workflow.add_node(ConnectDeviceNode(name="连接设备"))
workflow.add_node(LaunchAppNode(name="启动APP", package_name=package_name))
workflow.add_node(ClickNode(name="点击按钮", selector={"resourceId": "com.example.app:id/button1"}))
workflow.set_finally_node(StopAppNode(name="停止APP", package_name=package_name))
# 执行工作流
result = workflow.run()
assert result.status == WorkflowStatus.SUCCESS
Playwright 现代 Web 自动化示例
from rpaworkflow.playwright import ConnectBrowserNode, NavigateNode, ClickNode, InputTextNode, ScreenshotNode, CloseBrowserNode
from rpaworkflow.manager import WorkflowManager, WorkflowStatus
# 创建工作流管理器
workflow = WorkflowManager(name="Playwright自动化")
# 添加节点
workflow.add_node(ConnectBrowserNode(name="连接浏览器", browser_type="chromium"))
workflow.add_node(NavigateNode(name="打开网页", url="https://www.example.com"))
workflow.add_node(ClickNode(name="点击登录按钮", selector="#login-button"))
workflow.add_node(InputTextNode(name="输入用户名", selector="#username", text="user"))
workflow.add_node(ScreenshotNode(name="截图", file_path="result.png"))
workflow.set_finally_node(CloseBrowserNode(name="关闭浏览器"))
# 执行工作流
result = workflow.run()
assert result.status == WorkflowStatus.SUCCESS
DrissionPage 多功能 Web 自动化示例
from rpaworkflow.drissionpage import ConnectPageNode, NavigateNode, ClickNode, InputTextNode, ScreenshotNode, QuitBrowserNode
from rpaworkflow.manager import WorkflowManager, WorkflowStatus
# 创建工作流管理器
workflow = WorkflowManager(name="DrissionPage自动化")
# 添加节点
workflow.add_node(ConnectPageNode(name="连接页面", page_type="web"))
workflow.add_node(NavigateNode(name="打开网页", url="https://www.example.com"))
workflow.add_node(ClickNode(name="点击按钮", locator="#login-button"))
workflow.add_node(InputTextNode(name="输入文本", locator="#username", text="user"))
workflow.add_node(ScreenshotNode(name="截图", filename="screenshot.png", save_path='./'))
workflow.set_finally_node(QuitBrowserNode(name="退出浏览器"))
# 执行工作流
result = workflow.run()
assert result.status == WorkflowStatus.SUCCESS
Undetected ChromeDriver 反检测 Web 自动化示例
import undetected_chromedriver as uc
from rpaworkflow.undetected_chromedriver import ConnectBrowserNode, NavigateNode, ClickNode, InputTextNode, CloseBrowserNode
from rpaworkflow.manager import WorkflowManager, WorkflowStatus
# 创建工作流管理器
workflow = WorkflowManager(name="Undetected Chrome自动化")
# 添加节点
workflow.add_node(ConnectBrowserNode(name="连接浏览器", headless=False, suppress_welcome=True))
workflow.add_node(NavigateNode(name="打开网页", url="https://bot.sannysoft.com")) # 指纹检测网站
workflow.add_node(ClickNode(name="点击按钮", by=uc.By.CSS_SELECTOR, value="#some-button"))
workflow.add_node(InputTextNode(name="输入文本", by=uc.By.CSS_SELECTOR, value="#some-input", text="测试文本"))
workflow.set_finally_node(CloseBrowserNode(name="关闭浏览器"))
# 执行工作流
result = workflow.run()
assert result.status == WorkflowStatus.SUCCESS
高级用法
条件分支
from rpaworkflow.nodes import ConditionNode
# 创建条件节点
condition_node = ConditionNode(
name="条件判断",
condition=lambda ctx: ctx.get("some_value") > 10,
true_node=SomeNode(name="条件为真时执行"),
false_node=SomeNode(name="条件为假时执行")
)
# 添加到工作流
workflow.add_node(condition_node)
逻辑组合函数
and_ 和 or_ 函数可以组合多个节点的条件,用于创建复杂的条件逻辑。
from rpaworkflow.func import or_, and_
from rpaworkflow.nodes import CheckElementNode
# 创建检查元素节点
check_button1 = CheckElementNode(name="检查按钮1", selector="#button1")
check_button2 = CheckElementNode(name="检查按钮2", selector="#button2")
check_button3 = CheckElementNode(name="检查按钮3", selector="#button3")
# 使用 or_ 函数:前面节点若正常运行, 则不执行下一个节点, 否则执行下一个节点
or_node = or_(check_button1, check_button2)
workflow.add_node(or_node)
# 使用 and_ 函数:前一个节点异常, 不执行下一个节点, 否则执行下一个节点
and_node = and_(check_button1, check_button2, check_button3)
workflow.add_node(and_node)
# 组合使用
complex_condition = or_(check_button1, and_(check_button2, check_button3))
workflow.add_node(complex_condition)
循环节点
from rpaworkflow.nodes import LoopNode, LambdaActionNode
# 创建一个计数器节点
increment_counter = LambdaActionNode(
name="增加计数器",
action=lambda ctx: ctx.set("counter", ctx.get("counter", 0) + 1)
)
# 创建循环节点
loop_node = LoopNode(
name="循环执行",
loop_condition=lambda ctx: ctx.get("counter", 0) < 5, # 循环条件:计数器小于5
loop_node=increment_counter # 循环执行的节点
)
# 初始化计数器
workflow.add_node(LambdaActionNode(
name="初始化计数器",
action=lambda ctx: ctx.set("counter", 0)
))
# 添加循环节点
workflow.add_node(loop_node)
空节点和错误节点
from rpaworkflow.nodes import EmptyNode, ErrorNode, ErrorStorageNode
# 空节点 - 不执行任何操作,可用作占位符
workflow.add_node(EmptyNode(name="空操作"))
# 错误节点 - 抛出异常
workflow.add_node(ErrorNode(
name="抛出错误",
error="自定义错误信息" # 也可以传入Exception对象
))
# 错误存储节点 - 抛出异常并存储到上下文
workflow.add_node(ErrorStorageNode(
name="存储错误",
error="自定义错误信息",
output_key="error_info" # 错误信息将存储在上下文的这个键下
))
贡献
欢迎贡献代码、报告问题或提出改进建议!
许可证
本项目采用 MIT 许可证。详见 LICENSE 文件。
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
rpaworkflow-0.0.3.tar.gz
(144.1 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
rpaworkflow-0.0.3-py3-none-any.whl
(139.2 kB
view details)
File details
Details for the file rpaworkflow-0.0.3.tar.gz.
File metadata
- Download URL: rpaworkflow-0.0.3.tar.gz
- Upload date:
- Size: 144.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a322aac9ecd9428d9a484e874395790c8ee31231b4081c34b2d029c79dc921db
|
|
| MD5 |
3126aeadb6903b5cfa99679c29955fd8
|
|
| BLAKE2b-256 |
1c1a6ddb2283df83fc55ae16e91283e320e5fb247e42a4c2c5fb5e2ebe3cde43
|
File details
Details for the file rpaworkflow-0.0.3-py3-none-any.whl.
File metadata
- Download URL: rpaworkflow-0.0.3-py3-none-any.whl
- Upload date:
- Size: 139.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6010097072fbe9c1f2c37e1c41938f36ee051f41481071d549b5218c185f17e8
|
|
| MD5 |
a73e6a6c89ba8660fe9ac32e404d721e
|
|
| BLAKE2b-256 |
e3cb360a7e87883546e91af1dfe106d2281cc3cc0c429b99969cb22d84f94f88
|