c# – AutoIT或User32按钮偶尔单击工作

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

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

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

这是我的命令顺序:

在窗口中找到按钮(成功,始终)
使窗口成为前景(成功)
激活窗口(成功)
激活按钮(成功)
关注按钮(成功)
如果该按钮已聚焦,并且该按钮已启用,则单击该按钮. (成功/失败,不可预测的行为.我无法缩小为什么有时会成功,以及为什么有时会失败……)

其他详情:

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

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

据我所知,这不是一个计时问题,因为我确保按钮是聚焦的,并且在尝试点击它之前启用了按钮,我看到该按钮确实获得了围绕它的聚焦高光.

正如我所提到的,我也只是通过一个简单的User32 / SendMessage调用来尝试这个,这也失败了.

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

有什么想法吗?

UPDATE

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

我一直在另一台虚拟机上尝试这个,它似乎也在那里工作.至于两个虚拟机,它们运行相同版本的Windows,相同版本的应用程序,相同版本的AutoIT等.

我把它简化为一个细节 – 幸运的是,我无法配置自己,并且必须输入一张票来更改任何配置.配置的不同之处在于:

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

最佳答案 你说你已成功聚焦按钮,所以你试过发送一个空格键事件而不是鼠标点击吗?

Send("{SPACE}")

(我认为这是语法.我不是真正的AutoIt常规)

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

至于检测单击按钮,可能最简单的方法是让按钮对AutoIT可以检测到的表单进行更改.例如,状态标签在用户按下按钮之前读取就绪.当用户按下按钮时,文本将更改为“处理”.如有必要,您可以使标签不可见(或位于表单边界之外),以便用户无法看到它,但AutoIt可以.

点赞