从TagUI原型到Robocorp工程化:开源RPA开发实战指南
1. 项目概述为什么选择TagUI与Robocorp组合最近在跟几个做流程自动化的朋友聊天发现一个挺有意思的现象很多刚入门的RPA开发者要么一头扎进某个商业平台里出不来要么就在开源世界里反复横跳找不到一个既易上手又能应对复杂场景的平衡点。我自己在自动化领域摸爬滚打这些年试过不少工具今天想聊聊一个我个人觉得被严重低估的“黄金组合”——用TagUI来快速构建自动化脚本的原型再用Robocorp来把它变成可维护、可分发、可协作的工业级应用。你可能听说过TagUI它是一个基于Node.js的开源RPA工具最大的特点就是能用接近自然语言的语法来写自动化脚本比如click ‘login_button’或者type ‘username_field’ as ‘myuser’对新手极其友好。而Robocorp则是一个围绕Python生态构建的RPA开发与运行平台它提供了一套完整的工具链包括本地开发环境Robocorp Code、机器人运行器Robocorp Worker、以及云端控制中心Robocorp Control Room。把这两者结合起来就像是先用乐高积木TagUI快速搭出一个模型确认结构和功能没问题再用专业的建筑材料和图纸Robocorp把它加固成真正能住人的房子。这个组合能解决什么实际问题呢首先降低学习与试错成本。TagUI的脚本直观到几乎不需要编程基础就能看懂这让业务人员或初学者能快速验证一个自动化流程的可行性。其次实现从原型到产品的平滑过渡。在TagUI里跑通的流程其核心的“点击”、“输入”、“读取”等操作逻辑可以相对容易地迁移到Robocorp的Python框架中后者提供了更强大的错误处理、日志管理、数据传递和依赖管理能力。最后拥抱开源与可移植性。两者都是开源或提供免费层的工具避免了供应商锁定你的自动化资产完全掌握在自己手里。无论你是想自动化一些重复的网页操作、桌面软件任务还是想系统地学习现代RPA开发的最佳实践这个组合都值得你花时间深入了解。接下来我会带你从零开始手把手完成一个完整的示例自动从某个公开网站比如一个天气预报网站获取信息并整理成一份简单的报告。我们将用TagUI快速实现核心交互逻辑再用Robocorp将其工程化。2. 环境准备与工具链解析在开始写第一行代码之前我们需要把“厨房”收拾好。工欲善其事必先利其器这里的工具链选择直接决定了后续开发的效率和体验。2.1 TagUI安装与初体验TagUI的安装非常简单因为它本质上是一个Node.js包。确保你的系统已经安装了Node.js建议版本12以上然后通过npmNode.js的包管理器一键安装npm install -g tagui安装完成后在命令行输入tagui并回车如果看到帮助信息说明安装成功。TagUI的核心是一个命令行工具它通过读取你编写的脚本文件通常以.tag或.js为后缀来执行自动化操作。它内置了Chrome和Firefox的驱动所以通常不需要你单独去配置复杂的浏览器驱动环境这一点对新手非常友好。我们来快速感受一下。创建一个名为demo.tag的文本文件内容如下// 这是一个简单的TagUI脚本示例 https://www.google.com type q as “TagUI RPA”[enter] wait 5保存后在文件所在目录打开命令行运行tagui demo.tag你会看到TagUI自动打开一个Chrome浏览器导航到Google在搜索框输入“TagUI RPA”并执行搜索然后等待5秒后关闭。整个过程无需你手动干预。这个简单的例子展示了TagUI的核心优势语法直观像写操作说明书。https://表示导航type表示输入[enter]表示按下回车键wait表示等待。几乎不需要解释你就能看懂这段脚本在做什么。注意首次运行时TagUI可能会自动下载必要的浏览器驱动如ChromeDriver这需要网络通畅。如果遇到问题可以尝试使用tagui demo.tag chrome或tagui demo.tag firefox明确指定浏览器。2.2 Robocorp开发环境搭建如果说TagUI是“瑞士军刀”那么Robocorp就是一套“专业车间”。Robocorp强烈推荐使用其官方VSCode扩展“Robocorp Code”进行开发这能获得最好的体验包括代码补全、模板生成、本地调试和一键上传。首先在你的电脑上安装Visual Studio Code。然后在VSCode的扩展市场搜索“Robocorp Code”并安装。安装完成后你会在侧边栏看到一个机器人的图标这就是Robocorp的工作区。接下来我们需要创建一个Robocorp机器人项目。点击Robocorp侧边栏的“Create Robot”按钮你会看到几个模板选项。对于我们从TagUI迁移过来的场景选择“Standard”模板即可它提供了一个最基础的Python机器人结构。给项目起个名字比如weather_info_robot并选择一个本地文件夹存放。创建完成后VSCode会自动打开项目文件夹结构如下weather_info_robot/ ├── robot.yaml # 机器人的配置文件定义依赖、环境变量等 ├── conda.yaml # Conda环境配置文件用于管理Python包依赖 ├── tasks.py # 任务入口文件定义机器人可以执行哪些任务 └── tasks/ └── __init__.py └── task.py # 我们将在这里编写主要的自动化逻辑这个结构是Robocorp的约定它把自动化逻辑封装成标准的Python包。robot.yaml是机器人的“身份证”conda.yaml负责管理Python环境确保所有机器上运行环境一致tasks.py是任务的调度中心而具体的活都在tasks/目录下的模块里干。实操心得很多新手会疑惑为什么需要conda.yaml。在传统的Python开发中你可能用pip install -r requirements.txt。但在RPA场景下机器人可能需要在不同的服务器、甚至虚拟环境中运行。Conda不仅能管理Python包还能管理非Python的依赖比如一些系统库确保你的机器人从你的笔记本到生产服务器都能以完全相同的方式运行这是工业级应用可靠性的基石。2.3 关键依赖安装与配置我们的机器人需要做两件事1) 与网页交互自动化浏览器2) 处理数据。因此我们需要在Robocorp项目中引入相应的库。打开conda.yaml文件在dependencies部分添加我们需要的包。Robocorp官方推荐使用rpaframework库它提供了一系列经过良好封装和测试的RPA组件。我们主要用到其中的rpaframework-python和浏览器自动化组件。将conda.yaml的依赖部分修改为类似下面这样channels: - conda-forge dependencies: - python3.9 # 指定Python版本3.7-3.10皆可 - pip - pip: - rpaframework23.5.0 # RPA框架核心 - rpaframework-core23.5.0 - rpaframework-browser23.5.0 # 浏览器自动化库 - robocorp-browser # 基于Playwright的新一代浏览器库更推荐这里我特别提到了robocorp-browser它是Robocorp基于微软Playwright开发的新浏览器自动化库比传统的Selenium更快速、更稳定并且自动处理浏览器下载。我们后续会主要使用它。修改保存后在VSCode中你可以通过快捷键CtrlShiftP打开命令面板输入 “Robocorp: Update Robot Environment”或者点击Robocorp侧边栏机器人旁边的刷新图标来根据conda.yaml创建或更新Python环境。这个过程可能会花费几分钟因为它要下载并配置一个独立的Conda环境。环境配置好后你可以在VSCode底部状态栏看到当前激活的Python环境已经切换成了你的机器人环境如robocorp-weather_info_robot。至此我们的“专业车间”就准备就绪了。3. 核心思路从TagUI脚本到Robocorp机器人在真正动手写代码之前理清转换思路至关重要。我们不能简单地把TagUI脚本逐行翻译成Python而是要利用Robocorp框架的优势进行结构和设计上的升级。3.1 TagUI脚本原型设计假设我们的目标是访问“中国天气网”的某个城市页面例如北京抓取当前的天气、温度和风力信息并保存到一个文本文件中。我们用TagUI先快速实现这个流程的原型。创建一个weather_tagui.tag文件// 访问中国天气网北京页面 https://www.weather.com.cn/weather/101010100.shtml // 等待页面加载 wait 10 // 获取天气状况假设元素选择器为‘.wea’ read wea_text to ‘.wea’ // 获取温度假设元素选择器为‘.tem’ read tem_text to ‘.tem’ // 获取风力假设元素选择器为‘.win’ read win_text to ‘.win’ // 将读取到的信息打印出来并保存到文件 echo “天气: ‘wea_text’” echo “温度: ‘tem_text’” echo “风力: ‘win_text’” // 将结果写入文件 dump ‘weather_result.txt’ as ‘天气: ‘wea_text’\n温度: ‘tem_text’\n风力: ‘win_text’’这个脚本非常直白。它做了四件事导航、等待、读取三个页面上我们关心的数据、输出并保存。运行这个脚本 (tagui weather_tagui.tag)如果选择器正确你就能在命令行看到输出并生成一个weather_result.txt文件。注意事项这里最大的挑战在于元素选择器。TagUI支持CSS选择器、XPath甚至图像识别等多种方式定位元素。在实际操作中你需要使用浏览器的开发者工具F12来仔细检查目标元素的属性找到唯一、稳定的选择器。上述示例中的.wea、.tem、.win是假设的实际网站的结构可能完全不同且经常变动。这是所有网页自动化中最关键也最耗时的一步。3.2 Robocorp框架下的结构迁移现在我们要把这个简单的原型改造成一个Robocorp机器人。在Robocorp的世界里我们不再写线性的脚本而是编写结构化的Python代码。核心思想是将流程分解为一个个可重用的“任务”或“关键字”。打开Robocorp项目中的tasks/task.py文件我们会看到类似下面的骨架from robocorp.tasks import task from robocorp import browser task def minimal_task(): 这是模板生成的最小任务示例。 pass我们需要做的是定义主任务用task装饰器标记一个函数这就是一个可执行的任务。使用浏览器库导入robocorp.browser来操作浏览器。封装操作步骤将导航、等待、读取数据等操作封装成一个个函数或直接写在任务流程中。处理数据与错误添加数据解析、清理逻辑以及必要的异常处理try-except。生成输出将结果保存为结构化的文件如JSON、CSV而不仅仅是文本。这样的好处是可维护性每个步骤清晰独立修改一个步骤不会影响其他部分。可重用性读取数据、保存文件等操作可以封装成函数在其他机器人中复用。可观测性Robocorp框架内置了丰富的日志功能运行过程一目了然。可协作性代码是标准的Python可以使用Git进行版本管理方便团队协作。接下来我们就进入实操环节一步步实现这个增强版的天气信息机器人。4. 实操构建Robocorp天气信息机器人让我们开始动手将TagUI原型转化为一个健壮的Robocorp机器人。我会详细解释每一步的意图和背后的考量。4.1 初始化项目与浏览器配置首先我们完善tasks/task.py。删除模板内容从头开始编写from robocorp.tasks import task from robocorp import browser from RPA.FileSystem import FileSystem import json from datetime import datetime # 初始化文件系统操作库 lib FileSystem() task def fetch_weather_info(): 主任务获取指定城市的天气信息并保存。 # 定义目标城市和URL以北京为例 city_code “101010100” # 中国天气网的城市代码 url f“https://www.weather.com.cn/weather/{city_code}.shtml” # 输出开始日志 print(f“开始获取天气信息URL: {url}”) try: # 步骤1: 打开浏览器并导航到页面 page open_weather_page(url) # 步骤2: 从页面中抓取我们需要的数据 weather_data extract_weather_data(page) # 步骤3: 处理并保存数据 save_weather_report(weather_data, city_code) print(“天气信息获取并保存成功”) except Exception as e: # 如果过程中出现任何错误记录并抛出 print(f“任务执行失败: {e}”) # 在实际项目中这里可以配置更复杂的错误通知如发送邮件 raise这里我们定义了一个主任务fetch_weather_info。它遵循一个清晰的流程准备参数 - 执行操作 - 处理结果 - 异常处理。我们使用了try...except来捕获可能出现的网络错误、元素找不到等异常这是TagUI脚本中通常缺乏的健壮性设计。4.2 实现页面交互与数据抓取接下来我们实现open_weather_page和extract_weather_data这两个核心函数。这里我们将使用robocorp.browser基于Playwright。在fetch_weather_info函数上方添加def open_weather_page(url: str): 使用浏览器打开指定的天气页面并返回页面对象。 # 配置浏览器以非头模式运行即可见方便调试 browser.configure( browser_engine“chromium” headlessFalse, # 调试时设为False看到浏览器操作生产环境可设为True slowmo100, # 每个操作后延迟100毫秒方便观察生产环境应移除 ) # 启动浏览器上下文并打开新页面 page browser.page() # 导航到目标URL并等待网络空闲状态页面主要资源加载完成 page.goto(url, wait_until“networkidle”) # 显式等待页面中某个关键元素出现确保页面已完全加载 # 这里假设页面有一个id为‘7d’的容器表示7天预报我们等待它出现 page.wait_for_selector(“#7d”, timeout15000) # 最多等待15秒 print(f“已成功导航至页面: {url}”) return page def extract_weather_data(page): 从打开的页面对象中提取天气数据。 weather_data {} # 注意以下选择器仅为示例实际必须根据目标网站HTML结构调整 # 使用Playwright的定位器LocatorAPI它比直接使用选择器字符串更强大 # 示例1: 获取今天第一个的天气情况 # 假设结构是 ul id“7d” li p class“wea”晴/p ... /li /ul try: # 定位到7天预报容器内的第一个li元素中的.wea元素 wea_locator page.locator(“#7d li:nth-child(1) .wea”) weather_data[“condition”] wea_locator.inner_text(timeout5000).strip() except Exception as e: print(f“无法获取天气状况: {e}”) weather_data[“condition”] “N/A” # 示例2: 获取温度可能包含最高温和最低温 try: tem_locator page.locator(“#7d li:nth-child(1) .tem”) # inner_text可能包含换行strip()清理空白 temp_text tem_locator.inner_text(timeout5000).strip() # 简单清理移除可能存在的换行符替换为空格 weather_data[“temperature”] temp_text.replace(‘\n’, ‘ ‘) except Exception as e: print(f“无法获取温度: {e}”) weather_data[“temperature”] “N/A” # 示例3: 获取风力风向 try: win_locator page.locator(“#7d li:nth-child(1) .win i”) wind_text win_locator.get_attribute(“title”, timeout5000) # 假设风力信息在title属性里 if wind_text: weather_data[“wind”] wind_text.strip() else: # 如果title没有再尝试获取文本 weather_data[“wind”] win_locator.inner_text(timeout3000).strip() except Exception as e: print(f“无法获取风力信息: {e}”) weather_data[“wind”] “N/A” # 额外获取数据更新时间假设在某个span里 try: update_locator page.locator(“#update_time”) weather_data[“update_time”] update_locator.inner_text(timeout3000).strip() except: # 如果找不到特定元素使用当前时间 weather_data[“update_time”] datetime.now().strftime(“%Y-%m-%d %H:%M:%S”) print(f“提取到的原始数据: {weather_data}”) return weather_data这段代码有几个关键点浏览器配置browser.configure让你可以精细控制浏览器行为。headlessFalse在开发时至关重要你能亲眼看到自动化过程便于调试。slowmo可以放慢操作速度但正式运行时应该关掉。等待策略page.goto的wait_until参数和page.wait_for_selector是保证脚本稳定性的核心。网页加载速度受网络影响必须等待关键元素出现后再进行操作否则脚本会因找不到元素而失败。定位器LocatorAPIpage.locator(selector)返回一个定位器对象它代表一个或一组DOM元素。使用.inner_text()、.get_attribute()等方法比TagUI的read ... to更灵活、更强大。nth-child(1)这样的CSS选择器可以帮助我们精准定位列表中的第一个项目。健壮的错误处理每个数据抓取步骤都包裹在try...except中。即使某个元素找不到或结构变了机器人也不会完全崩溃而是记录错误并使用默认值“N/A”继续执行。这比TagUI脚本遇到错误就停止要友好得多。4.3 数据处理与报告生成抓取到原始数据后我们通常需要做一些清洗、格式化然后以更友好的方式保存。我们来实现save_weather_report函数def save_weather_report(data: dict, city_code: str): 将天气数据保存为JSON和文本报告。 # 1. 保存为结构化的JSON文件便于其他程序读取 json_filename f“weather_{city_code}_{datetime.now().strftime(‘%Y%m%d_%H%M%S’)}.json” with open(json_filename, ‘w’, encoding‘utf-8’) as f: json.dump(data, f, ensure_asciiFalse, indent2) print(f“数据已保存为JSON文件: {json_filename}”) # 2. 生成一个更易读的文本报告 txt_filename f“weather_report_{city_code}.txt” report_lines [] report_lines.append(“” * 40) report_lines.append(f“城市代码: {city_code} 天气报告”) report_lines.append(f“生成时间: {datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)}”) report_lines.append(“-” * 40) report_lines.append(f“天气状况: {data.get(‘condition’, ‘N/A’)}”) report_lines.append(f“温度: {data.get(‘temperature’, ‘N/A’)}”) report_lines.append(f“风力风向: {data.get(‘wind’, ‘N/A’)}”) report_lines.append(f“数据更新时间: {data.get(‘update_time’, ‘N/A’)}”) report_lines.append(“” * 40) report_content ‘\n’.join(report_lines) # 使用RPA.FileSystem库写入文件它提供了一些额外的便利功能 lib.create_file(txt_filename, report_content, encoding“UTF-8”) print(f“文本报告已生成: {txt_filename}”) print(“\n报告内容:\n”) print(report_content)这个函数做了两件有价值的事结构化存储JSON将数据以JSON格式保存包含了时间戳。这使得数据可以被后续的数据分析脚本、数据库等轻松导入和处理。文件名包含城市代码和时间戳避免了文件覆盖。人性化报告TXT生成一个格式整洁的文本报告方便人类直接阅读。使用了RPA.FileSystem库它是Robocorp框架的一部分提供了跨平台一致的文件操作接口。4.4 本地运行与调试代码写完了怎么运行在Robocorp项目中你有多种方式方法一使用VSCode Robocorp扩展这是最方便的方法。打开tasks.py文件你会看到它自动导入了task.py中的任务。确保tasks.py内容类似如下from tasks import task def run_all_tasks(): 运行所有定义的任务。 task.fetch_weather_info()然后在VSCode中你可以点击Robocorp侧边栏你的机器人项目。在“TASKS”部分你会看到fetch_weather_info。直接点击它旁边的“Run”按钮三角形图标。Robocorp Code会自动启动配置好的Conda环境运行你的机器人。你会在VSCode的“OUTPUT”面板选择“Robocorp”视图看到详细的日志输出。同时浏览器会弹出来因为headlessFalse你可以亲眼目睹整个自动化过程。方法二使用命令行你也可以在项目根目录打开终端确保当前环境是Robocorp机器人环境然后运行python -m robocorp.tasks run tasks.py运行成功后你会在项目根目录看到生成的weather_101010100_xxxxxx.json和weather_report_101010100.txt文件。调试技巧如果脚本运行失败日志是你的第一手资料。Robocorp的日志非常详细。常见问题元素找不到检查选择器是否正确。在浏览器开发者工具中使用$()测试你的CSS选择器如$(“#7d li .wea”)。考虑使用更稳定的属性如>tasks: Run All Tasks: shell: python -m robocorp.tasks run tasks.py variables: default: CITY_CODE: “101010100” # 默认城市代码北京 WEATHER_BASE_URL: “https://www.weather.com.cn/weather” HEADLESS_MODE: “False” # 默认非无头模式方便调试然后修改tasks/task.py从环境中读取这些变量import os from robocorp.tasks import task from robocorp import browser from RPA.FileSystem import FileSystem import json from datetime import datetime lib FileSystem() def get_config(key: str, default: str “”) - str: 从环境变量或robot.yaml中获取配置。优先级环境变量 robot.yaml默认值。 # Robocorp会将robot.yaml中的variables注入到环境变量中并加上前缀‘RC_’ env_key f“RC_{key}” return os.getenv(env_key, default) task def fetch_weather_info(): city_code get_config(“CITY_CODE”, “101010100”) base_url get_config(“WEATHER_BASE_URL”, “https://www.weather.com.cn/weather”) headless get_config(“HEADLESS_MODE”, “False”).lower() “true” url f“{base_url}/{city_code}.shtml” # ... 其余代码 ... browser.configure( browser_engine“chromium” headlessheadless, # 使用配置项 slowmo100, ) # ... 其余代码 ...这样当你需要在其他环境比如测试服务器运行或者想抓取不同城市的天气时只需修改robot.yaml或通过命令行设置环境变量如export RC_CITY_CODE101020100而无需修改代码。5.2 日志记录与监控Robocorp框架内置了结构化的日志。除了使用print更应该使用robocorp.log模块from robocorp import log # 在函数中替换 print 为 log 方法 log.info(f“开始获取天气信息URL: {url}”) log.debug(f“使用的城市代码: {city_code}”) log.warn(“未能找到更新时间元素将使用系统时间。”) log.error(f“任务执行失败: {e}”)结构化日志在Robocorp Control Room云端控制中心中会以更清晰的层级展示方便过滤和搜索。在本地运行你可以在输出中看到不同级别的日志INFO, DEBUG, WARN, ERROR。5.3 异常处理与重试机制网络请求和网页交互充满不确定性。除了基本的try...except对于可能临时失败的步骤如网络超时可以引入重试机制。rpaframework库提供了retry装饰器但我们可以手动实现一个简单的版本import time from functools import wraps def retry_on_failure(max_attempts3, delay2): 一个简单的重试装饰器。 def decorator(func): wraps(func) def wrapper(*args, **kwargs): last_exception None for attempt in range(1, max_attempts 1): try: return func(*args, **kwargs) except Exception as e: last_exception e log.warn(f“{func.__name__} 第{attempt}次尝试失败: {e}”) if attempt max_attempts: time.sleep(delay) # 所有尝试都失败 log.error(f“{func.__name__} 在{max_attempts}次尝试后均失败。”) raise last_exception return wrapper return decorator # 使用装饰器 retry_on_failure(max_attempts2, delay3) def open_weather_page(url: str): # ... 函数体 ...这样open_weather_page在遇到异常时会自动重试最多2次每次间隔3秒提高了流程的鲁棒性。5.4 打包与分发Robocorp机器人的一个巨大优势是易于分发。你可以将整个项目文件夹打包成一个.robot文件这个文件包含了代码、依赖和环境定义可以在任何安装了Robocorp Worker的环境中运行。在项目根目录运行robocorp robot pack这会在output目录下生成一个your_robot.robot文件。你可以将这个文件上传到Robocorp Control Room在云端调度运行或者分发给其他同事他们只需安装Robocorp Worker就可以用一行命令运行你的机器人robocorp robot run your_robot.robot这彻底解决了“在我电脑上能跑在你电脑上不行”的依赖环境问题。6. 常见问题与排查技巧实录在实际开发中你一定会遇到各种各样的问题。下面是我总结的一些典型问题及其解决方法希望能帮你少走弯路。6.1 元素定位失败选择器不稳定这是网页自动化中最常见的问题。网站改版、动态加载、iframe嵌套都会导致选择器失效。排查思路优先使用唯一属性idname># 等待某个特定的网络响应如果知道数据来自某个API with page.expect_response(lambda response: “api/weather” in response.url) as response_info: page.goto(url) response response_info.value # 此时可以确认数据已加载 # 或者等待某个代表加载完成的元素出现 page.wait_for_selector(“div.weather-loaded”, state“attached”, timeout20000)6.2 机器人运行速度慢或超时可能原因及优化slowmo配置开发时用于观察生产环境务必移除或设为0。不必要的等待减少固定的time.sleep改用智能等待wait_for_selector,wait_for_function。浏览器上下文复用如果任务需要打开多个页面复用同一个浏览器上下文而不是每次都打开新浏览器。资源拦截如果页面不需要加载图片、字体、样式表来获取数据可以拦截它们以加速。browser.configure( browser_engine“chromium” headlessTrue, # 拦截不必要的资源 extra_launch_args[“--blink-settingsimagesEnabledfalse”], )6.3 在Robocorp Control Room中运行失败本地成功上传到Control Room失败通常与环境或配置有关。检查清单conda.yaml依赖确保所有依赖包及其版本都已正确列出并且是跨平台的无特定于Windows/Mac/Linux的包。环境变量在Control Room中为机器人进程正确设置了所需的环境变量如RC_CITY_CODE。文件路径在云端运行时当前工作目录可能不同。避免使用绝对路径使用相对路径或Robocorp提供的路径工具如RPA.Robocorp.WorkItems管理输入输出。无头模式云端运行时必须设置为headlessTrue。查看完整日志Control Room提供了详细的运行日志包括标准输出、错误流以及Robocorp的结构化日志。仔细阅读错误堆栈信息。6.4 如何处理验证码或复杂交互对于验证码自动化通常不是最佳解决方案。应考虑联系网站所有者询问是否有供自动化使用的API接口。第三方服务使用专业的验证码识别服务需要评估成本和合规性。设计流程绕过能否在验证码有效期内复用会话Cookie能否将需要人工干预的步骤分离出来采用“人机协作”模式Robocorp也支持。对于复杂交互如拖拽、画布绘制Playwright提供了丰富的API如page.mouse进行模拟拖拽。但实现起来复杂度高需仔细测试。7. 扩展思路从示例到真实工作流我们构建的天气机器人只是一个起点。RPA的价值在于将多个这样的“小自动化”连接起来形成端到端的工作流。场景扩展每日天气报告邮件定时触发在Robocorp Control Room中设置机器人每天早晨7点自动运行。多城市数据修改机器人从一个配置文件或数据库中读取多个城市代码循环抓取。数据聚合将所有城市的数据汇总到一个Excel表格或JSON文件中。生成报告使用RPA.PDF或RPA.Excel库生成格式精美的每日天气简报PDF。发送邮件使用RPA.Email库将生成的PDF报告作为附件发送给指定的团队成员邮箱列表。技术栈深化数据存储将抓取的数据存入SQLite、PostgreSQL数据库便于历史查询和分析。工作流编排使用Robocorp Control Room的“流程”功能将数据抓取、清洗、报告生成、发送邮件等不同机器人串联起来。异常通知如果机器人运行失败除了记录日志还可以通过RPA.Email或集成钉钉/企业微信/webhook即时发送告警给负责人。从使用TagUI快速验证一个想法到用Robocorp构建出健壮、可调度、可监控的自动化生产流程这个跨越正是从“脚本小子”到“RPA工程师”的成长路径。这个组合给了你从快速原型到工业级部署的全套工具剩下的就是发挥你的想象力去自动化那些枯燥重复的工作了。