studio
2022.4
false
Studio 用户指南
Last updated 2024年8月7日

重用用户界面组件的方法

UiPath 项目有两个主要层:

  • 逻辑层 - 包含流程流所需的所有数据验证和处理以及任何其他逻辑指令。
  • GUI 交互层 - 用于提取数据并将数据输入到应用程序中。

为避免出现与组件的可维护性和可重用性相关的问题,您可以通过创建一系列包含专用于与用户界面交互的可重用组件的来分离 GUI 交互层。这样,您可以创建一个功能丰富且非常强大的库,该库易于维护(仅包含 GUI 交互元素,不包含其他依赖于流程的逻辑),并且可重用性极强(自动化同一个应用程序的另一个流程很可能至少重用某些组件)。

此外,Studio v2020.10 中引入的对象存储库带来了一种全新的方式,用于创建和管理用户界面自动化中使用的元素,从而在很大程度上改变了构建可扩展且高度可重用的用户界面自动化的方式。

本文定义了一种方法,通过该方法,我们可以使用库和对象存储库来构建易于维护且可重用的代码,描述其背后的架构原则和最佳实践,并详细介绍创建可重用组件所需的步骤,以及几个使用 ACME 网页应用程序的示例。

一般原则

无论使用何种编程语言或平台,都有多个软件开发原则可供运用,事实证明,这些原则在使用 UiPath Studio 进行 RPA 开发时非常有用。

关注点分离

这是要考虑的最重要原则。“关注点分离”规定必须将程序分成不同的部分,以便每个部分处理单独的关注点。在本例中,我们需要对解决方案进行分层,这意味着每个部分都应成为一个层。通过按层分离解决方案,可以单独测试各个层。对于普通软件应用程序,我们通常具有三个不同的层:

  • 表示层是指与用户的交互,它显示数据并将数据呈现给用户。此层不应包含业务逻辑。 

    在 RPA 项目的上下文中,GUI 交互层将取代此层,因为自动化的主要目标是与其他应用程序交互,而不是与实际用户交互。

  • 域层与域逻辑相关,指的是应用程序解决的一般业务/问题域。

    在 RPA 项目的上下文中,这是与应用程序逻辑相关的逻辑层

  • 持久层是存储应用程序所需数据的位置。

    这不是 RPA 项目中的强制层,因为有些用例没有永久数据存储。鉴于本文的范围,我们将忽略此层。

单一职责

在设计 RPA 项目时,我们需要考虑的另一个原则是单一职责原则。这意味着 XAML 文件应该做一件事,而且只能做一件事。此原则与低耦合高内聚原则相关联。这意味着即使代码是分层的,代码也应模块化。因此,单个层可以有多个模块。

  • 低耦合意味着一个模块应尽可能少地依赖另一个模块。在 UiPath 项目中,我们通过使用库来实现模块化(您可以在“方法”部分找到更多相关信息)。
  • 高内聚意味着与同一个应用程序关联的操作应保留在同一个模块中。

利用对象存储库

RPA 流程可以简单地定义为数据、数据操作和应用程序交互的组合。



  • 数据 - 定义变量或参数时选择的预定义数据类型,或者可以在 Studio 中导入并使用的自有类型。此外,v2020.10 中引入的 Data Service 功能提供了一个集中位置,您可以在该位置创建数据类型并跨自动化重用这些数据类型。
  • 数据操作- 可以通过作为自动化和/或数据操作表达式构建块的活动来完成数据操作。活动以包的形式提供,您可以在 Studio 中安装。当可用的包未涵盖某些功能时,您还可以创建自己的自定义活动。有关如何构建自定义 UiPath 活动的更多信息,请参阅创建自定义活动
  • 应用程序交互 - 可以通过用户界面自动化或集成/API 完成。用户界面自动化可用于目前的大多数应用程序。用户界面交互组件可以在库或对象存储库的帮助下重用。

对象存储库具有层次结构,其中每个节点代表应用程序级别下的屏幕或元素。结构如下所示:

  • 用户界面应用程序是目标应用程序,可以具有多个版本,并且每个版本可以具有多个屏幕。
  • 屏幕是一个用户界面作用域,它将属于同一个屏幕的多个元素分组在一起。用户界面作用域可以提取自工作流中的活动,也可以在捕获元素时生成。
  • 用户界面元素包含全部或部分元素选取器、锚点选取器、屏幕和元素图像捕获上下文以及描述屏幕上元素的其他元数据。
  • 用户界面描述符是选取器的超集,其中包含唯一标识屏幕元素的信息。用户界面描述符提取自工作流中的活动,并添加到结构化架构中,该架构按应用程序、应用程序版本、屏幕和用户界面元素对它们进行分组。在分类结构中,只有屏幕和元素包含描述符信息,其余部分用于分组,其作用是确保成功地在应用程序的不同版本之间进行升级。

例如,在下图中,我们可以识别:

  • 用户界面应用程序:ACME 版本 1.0.0。
  • 屏幕:仪表板、发票、登录。
  • 用户界面元素:电子邮件、登录按钮。



对于对象存储库中的每个元素和屏幕,请提供以下详细信息:

  • 屏幕、页面或元素在用户界面中显示的确切名称(例如,“登录按钮”)。
  • 类型,例如按钮输入(仅适用于元素)。
  • 可选说明。我们建议添加有关如何使用该元素的简要概述(例如,“单击‘登录’以完成登录过程”)。
  • 用户界面描述符 - 唯一标识元素的信息。包含传统选取器、模糊选取器和基于图像的自动化。我们建议仅在其他方法不起作用时使用基于图像的自动化。



有关如何使用对象存储库的更多信息,请参阅关于对象存储库

通过组合工作流库和对象存储库进行纵向扩展

对象存储库会显著影响构建用户界面自动化的难易程度和效率,但为了充分利用此功能,您可以将对象存储库元素合并到一个单独的库项目中,该库项目还包括必须构建的所有用户界面交互。这使您能够构建不包含用户界面交互且仅包含自动化逻辑的项目。

我们建议为您计划自动化的每个应用程序构建一个库,并将所有用户界面交互和对象存储库元素添加到该库中。然后,可以从属于逻辑层(主项目)一部分的工作流文件调用库活动。这可确保:

  • 对用户界面交互的更改不会影响应用程序的逻辑。这可以比作模型-视图-控制器分离,在我们的示例中,模型层主要关注从控制器传递到视图的数据。
  • 发布库并创建包后,即可在不同的项目中引用该库,而无需每次都重写,也无需在多个项目之间复制并粘贴代码。如果用户界面交互发生更改,则可以更新该库,发布新版本,并更新所有项目以使用最新版本。此外,逻辑层中可能发生的更改不会影响用户界面交互。
  • 由于 Orchestrator 可以存储同一个库的多个版本,因此,如果必须再次使用早期版本,则可以轻松找回该版本。这样,可以在不同的项目中使用同一个库的不同版本,并且单个自动化项目可以立即在同一个库的不同版本之间切换。

使用此方法,主自动化项目(控制器)将包含所有依赖于流程的逻辑,并将通过利用库中的工作流(可将其视为伪视图)与用户界面交互。最后,模型由参数表示,这些参数可帮助我们在这两个组件之间传递数据。



创建用户界面库

按照以下步骤创建上述用户界面库:

1. 分析您的流程,并将其分解为所包含的步骤

我们建议创建流程图以将流程可视化。

2. 将每个步骤分配给一个类别

根据所属的层,将每个步骤分配给 GUI 层类别或逻辑层类别。例如:

  • 将“单击”、“输入信息”和“获取文本”等步骤分配给 GUI 交互层。

    提示:不要将单一活动添加到库中,而应仅添加更复杂的操作,例如“单击直到用户界面中出现某些内容”、“浏览表格的所有页面并提取所有行”或更复杂的操作(例如登录,由多个较小的 GUI 交互部分组成)。一般规则是,添加到库中的每个组件都应是操作,即涉及多个活动的更复杂的自动化,而不是单个用户界面自动化活动。

  • 将文件处理、数据验证和筛选、业务异常处理等操作分配给逻辑层。请记住,逻辑层必须调用 GUI 层才能执行其步骤。

3. 为自动化中使用的每个应用程序创建单独的库

4. 填充并发布用户界面库

对于您创建的每个库,请执行以下操作:

  1. 在对象存储库中创建应用程序对象和必要的屏幕。



  2. 对于对象存储库中的每个屏幕,创建必要的元素并构建其描述符。



    注意: 如果您无法使用对象存储库,请遵循相同的过程,但跳过前两个步骤(4-1 和 4-2)。
  3. 为每个必要的操作开发一个 XAML 文件。可以在构建新的工作流文件时添加屏幕和元素,所以此步骤可以与前两个步骤互换执行。

    例如,以下是为自动化 Acme 测试流程而构建的一些组件。



  4. 将库发布到 Orchestrator 或本地 NuGet 订阅源。

5. 在自动化项目中安装库

从“管理包”窗口中安装必要的库,以将其添加为项目依赖项。库中的每个工作流都作为活动在“活动”面板中提供。您可以将它们拖放到项目工作流中,并以使用活动的相同方式使用它们。



最佳实践

参数

  • 使用帕斯卡拼写法标准为参数命名。这是用于 UiPath Studio 库中的活动参数的标准。
  • 不要在参数名称前面附加 in_out_, 和 io_ 前缀,因为它们将显示为库中的活动的属性。

    例如,参数可能如下图所示。如果查看已发布的组件,您会发现参数已根据其类型分为不同的类别,因此添加前缀是多余的。



  • GUI 库中打开/启动应用程序以实现自动化的所有工作流(例如,打开并登录应用程序的活动)都应使用类型为 UiPath.Core.UiElement(对于新式设计体验)或者 UiPath.Core.WindowUiPath.Core.Browser(对于传统体验)的输出参数返回生成的应用程序窗口。此外,对于传统体验和新式体验,包中的所有其他活动都应具有类型为 UiPath.Core.WindowUiPath.Core.Browser 的输入参数,该参数指定了应在其中执行当前操作的正确窗口。如果您在流程运行时打开了应用程序的多个实例,这将非常有用。如果您使用的是传统设计体验,请不要将选取器作为参数发送。

要为 ACME 网站 开发自动化组件库(可以在下面下载示例库),您需要一个组件,该组件可打开浏览器并执行登录操作。此活动应接受用户名、密码、站点 URL 作为参数,并返回浏览器元素。(可选)为了支持在现有窗口中进行登录的场景,可以将浏览器作为输入/输出参数发送。

浏览器元素的类型为 UiPath.Core.UiElement



参数如下所示:



构建打开浏览器的工作流(例如“登录”工作流)时,您必须首先检查“浏览器”参数是否为空,如果为空,则在单独的工作流和新浏览器中打开 <https://acme-test.uipath.com/>:



执行登录并将浏览器元素传递回流程后,此库中的所有其他活动都需要该参数。例如,从网站下载所有发票的活动将具有以下参数:



如果未将有效的浏览器传递给此活动,则执行将导致发生错误。

错误处理

  • 在库中,始终在出现错误时引发错误,不通过输出参数针对错误发出信号。
  • 我们建议在库组件结束时验证其结果。检查是否发生了所需的操作,如果没有发生,则引发异常。
示例
创建执行应用程序登录的组件时,您可能希望在未正确执行登录时引发异常。为此,请在输入凭据并单击“登录”按钮后,添加“查看应用程序状态”活动(使用新式设计体验时)或“存在元素”活动(使用传统设计体验时),并将该活动的超时设置为 10 秒,以检查是否显示“欢迎…”标签。如果该活动返回 false,则表示身份验证流程不成功,并引发异常:


结构和命名

为每个活动创建一个组件意味着您的库将很快变得非常大。为使开发者能够轻松地在“活动”面板中识别组件,定义组件命名标准是至关重要的。我们推荐的组件命名标准为 {操作} {活动使用的实体}。此标准:

  • 使开发者可以按组件名称、该活动执行的操作或在执行该操作期间使用的实体搜索组件。
  • 使您可以非常轻松地了解组件的用途以及与组件交互的应用程序页面。

在某些情况下,您可以仅使用 {操作}。如果未对某个实体(例如登录)执行操作,或者您需要通过向名称添加更多属性(用空格分隔每个属性)来借助名称提供更多信息,则可以这样做。

此外,我们建议在库项目中创建一个文件夹结构,并将相似的组件分组到同一个文件夹中。实用的经验法则是,在 GUI 层中为您与之交互的每个主要实体创建一个文件夹。如果应用程序中有大量实体可供交互,则可以使用多层文件夹结构。这可大大提高库的内聚性,并使您可以更轻松地查看可用于每个实体的可能操作。

可以使用组件与之交互的实体的名称 {活动使用的实体} 或组件执行的常规活动的名称 {操作} 为文件夹命名。例如,如果要创建一个文件夹,用于存储在网页应用程序页面之间导航的所有组件,可以将该文件夹命名为“导航”。

命名约定也需要应用于对象存储库实体(例如屏幕或元素),最好与工作流和文件夹的命名约定相同,即帕斯卡拼写法。

示例

ACME 网站 (https://acme-test.uipath.com/) 包含多个页面,用户可以通过这些页面与工作项目、支票、帐户、供应商、发票等实体交互。



在创建包含与 ACME 网站中上述项目交互的组件的库时,您可以创建一个文件夹结构并为库中的工作流命名,如下图所示:



注意:我们建议对每个组件/文件夹的名称使用词首字母大写标准(应用程序名称操作活动使用的实体)。

大型解决方案的方法

在大型自动化项目中,库中的几个组件可能具有非常相似甚至相同的代码段。在这种情况下,您应该将此组件隔离在单独的工作流中,如果您希望禁止从库外部访问此工作流,请将其标记为“从发布中忽略”,以将其设为私有。

此外,可能需要在多个流程之间实现相同的逻辑。在这种情况下,应将可重用逻辑片段隔离在单独的库中。

下图概述了此类解决方案的结构:



收益

  • 仅构建一层,而不会干扰另一层。
  • 重用现有代码,而无需在每次使用时都重写代码。
  • 当应用程序发生更新时,轻松更改用户界面交互,并将更改推送到使用该库的所有流程,而无需重新发布。
  • 在多个流程之间共享用户界面交互层意味着对同一个模块进行更彻底的测试,并且可以一次对所有流程进行任何修复,从而实现非常强大且可靠的自动化。
  • 借助专用的 GUI 交互库,可以非常轻松地构建专用的测试自动化项目,以测试特定应用程序的用户界面自动化,从而确保代码非常易于测试,并快速检测到应用程序的重大更改。

示例项目

为了举例说明如何利用对象存储库来创建和使用库,我们使用 ACME 网页应用程序创建了一个用例。

Acme_ObjectRepository 库包含所有 ACME 自动化活动。尽管该库是一个专注于与 ACME 网页应用程序交互的模块,但它也根据用途进行模块化并组织到多个文件夹中:



以下是库组件的快速细分:

  • 登录 Acme.xaml - 登录到应用程序。它包含以下参数:

    • 四个输入参数(URL、用户名、密码、所需超时)。
    • 类型为 UiPath.Core.UiElement 的浏览器输入/输出参数。此组件将附加到任何已打开的 ACME 窗口,或者打开新的浏览器窗口(如果尚未打开)并执行登录。浏览器参数将返回浏览器窗口,并且此变量将传递给库中的所有其他组件。



  • 注销 Acme.xaml - 从导航模块调用“导航到主页”工作流,随后终止当前会话。 
  • 用户选项模块 - 包含可更改 ACME 网页应用程序中当前帐户配置的选项。 

    • 重置测试数据.xaml - 重置 ACME 应用程序中使用的测试数据。
  • 发票模块 - 包含对测试数据中找到的发票执行的操作。

    • 下载所有发票.xaml - 提取应用程序内发票表格中的所有项目,并将其作为 DataTable 返回。
    • 按供应商税号下载发票xaml - 浏览整个发票表格,直至找到具有特定税号的发票,然后返回该发票。 
  • 导航模块 - 包含在 Web 应用程序的各个页面之间导航的工作流

    • 此模块中的组件主要由其他库工作流使用,通常不应直接从主流程调用。但是,它们标记为可发布,因为它们在有人值守流程中可能很有用,在这种流程中,我们可能希望机器人导航到特定页面,然后允许用户与应用程序交互。
  • 工作项目模块 - 包含对应用程序中找到的工作项目执行的操作。

    • 下载所有工作项目.xaml - 下载测试数据中的所有工作项目。

流程

主项目 AcmeProcess_ObjectRepository 包含四个不同的用例。它要求用户创建一个名为 ACMETest 的通用类型 Windows 凭据,以保存机器人用于登录 ACME Web 应用程序的用户名和密码。

此流程中的用例组件使用 ACME 用户界面组件库中内置的多个组件来执行各种任务。

调用 Main.xaml 工作流时,机器人将登录 ACME 应用程序,然后会出现一个对话框,提示用户选择一个用例,然后调用与用户选择对应的工作流:



测试项目

测试项目 Test_UiPath.AcmeProcess_ObjectRepository 包含五个不同的测试用例,用于测试流程的不同功能:登录/注销、下载所有发票/按供应商税号下载发票、下载工作项目。

此页面有帮助吗?

获取您需要的帮助
了解 RPA - 自动化课程
UiPath Community 论坛
Uipath Logo White
信任与安全
© 2005-2024 UiPath。保留所有权利。