4

我正在尝试自动化应用程序的测试,但我遇到了一个我正在努力解决的问题。

该应用程序具有标准的 Windows 按钮,我尝试使用 AutoIT 和 User32 dll 来单击其中一些按钮。有时按钮被正确点击(耶!),有时它们失败(嘘!) - 但更糟糕的是,AutoIT确信它点击了按钮(双嘘!),然后产生误报(三重嘘!)。当我看到它被说服时,我的意思是它返回点击成功,而不是成功。

我在 Win Server 2K8 上运行该应用程序,该应用程序除了使用 MDI 窗口之外没有什么特别之处,并且一些按钮包含在 MDI 窗口中。但有些不在 MDI 窗口中(例如,在创建父窗口之前的登录窗口)。

这是我的命令顺序:

在窗口中找到按钮(成功,总是) 将窗口带到前台(成功) 激活窗口(成功) 激活按钮(成功) 聚焦按钮(成功) 如果按钮获得焦点,并且按钮已启用,则点击它。(成功/失败,不可预知的行为。我无法缩小为什么有时会成功,以及为什么有时会失败......)

其他详情:

有时订单会单击按钮,这应该会打开另一个窗口。该窗口关闭,然后再次单击该按钮 - 这一次,没有任何反应。其他时候它按预期工作。

我以管理员身份运行,并且 UAC 已完全禁用。

据我所知,这不是时间问题,因为我确实确保按钮已聚焦并在尝试单击它之前启用,并且我看到该按钮确实在其周围获得了聚焦的突出显示。

正如我所提到的,我也一直在尝试使用简单的 User32/SendMessage 调用,但这也失败了。

最后但并非最不重要的一点是,当我手动与应用程序交互时不会发生这种情况。我一直有实际的按钮点击工作。

有什么想法吗?

更新

这是我应该提到的等式的另一个变量 - 这发生在 VM 上(因为这是我需要运行它的地方)。我可以在我自己的机器上做一些有限的测试,但要获得一些真正的测试,它需要在 VM 上。点击我自己的开发框似乎是可靠的,这让这更加令人费解。

我一直在另一个 VM 上尝试这个,它似乎也在那里工作。就这两个虚拟机而言,它们运行的​​是相同版本的 Windows、相同版本的我的应用程序、相同版本的 AutoIT 等。

我已将其简化为一个细节 - 幸运的是,我无法自行配置,并且必须提交一张票才能更改任何配置。配置的区别是这样的:

在不工作的虚拟机上,设备管理器显示一个鼠标,它是一个 vmware 鼠标。在正在工作的 VM 上,设备管理器显示鼠标是 PS/2 鼠标。显然两者都是软件鼠标,但我现在想知道 VMWare 鼠标是否会表现不同,并导致按钮点击并不总是有效。我不确定这作为解决方案的可能性有多大,因为根据我的理解,使用 User32 SendMessage 调用实际上并不使用鼠标,而是发送鼠标会发送的相同消息,但值得一试...

4

3 回答 3

2

你说你已经成功Focus编辑了按钮,所以你有没有尝试发送一个Spacebar事件而不是一个MouseClick

Send("{SPACE}")

(我认为这就是语法。我不是 AutoIt 的常客)

空格键通常可用于与大多数可点击控件进行交互,例如按钮和复选框。根据我的经验,由于奇怪的、不一致的原因,模拟鼠标点击,甚至ControlClicks,都远不如击键可靠。我的同情。

至于检测按钮被点击,也许最简单的方法是让按钮更改AutoIT可以检测的表单。例如,Ready在用户按下按钮之前读取的状态标签。当用户按下按钮时,文本变为Processing。如有必要,您可以使标签不可见(或位于表单边界之外),这样用户就看不到它,但 AutoIt 可以。

于 2012-02-14T22:59:51.653 回答
0

我已经模拟了您的案例,它在Windows 7上 100% 有效:

using System.Runtime.InteropServices;

[DllImport("user32.dll", SetLastError = true)]
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo);

void ClickFocusedControl()
{
    const uint KEYEVENTF_EXTENDEDKEY = 0x1;
    const uint KEYEVENTF_KEYUP  = 0x2;

    keybd_event(13, Convert.ToByte(0), KEYEVENTF_EXTENDEDKEY, UIntPtr.Zero); //Generates a KEY_DOWN
    keybd_event(13, Convert.ToByte(0), KEYEVENTF_KEYUP, UIntPtr.Zero); // Generates a KEY_UP
}
于 2012-02-19T21:40:45.327 回答
0

当您发布此问题时,您可能已成功解决此问题,但还没有好的答案,所以我将发布我的:

我在运行 Windows Server 2008 R2 的虚拟机上遇到了同样的问题:我无法通过 Win32 API SendMessage 向特定程序(及其主窗口)发送击键或执行任何操作。

根据这个Q/A,这是一个 UIPI 问题(自 Windows Vista 以来就存在)。您只需关闭 UAC 即可解决此问题。我测试了它并且它有效。可以通过我提供的链接找到更多替代方案。

于 2012-06-08T16:38:15.513 回答