AutoIt和WinWaitActive()

时间:2014-03-16 12:37:41

标签: windows user-interface automation automated-tests autoit

我正在编写一个AutoIt脚本,它倾向于打开一个应用程序(Vision)。当此应用程序打开时,脚本打算从菜单中访问一个选项,这又会导致同一个应用程序中的另一个窗口被打开。配置并保存一些设置后,控件将再次返回到应用程序[Vision]中的主窗口。我打算使用AutoIt自动化整个事情。但是,WinActivate()表现得很奇怪。我该如何解决这个问题?

以下是我的代码:

Dim $num,$file_name,$opening_file
$num = 1
$file_name = "Hello"
$opening_file = "Vision - [" & $file_name & "]"
Opt("WinTitleMatchMode", 2);
AutoItSetOption ("TrayIconDebug", 1);0-off
Local $pid_handle = ProcessExists("Vision.exe")
If $pid_handle Then
ProcessClose($pid_handle)
Endif
Run("C:\Program Files\Vision.exe")
WinWait("Vision - [Start Page]")
WinWaitActive("Vision")
SendKeepActive("Vision")
sleep(3000)
Send("!f")
Send("n")
WinWait("Capture Options - ")
WinWaitActive("Capture Options - ")
SendKeepActive("Capture Options")
ControlClick("Capture Options","",32494)
sleep(1000)
ControlSetText("Capture Options","",1487,$file_name,"")
Send("{DOWN}")
Send("{Tab}")
WinActivate("Capture Options - ")
ControlClick("Capture Options","",32494)
sleep(1000)
Send("{DOWN}{Tab}")
ControlCommand("Capture Options","",1471,"ShowDropDown","")
If $num = 1 Then
    ControlCommand("Capture Options","",1471,"SelectString","1 - here u go")
Elseif $num = 2 Then
    ControlCommand("Capture Options","",1471,"SelectString","2 - blah blah..")
EndIf

sleep(2000)
Send("{ENTER}")
ControlClick("Capture Options", "", 1)

sleep(1000)
WinActivate("Vision")
WinWaitActive("Vision")
SendKeepActive("Vision")
sleep(2000)
Send("^!y")

我面临的问题如下:

a)尽管使用Run()命令打开了Vision.exe,如果我碰巧点击其他窗口[GUI /桌面/浏览器],Vision GUI会失去焦点并且AutoIt脚本会在WinWaitActive中被卡住()永远行,永不回归。 AutoIt本身不应该把焦点放在Vision GUI上吗?

这样,我看到我的整个自动化脚本都失败了,如果我碰巧打开了这个系统,当它恰好打开Vision GUI时。我该如何解决这个问题?

b)正如我先前所说,需要发生的流程是:  Vision GUI开放。  使用 Alt + F 或类似命令,我碰巧在GUI中打开另一个对话框。这会导致应用某些配置设置。我保存,然后返回到视觉GUI主窗口。现在我面临的问题是,有时Vision GUI的主窗口永远不会被AutoIt激活,我也在这里等待WinWaitActive行。是不是应该在到达第二行之前激活Vision主窗口?

WinActivate("Vision")
WinWaitActive("Vision")
SendKeepActive("Vision")
sleep(2000)
Send("^!y")

1 个答案:

答案 0 :(得分:3)

两个主要问题......首先是您的观点a)您应该只使用WinWait,然后您可以使用WinActivate将其设置为活动状态。在WinActivate之后您不需要使用WinWaitActive - 您可以检查其返回代码。

第二点b)你需要以同样的方式表现。在开始激活Window然后发送一些击键等以防止用户“窃取”Window Focus之前,您可以(绝对小心)使用BlockInput(True)。完成后,您应立即使用BlockInput(False)。但是,它可能仍然会出现,某些其他应用程序弹出并成为活动窗口...为此,您可能会在使用它之前检查您的活动窗口...但是这样的情况要好于尝试使用Control...函数,因为它们不依赖于窗口是活动的...

最后,您应该只确定最顶层的窗口句柄($handle = WinExists("Vision")),然后使用其句柄进一步使用Win...函数,例如WinGetTitle($handle)。因为特别是当您在应用程序中打开弹出窗口时,它们的标题中可能包含相同的单词。因此,可能无法确定您的命令是否正在使用您认为的窗口执行。获取新运行窗口的PID后,您可能会考虑使用它来接收其窗口句柄 - AutoIt论坛中有一些函数可以从PID接收句柄。因此,您可以确保使用您想要使用的确切窗口。

哦 - 控制ID的使用非常糟糕。谁可以向你保证,他们不会改变?使用一些控件名称...请参阅有关“扩展控件标题定义”的部分,或者在文档中有关这些可能性......