我正试图使应用程序的测试自动化,而我被困在一个我很难解决的问题上。
应用程序有标准的windows按钮,我已经尝试使用AutoIT和User32 dll来单击其中的一些按钮。有时按钮被正确地点击(耶!)有时他们会失败(嘘!)-但更糟糕的是,AutoIT确信它点击了按钮(双嘘!)然后产生假阳性(三重错误!)。当我看到它被说服时,我的意思是它返回点击是成功的,而不是。
我在Win Server 2K8上运行应用程序,除了使用MDI窗口之外,这个应用程序没有什么特别之处,一些按钮包含在MDI窗口中。但是,有些则不在MDI窗口中(例如,在创建父窗口之前,登录窗口)。
以下是我的命令:
在窗口中找到按钮(成功,总是)将窗口打开前台(成功)激活窗口(成功)激活按钮(成功)焦点按钮(成功),如果按钮焦点集中,按钮被启用,然后点击它。(成功/失败,不可预测的行为。我不能缩小为什么它有时成功,为什么它有时失败.)
其他详情:
有时,订单有按钮被点击,这应该打开另一个窗口。该窗口关闭,然后按钮再次点击-而这一次,什么都没有发生。其他情况下,它会像预期的那样工作。
我以管理员身份运行,UAC完全禁用。
据我所知,这不是时间问题,因为在尝试点击按钮之前,我确实要确保按钮是有焦点的,并且启用了按钮,并且我看到按钮周围确实有焦点突出显示。
正如我前面提到的,我也尝试过使用简单的User32 32/SendMessage调用,但这也失败了。
最后,但并非最不重要的是,当我手动与应用程序交互时,这种情况不会发生。我一直有实际的按钮点击工作。
有什么想法吗?
更新
下面是我应该提到的等式的另一个变量--这发生在VM上(因为我需要在那里运行它)。我可以在我自己的机器上做一些有限的测试,但是要得到一些真正的测试,它需要在VM上。点击我自己的开发框似乎是可靠的,这使得这更令人费解。
我已经在另一个VM上尝试过了,而且它似乎也在那里工作。就这两个VM而言,它们运行的是相同版本的Windows、相同版本的应用程序、相同版本的AutoIT等等。
我已经将其简化为一个细节--幸运的是,我无法配置自己,而且必须输入一张票才能更改任何配置。配置的不同之处在于:
在不工作的VM上,设备管理器显示一个鼠标,它是vmware鼠标。在正在工作的VM上,设备管理器显示了一个鼠标,即PS/2鼠标。显然,两者都是软件鼠标,但我现在想知道,VMWare鼠标是否会有不同的行为,并导致按钮单击不一定工作。我不确定这作为解决方案的可能性有多大,因为根据我对它的理解,使用User32 SendMessage调用实际上并不使用鼠标,而是发送鼠标发送的相同信息,但值得一试……
发布于 2012-02-14 22:59:51
您说您已经成功地Focus编辑了按钮,所以您尝试过发送一个Spacebar事件而不是一个MouseClick
Send("{SPACE}")(我认为这就是语法。我不是AutoIt的常客)
空格通常可用于与大多数可单击控件(如按钮和复选框)进行交互。根据我的经验,由于奇怪、不一致的原因,模拟鼠标点击,甚至是ControlClicks,都比击键更不可靠。我的同情。
至于检测按钮是被点击的,也许最简单的方法就是让按钮对AutoIT可以检测到的表单进行更改。例如,状态标签读取Ready,直到用户按下按钮。当用户按下按钮时,文本将更改为Processing。如果有必要,您可以使标签不可见(或者位于表单边界之外),这样用户就看不到它,但是AutoIt可以。
发布于 2012-02-19 21:40:45
我模拟了你的情况,它在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-06-08 16:38:15
当你发布这个问题的时候,你可能成功地解决了这个问题,但是还没有很好的答案,所以我会把我的:
在运行Windows 2008 R2的虚拟机上,我也遇到了同样的问题:我无法通过Win32 API SendMessage向特定的程序(及其主窗口)发送击键或执行任何操作。
根据这个Q/A,这是一个UIPI问题(从Windows开始)。你应该关掉你的UAC来解决这个问题。我测试过了,效果很好。可以通过我提供的链接找到更多的替代方案。
https://stackoverflow.com/questions/9216520
复制相似问题