UIAutomation和远程桌面连接

Jon*_*erg 5 c# windows automated-tests remote-desktop ui-automation

我有一个应用程序在任意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();
Run Code Online (Sandbox Code Playgroud)

patternMenu是使用GetCurrentPattern从AutomationElement获取的ExpandCollapsePattern.

打印出值时,ExpandCollapseState的当前值为"Collapsed".

编辑:我有机会知道为什么我有一个downvote,这是一个坏问题?我对发生的事情感到非常困惑,因为当远程桌面关闭时它似乎只会失败.如果这是一个非常愚蠢的问题,我应该知道答案,我会喜欢一个解释,然后是一个downvote.

与桌面交互的进程不是Windows服务.这是我将远程桌面插入计算机后启动的应用程序.是因为我锁定了桌面吗?

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

Bre*_*McK 2

一般来说,您通常无法在非交互式桌面上运行 UI 自动化或类似功能。非交互式桌面在输入方面有各种限制:没有焦点元素,无法发送输入,因此依赖于这些的任何操作都会失败。

某些功能(例如发送 Windows 消息)可以正常工作。这里可能发生的情况是 InvokePattern 功能在幕后作为消息实现,因此仍然有效;但展开/折叠可能会根据输入来实现,这会失败。

不清楚为什么在您的情况下,当您关闭客户端时它会失败(该部分是预期的),但当远程桌面锁定自身时它似乎可以工作 - 它在两种情况下是否期望表现相同。

(请注意,如果本地Ubuntu 桌面锁定,只要客户端仍在运行,一切都应该很好并且仍然可以工作。在这种情况下,远程客户端仍然是“交互式”的,因为它附加了一个实时客户端,无论无论客户端本身是在交互式桌面还是非交互式桌面上运行 - 这些概念甚至可能不适用于在其他操作系统上运行的客户端!)