UIAutomation 和远程桌面连接

6
我有一个应用程序,可以对任意Windows应用程序进行自动化。我一直在使用记事本进行测试。
在这个自动化过程中,我必须从代码中调用事件。目前,我支持两种类型的事件,因为它们似乎是最常见的:InvokePatternExpandCollapsePattern
我使用的是一台可以远程桌面连接的计算机进行测试。但是很奇怪,当我通过远程桌面连接到计算机时,应用程序可以正常工作。当我断开与计算机的连接时,我的代码停止使用ExpandCollapsePattern(InvokePattern仍然可以正常工作)。我会收到InvalidOperationException异常。
文档说,只有在节点被标记为LeafNode时才会抛出此异常。那么,为什么使用远程桌面连接会导致我收到InvalidOperationException异常呢?
以下是我目前用于执行事件的代码。
ExpandCollapseState state =
    patternMenu.Current.ExpandCollapseState;
if (state == ExpandCollapseState.Expanded)
    patternMenu.Collapse();
else if (state == ExpandCollapseState.PartiallyExpanded ||
         state == ExpandCollapseState.Collapsed)
    patternMenu.Expand();

patternMenu是通过使用GetCurrentPattern从AutomationElement获得的ExpandCollapsePattern。

当我打印出该值时,ExpandCollapseState的当前值为“Collapsed”。

编辑:我能知道为什么我被downvote了吗?还有这是一个坏问题吗?当远程桌面关闭时,它似乎只会失败。如果这是一个非常愚蠢的问题,我希望得到解释,然后再downvote。

与桌面交互的进程不是Windows服务。它是我在远程桌面连接到计算机后启动的应用程序。是因为我锁定了桌面吗?

我正在Ubuntu上使用“终端服务器客户端”登录Windows机器。按下此应用程序的关闭按钮会导致桌面锁定吗?

1个回答

2
一般来说,在非交互式桌面上,通常无法运行UI自动化或类似工具。非交互式桌面在输入方面有各种限制:没有焦点元素,无法发送输入,因此任何依赖这些的内容都会失败。
一些功能,如发送窗口消息,将会正常工作。这里可能发生的情况是,InvokePattern功能在底层实现为消息,因此仍然有效;但是,展开/折叠可能是基于输入实现的,这将失败。
不清楚为什么在您关闭客户端时它会失败(这部分是预期的),但在远程桌面锁定时似乎可以正常工作 - 它是否期望在两种情况下表现相同。
(请注意,如果本地Ubuntu桌面被锁定,只要客户端仍在运行,一切都应该还好,并且仍然可以正常工作。在这种情况下,远程客户端仍然是“交互式”的,因为它连接着一个活动的客户端,而不管客户端本身是在交互式还是非交互式桌面上运行 - 这些概念甚至可能不适用于在其他操作系统上运行的客户端!)

我原以为程序在桌面锁定时运行良好,但我错了。最新的测试结果在桌面锁定后立即开始失败。我将开始设置虚拟机来运行测试,而不是使用远程桌面。谢谢。 - Jonathan Sternberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接