UI WPF 中的自动化、Ribbon Control 和 Automation Anywhere 11
UI Automation, Ribbon Control and Automation Anywhere 11 in WPF
我正在 Automation Anywhere 11 中构建一个新的机器人,最近我在尝试自动化 Windows 功能区时发现了一个棘手的情况。
如果我只有 一个选项卡,一切都按预期工作,我可以识别里面的所有按钮,但如果我有多个选项卡,则只有最后一个选项卡元素对 Object Cloning 选项,我添加了唯一的名称、AutomationID 等。但没有任何效果。这是问题的预览:
这是我的例子XAML代码:
<UserControl x:Class="Example.RibbonMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
xmlns:my="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon">
<my:Ribbon x:Name="R1" AutomationProperties.AutomationId="R1ID">
<my:RibbonTab Header="Tab 1" x:Name="Tab1" AutomationProperties.AutomationId="Tab1ID">
<my:RibbonGroup x:Name="GB1" AutomationProperties.AutomationId="RG1ID">
<my:RibbonButton Label="Button 1" x:Name="RB1" AutomationProperties.AutomationId="RB1ID" />
</my:RibbonGroup>
</my:RibbonTab>
<my:RibbonTab Header="Tab 2" x:Name="Tab2" AutomationProperties.AutomationId="Tab2ID">
<my:RibbonGroup x:Name="RG2" AutomationProperties.AutomationId="RG2ID">
<my:RibbonButton Label="Button 2" x:Name="RB2" AutomationProperties.AutomationId="RB2ID" />
<my:RibbonButton Label="Button 3" x:Name="RB3" AutomationProperties.AutomationId="RB3ID" />
</my:RibbonGroup>
</my:RibbonTab>
</my:Ribbon>
</UserControl>
此外,我已经阅读了多个选项:
UI Automation and Ribbon control
XAML - Binding row and column index of cell to automation ID
Unable to generate Automation ID for WPF Controls, to be used by coded UI for automation testing
How can I find WPF controls by name or type?
但是直到最近,我尝试过的所有方法都没有奏效,我确定问题与最后一个选项卡有关。另外,正如我在评论部分所说,我也尝试了 Legacy Option 和 Manage Windows Controls。以下是一些预览:
已启用旧版选项:
管理 Windows 控制:
此外,还有另一个功能区应用程序,如可以识别按钮的画图:
此外,我测试了另一个微软工具:AccExplorer32.exe,它显示了完全相同的行为,证明这不是 AA 或 UiPath 的限制,而是从编码的角度来看,这里有一个预览:
有人知道如何解决吗?或者有没有经历过类似的事情?感谢您的帮助。
P.S.
我不想回答有关 图像识别 或 MetaBots (部分解决方案,在 AA) 的情况下非常好作为选项,因为这是一个编程问题,我有兴趣解决它。
我发现了关于 TabControl 的第二个问题。如果出于任何原因当您 只有 一个 TabItem 处于活动状态并且您决定隐藏 选项卡名称 出于审美原因,我的建议是 为机器人启用它 因为如果你隐藏它那么机器人就无法在里面找到任何元素,你可能需要一个 MetaBot,它不会像你一样可靠想要。
不工作:
即使使用 MetaBots,这些选项卡也不起作用:
工作:
- 此外,我能够找到一个示例,其中包含 Window Forms、Windows SDK 和来自 MS 的常规功能区,它从第一次开始就按预期工作,没有任何具体调整。
如果我们在 WPF 中找不到解决方案,这就是部分解决方案(我非常怀疑,没有这种可能性)。有人建议我使用 MetaBot,它能够筛选整个 window,是的,通过这种方式,您可以识别所有可见的控件(并非在所有工具中,即没有启用 SAP 脚本的 SAP,这是不可能的)。
但是,我不会推荐它,因为这不会解决主要问题或带来稳定性在未来的变化或屏幕上的剧烈变化或UI。
此外,根据我的经验,我可以假设效率会降低,因为在 "regular process" 中您将访问 基于 Object Cloning 的独特控件的特定 AutomationID 而在 MetaBot 中,您将不断访问全屏获取所有控件,然后使用您创建的逻辑一一选择,您将需要每次为每个屏幕重复相同的操作,并为每个操作遵循相同的模式。此外,为什么我认为它效率较低,您可能会问,因为您正在增加解决方案的复杂性。
如果我找到更好的答案或解决方案,我会尽快添加它。
P.S.
它不适用于 A2019。 AA 删除了对 MetaBots 的支持,目前除了图像识别外没有其他选择。
目前,这是唯一的解决方案,因为 Microsoft(他们试图让我闭嘴,将我的问题移至 Off-Topic 部分,并且没有回复我的评论以将其移回正确的论坛)也没有 AA(我与他们进行了长时间的交谈,他们不想承担任何责任或向 MS 提出支持请求)想要提供帮助。
重要的是强调不需要可靠的解决方案,因为下一个版本的 Automation Anywhere v2019 是 一个完全不同的工具,基于不同的技术,它可能不支持所有的东西"in the beginning"并且可能会崩溃你所有的机器人并可能导致re-write你的机器人从头开始(我谈到这个是因为他们没有合适的迁移工具)。
我正在 Automation Anywhere 11 中构建一个新的机器人,最近我在尝试自动化 Windows 功能区时发现了一个棘手的情况。
如果我只有 一个选项卡,一切都按预期工作,我可以识别里面的所有按钮,但如果我有多个选项卡,则只有最后一个选项卡元素对 Object Cloning 选项,我添加了唯一的名称、AutomationID 等。但没有任何效果。这是问题的预览:
这是我的例子XAML代码:
<UserControl x:Class="Example.RibbonMenu"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
xmlns:my="http://schemas.microsoft.com/winfx/2006/xaml/presentation/ribbon">
<my:Ribbon x:Name="R1" AutomationProperties.AutomationId="R1ID">
<my:RibbonTab Header="Tab 1" x:Name="Tab1" AutomationProperties.AutomationId="Tab1ID">
<my:RibbonGroup x:Name="GB1" AutomationProperties.AutomationId="RG1ID">
<my:RibbonButton Label="Button 1" x:Name="RB1" AutomationProperties.AutomationId="RB1ID" />
</my:RibbonGroup>
</my:RibbonTab>
<my:RibbonTab Header="Tab 2" x:Name="Tab2" AutomationProperties.AutomationId="Tab2ID">
<my:RibbonGroup x:Name="RG2" AutomationProperties.AutomationId="RG2ID">
<my:RibbonButton Label="Button 2" x:Name="RB2" AutomationProperties.AutomationId="RB2ID" />
<my:RibbonButton Label="Button 3" x:Name="RB3" AutomationProperties.AutomationId="RB3ID" />
</my:RibbonGroup>
</my:RibbonTab>
</my:Ribbon>
</UserControl>
此外,我已经阅读了多个选项:
UI Automation and Ribbon control
XAML - Binding row and column index of cell to automation ID
Unable to generate Automation ID for WPF Controls, to be used by coded UI for automation testing
How can I find WPF controls by name or type?
但是直到最近,我尝试过的所有方法都没有奏效,我确定问题与最后一个选项卡有关。另外,正如我在评论部分所说,我也尝试了 Legacy Option 和 Manage Windows Controls。以下是一些预览:
已启用旧版选项:
管理 Windows 控制:
此外,还有另一个功能区应用程序,如可以识别按钮的画图:
此外,我测试了另一个微软工具:AccExplorer32.exe,它显示了完全相同的行为,证明这不是 AA 或 UiPath 的限制,而是从编码的角度来看,这里有一个预览:
有人知道如何解决吗?或者有没有经历过类似的事情?感谢您的帮助。
P.S.
我不想回答有关 图像识别 或 MetaBots (部分解决方案,在 AA) 的情况下非常好作为选项,因为这是一个编程问题,我有兴趣解决它。
我发现了关于 TabControl 的第二个问题。如果出于任何原因当您 只有 一个 TabItem 处于活动状态并且您决定隐藏 选项卡名称 出于审美原因,我的建议是 为机器人启用它 因为如果你隐藏它那么机器人就无法在里面找到任何元素,你可能需要一个 MetaBot,它不会像你一样可靠想要。
不工作:
即使使用 MetaBots,这些选项卡也不起作用:
工作:
- 此外,我能够找到一个示例,其中包含 Window Forms、Windows SDK 和来自 MS 的常规功能区,它从第一次开始就按预期工作,没有任何具体调整。
如果我们在 WPF 中找不到解决方案,这就是部分解决方案(我非常怀疑,没有这种可能性)。有人建议我使用 MetaBot,它能够筛选整个 window,是的,通过这种方式,您可以识别所有可见的控件(并非在所有工具中,即没有启用 SAP 脚本的 SAP,这是不可能的)。
但是,我不会推荐它,因为这不会解决主要问题或带来稳定性在未来的变化或屏幕上的剧烈变化或UI。
此外,根据我的经验,我可以假设效率会降低,因为在 "regular process" 中您将访问 基于 Object Cloning 的独特控件的特定 AutomationID 而在 MetaBot 中,您将不断访问全屏获取所有控件,然后使用您创建的逻辑一一选择,您将需要每次为每个屏幕重复相同的操作,并为每个操作遵循相同的模式。此外,为什么我认为它效率较低,您可能会问,因为您正在增加解决方案的复杂性。
如果我找到更好的答案或解决方案,我会尽快添加它。
P.S.
它不适用于 A2019。 AA 删除了对 MetaBots 的支持,目前除了图像识别外没有其他选择。
目前,这是唯一的解决方案,因为 Microsoft(他们试图让我闭嘴,将我的问题移至 Off-Topic 部分,并且没有回复我的评论以将其移回正确的论坛)也没有 AA(我与他们进行了长时间的交谈,他们不想承担任何责任或向 MS 提出支持请求)想要提供帮助。
重要的是强调不需要可靠的解决方案,因为下一个版本的 Automation Anywhere v2019 是 一个完全不同的工具,基于不同的技术,它可能不支持所有的东西"in the beginning"并且可能会崩溃你所有的机器人并可能导致re-write你的机器人从头开始(我谈到这个是因为他们没有合适的迁移工具)。