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以上),然后通过npm(Node.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: - python=3.9 # 指定Python版本,3.7-3.10皆可 - pip - pip: - rpaframework==23.5.0 # RPA框架核心 - rpaframework-core==23.5.0 - rpaframework-browser==23.5.0 # 浏览器自动化库 - robocorp-browser # 基于Playwright的新一代浏览器库,更推荐这里我特别提到了robocorp-browser,它是Robocorp基于微软Playwright开发的新浏览器自动化库,比传统的Selenium更快速、更稳定,并且自动处理浏览器下载。我们后续会主要使用它。
修改保存后,在VSCode中,你可以通过快捷键Ctrl+Shift+P打开命令面板,输入 “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”, headless=False, # 调试时设为False,看到浏览器操作;生产环境可设为True slowmo=100, # 每个操作后延迟100毫秒,方便观察,生产环境应移除 ) # 启动浏览器上下文并打开新页面 page = browser.page() # 导航到目标URL,并等待网络空闲状态(页面主要资源加载完成) page.goto(url, wait_until=“networkidle”) # 显式等待页面中某个关键元素出现,确保页面已完全加载 # 这里假设页面有一个id为‘7d’的容器(表示7天预报),我们等待它出现 page.wait_for_selector(“#7d”, timeout=15000) # 最多等待15秒 print(f“已成功导航至页面: {url}”) return page def extract_weather_data(page): """从打开的页面对象中提取天气数据。""" weather_data = {} # 注意:以下选择器仅为示例,实际必须根据目标网站HTML结构调整! # 使用Playwright的定位器(Locator)API,它比直接使用选择器字符串更强大 # 示例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(timeout=5000).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(timeout=5000).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”, timeout=5000) # 假设风力信息在title属性里 if wind_text: weather_data[“wind”] = wind_text.strip() else: # 如果title没有,再尝试获取文本 weather_data[“wind”] = win_locator.inner_text(timeout=3000).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(timeout=3000).strip() except: # 如果找不到特定元素,使用当前时间 weather_data[“update_time”] = datetime.now().strftime(“%Y-%m-%d %H:%M:%S”) print(f“提取到的原始数据: {weather_data}”) return weather_data这段代码有几个关键点:
- 浏览器配置:
browser.configure让你可以精细控制浏览器行为。headless=False在开发时至关重要,你能亲眼看到自动化过程,便于调试。slowmo可以放慢操作速度,但正式运行时应该关掉。 - 等待策略:
page.goto的wait_until参数和page.wait_for_selector是保证脚本稳定性的核心。网页加载速度受网络影响,必须等待关键元素出现后再进行操作,否则脚本会因找不到元素而失败。 - 定位器(Locator)API:
page.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_ascii=False, indent=2) 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”视图,看到详细的日志输出。同时,浏览器会弹出来(因为headless=False),你可以亲眼目睹整个自动化过程。
方法二:使用命令行你也可以在项目根目录打开终端,确保当前环境是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”, headless=headless, # 使用配置项 slowmo=100, ) # ... 其余代码 ...这样,当你需要在其他环境(比如测试服务器)运行,或者想抓取不同城市的天气时,只需修改
robot.yaml或通过命令行设置环境变量(如export RC_CITY_CODE=101020100),而无需修改代码。5.2 日志记录与监控
Robocorp框架内置了结构化的日志。除了使用
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_attempts=3, delay=2): """一个简单的重试装饰器。""" 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_attempts=2, delay=3) 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嵌套都会导致选择器失效。
排查思路:
- 优先使用唯一属性:
id>name>># 等待某个特定的网络响应(如果知道数据来自某个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”, timeout=20000)6.2 机器人运行速度慢或超时
可能原因及优化:
slowmo配置:开发时用于观察,生产环境务必移除或设为0。- 不必要的等待:减少固定的
time.sleep,改用智能等待(wait_for_selector,wait_for_function)。- 浏览器上下文复用:如果任务需要打开多个页面,复用同一个浏览器上下文,而不是每次都打开新浏览器。
- 资源拦截:如果页面不需要加载图片、字体、样式表来获取数据,可以拦截它们以加速。
browser.configure( browser_engine=“chromium”, headless=True, # 拦截不必要的资源 extra_launch_args=[“--blink-settings=imagesEnabled=false”], )6.3 在Robocorp Control Room中运行失败
本地成功,上传到Control Room失败,通常与环境或配置有关。
检查清单:
conda.yaml依赖:确保所有依赖包及其版本都已正确列出,并且是跨平台的(无特定于Windows/Mac/Linux的包)。- 环境变量:在Control Room中为机器人进程正确设置了所需的环境变量(如
RC_CITY_CODE)。- 文件路径:在云端运行时,当前工作目录可能不同。避免使用绝对路径,使用相对路径或Robocorp提供的路径工具(如
RPA.Robocorp.WorkItems管理输入输出)。- 无头模式:云端运行时必须设置为
headless=True。- 查看完整日志: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工程师”的成长路径。这个组合给了你从快速原型到工业级部署的全套工具,剩下的,就是发挥你的想象力,去自动化那些枯燥重复的工作了。