今天听到同事提到AutoIT,能够用来测试GUI窗口。了解一下这个工具。编程
如下内容引自: http://www.jb51.net/article/14870.htm (此url非原出处,该博主未注明原出处)编程语言
转载 2008-06-19 ide
做者: yonken
据我了解须要编写AutoHotkey/AutoIt脚原本实现自动化操做的用户不少都是网管,其它则多是一些我的用户,他们通常都具备至关的技术水平,并且都但愿能借助脚原本完成某些以往须要人工操做的重复性劳动,但限于语言条件上的限制可能对官方的帮助文档有较难理解之处。为方便读者,我将从最简单的提及,每一个示例尽量同时给出相应的AHK和AU3版本代码。本文将尽量用较通俗的语言描述,但并不打算讲解语法基础,因此不必定适合新手阅读。
文中涉及到的AHK/AU3版本:
AutoHotkey
1.0.44 .08
AutoIt
3.1.1
1、关于脚本
一、什么是脚本?
这是个很是“流行”的术语了,通俗而言脚本(Script)通常都是指根据某种语法规则编写的具备特定格式的文本文件。可能你们已经据说过不少种脚本:VBScript、JScript、PHP、ASP、JSP、CGI、CS脚本,甚至游戏外挂脚本。
这些脚本文件都是可执行文件,可执行相应的操做。
AHK 脚本文件扩展名:*.ahk
AU3 脚本文件扩展名:*.au3
二、脚本和程序的不一样?
严格来讲,所谓“程序”就是指以各类编程语言(好比说C/C++/C#/Delphi)编写、由编译器编译好后的二进制文件,通常就是机器代码,可由系统执行。而脚本则是只是些纯文本文件,包含了各类定义好的命令,这一点很像批处理文件。这样,咱们得出一个简单的结论,那就是用户通常没法得到“程序”的源代码,咱们只能进行反汇编把它逆向还原为汇编语言代码(或其它),固然,也有些“程序” 是能够得到源代码的(好比Java);脚本则是用户可直接查看的代码文件,而AHK/AU3则提供了把脚本文件“转换”成exe文件的方法。
三、脚本如何运行?
脚本是“解释性”的语言,它的运行依赖一个“解释器”,由这个解释器来“翻译并解释”脚本的每条命令(或者说代码),而后执行相应操做。若是不严格定义的话,HTML和Java均可以认为是解释性语言。AHK/AU3的主程序(分别是AutoHotkey.exe和AutoIt3.exe)就是它们的“解释器”,上面提到脚本可“转换”成可脱离相应的解释器而独立运行的exe可执行文件,而咱们还可使用相应的工具把它们“还原”成脚本文件,由此咱们彻底能够这么理解:脚本代码是被“压缩”到这个exe文件中,解释器也是在里面,在运行exe时其实是先“解压”脚本代码而后运行解释器并解释该脚本。
四、如何建立脚本?
使用资源管理器的右键菜单便可建立相应脚本文件,或者新建一个文本文件后改扩展名便可。
五、稍微介绍一点语法规则?
A)对AHK而言,每一个内建的功能都是以“命令”的形式提供:
Command, param1, param2,…
而AU3则以“函数”的形式提供:
Function(param1, param2, …)
命令或函数中被符号“[”和“]”围住的参数是可选参数,表示在使用这些命令或函数时可省略它们(不给出具体数值)。
若某个参数含有空格,则最好使用双引号围住该参数。
B)解释器自上而下(从第一行到最后一行)“解释”脚本的每行语句,除非遇到“Return”、“Goto”、“Gosub”、“Exit”等语句、函数、热键或其它能使脚本“跳”到某个标识符的条件成立。
C)关键字和标识符(包括变量名、命令名、函数名等)都不区分大小写。 函数
2、运行程序或打开文件
一、运行程序
Run t命令或者函数用来运行外部可执行文件,AHK还可利用它来直接打开文件。
AHK:
Run, 目标文件 [, 工做目录, Max|Min|Hide|UseErrorLevel, 输出PID变量]
AU3:
Run ( "文件名" [, "工做目录" [, 标志]] )
【示例 2.1.1 】
AHK:
Run, Notepad.exe
AU3:
Run("Notepad.exe")
上面的示例中都没有给出程序“Notepad.exe”的路径,为何仍能执行?这是由于它们都会自动在脚本所在目录下搜寻目标文件,若有则运行,不然就到系统文件夹(%PATH%)中搜寻。
注意:
A)某些程序必须给定“工做目录”才能成功运行!
B)给出完整的文件路径有助于轻微提升程序的可靠性。
C)AHK的Run命令能够用来运行程序和直接打开文件,而AU3的Run函数则只能用来运行程序(可执行文件)或传递参数让某个程序打开目标文件。
固然,运行程序的功能还不只仅是这么简单,咱们还能够指定运行程序的初始状态,好比让运行的记事本窗口以最大化状态显示(或者最小化、隐藏):
【示例 2.1.2 】
AHK:
Run, Notepad.exe, , Max
AU3:
Run("Notepad.exe", "", @SW_MAXIMIZE)
二、打开文件
前面已经提到,AHK的Run命令能够直接打开文件,而AU3的Run函数则只能用来运行程序,所以在打开文件的方式上有点不一样:AHK脚本中可直接给出目标文件,而AHK将自动运行该文件的关联程序来打开它;而AU3则必须由用户本身传递参数让某个程序打开目标文件。
【示例 2.2.1 】
AHK:
Run, MyFile.txt
Run, Notepad.exe MyFile.txt
AU3:
Run("Notepad.exe MyFile.txt")
三、以命令行形式运行程序
能够考虑运行系统的命令行解释器(cmd.exe/command.com),而后指定要执行的命令并传递参数。
假设咱们要执行命令“dir C:\WINDOWS\system 32” ,用以列出指定目录的全部文件及子目录。
【示例 2.3.1 】
AHK:
Run, %ComSpec% /k dir C:\WINDOWS\system32
AU3:
Run(@ComSpec & " /k dir C:\WINDOWS\system32")
注意:
A)ComSpec是脚本内建的用以指示命令行解释器位置的变量或宏。
B)/k 参数表示“执行字符串指定的命令但保留”,若改成 /c 则表示“执行字符串指定的命令而后终断”。对此比较直观的解释是 /k 将在执行完命令后保留命令提示窗口,而 /c 则将在执行完命令以后关闭命令提示窗口。
C)符号“&”是AU3定义的字符串链接符。
四、特殊应用
A)打开网页
【示例 2.4.1 】
AHK:
Run, www.autohotkey.com
Run, %A_ProgramFiles%\Internet Explorer\IEXPLORE.EXE www.autohotkey.com
AU3:
Run(@ProgramFilesDir & "\Internet Explorer\IEXPLORE.EXE www.autohotkey.com")
B)打开特殊文件夹
系统的某些特殊文件夹被定义了相应的CLSID(请查看帮助文档),咱们可利用它来打开相应的文件夹,好比打开回收站:
【示例 2.4.2 】
AHK:
Run ::{645ff040-5081-101b -9f 08-00aa 002f 954e}
AU3:
不适用!
C)运行控制面板工具
微软已经为咱们提供了经过命令行打开控制面板某个工具或项目的方式,好比打开系统属性窗口:
【示例 2.4.3 】
AHK:
Run control sysdm.cpl
AU3:
Run("control sysdm.cpl")
关于访问控制面板项目的详细介绍请查看此文:文章地址。
D)指定搜索位置并打开搜索窗口
假设咱们要打开一个搜索窗口,并且要指定搜索位置,好比C:\:
【示例 2.4.4 】
AHK:
Run, find C:\
AU3:
不适用!
E)显示指定文件的属性窗口
假设咱们要打开文件“MyFile.txt”的属性窗口,则使用关键字properties 而后接上目标文件便可:
【示例 2.4.5 】
AHK:
Run, properties MyFile.txt
AU3:
不适用!
注意:AHK在退出前将自动关闭打开的属性窗口!
F)用“资源管理器”打开指定文件夹
咱们知道使用Run, explorer C: 或Run("explorer C:") 便可打开指定的文件夹,但是有时候咱们须要在资源管理器中打开它,这时可以使用关键字 explore:
【示例 2.4.6 】
AHK:
Run, explore C:
AU3:
run("explorer.exe /e,C:\")
G)打印指定文件
要打印指定文件,可以使用关键字 print:
【示例 2.4.7 】
AHK:
Run, print MyFile.txt
AU3:
不适用!
F)用“资源管理器”打开指定文件夹
咱们知道使用Run, explorer C: 或Run("explorer C:") 便可打开指定的文件夹,但是有时候咱们须要在资源管理器中打开它,这时可以使用关键字 explore:
【示例 2.4.6 】
AHK:
Run, explore C:
AU3:
不适用!
run("explorer.exe /e,d:\")
这样就能够作到你说的打开树状文件了 工具
注意:窗口标题和窗口文本参数老是对大小写敏感的。
一、等待窗口系列命令/函数
AHK和AU3都提供了用法相似的一组窗口等待命令/函数:WinWait/WinWaitActive/WinWaitClose。
它们分别用于等待窗口出现、等待窗口被激活、等待窗口被关闭。因为这些命令/函数的参数相似,现仅以WinWait为例说明。
AHK:
WinWait [, 窗口标题, 窗口文本, 超时时间, 排除标题, 排除文本]
AU3:
WinWait ( "窗口标题" [, "窗口文本" [, 超时时间]] )
WinWait 的做用是在目标窗口出现以前再也不执行后面的全部语句。
假设咱们要运行记事本程序,并在其窗口出现时提示用户:
【示例 3.1.1 】
AHK:
Run Notepad
WinWait, 无标题 - 记事本
MsgBox 记事本窗口已被打开!
AU3:
Run("Notepad")
WinWait("无标题 - 记事本")
MsgBox(0, "", "记事本窗口已被打开!")
二、激活窗口相关命令/函数
让目标窗口成为活动窗口的办法就是激活它,可用的命令/函数是WinActivate:
AHK:
WinActivate [,窗口标题, 窗口文本, 排除标题, 排除文本]
AU3:
WinActivate ( "窗口标题" [, "窗口文本"] )
三、关闭窗口
关闭窗口有两种方式,一种是正常的关闭窗口(WinClose),另外一种则是强行关闭窗口(WinKill):
AHK:
WinClose/WinKill [,窗口标题, 窗口文本, 超时时间,, 排除标题, 排除文本]
AU3:
WinClose/WinKill ( "窗口标题" [, "窗口文本"] )
如今咱们已经能够实现一个比较简单的功能了,好比咱们能够打开系统属性窗口并等待其出现,窗口出现后激活它,接着等待3秒再关闭它:
【示例 3.1.2 】
AHK:
Run, Sysdm.cpl
WinWait, 系统属性
WinActivate, 系统属性
WinWaitActive, 系统属性
Sleep, 3000
WinClose, 系统属性
WinWaitClose, 系统属性
AU3:
Run("Control Sysdm.cpl")
WinWait("系统属性")
WinActivate("系统属性")
WinWaitActive("系统属性")
Sleep(3000)
WinClose("系统属性")
WinWaitClose("系统属性")
建议:若是程序中频繁地出现要用到这些窗口标题的地方,会带来一个问题:脚本的可读性,也许你会想,这不是很直观吗?可问题是若是这个重复出现的窗口标题是个很长的字符串呢?这将严重影响整个代码的排版美观。并且咱们也无从了解这些窗口标题的“来头”,不知道这个窗口标题到底是怎么来的。而若是咱们定义一个变量(假设变量名是“AppWindow1”)保存这个窗口标题,咱们就能在命令/函数中用变量来表示它,这样就达到了让代码用意更清晰一点的目的。另外,就算目标软件因某些缘由(好比升级)而改变了它的窗口标题,咱们也能很方便地做出修改。
四、更准确的标识窗口的方法(主要针对AHK脚本)
程序在运行时起码会有一个进程,若是能得到这个进程ID就能在必定程度上保证对窗口的准确标识。另外,每一个窗口都有定义窗口类名(Class,好比说记事本窗口的类名就是Notepad),因此咱们能够以此排除与目标窗口不一样的其它窗口类。其实,咱们还有一个更准确的方法:
每一个窗口(包括控件在内)都被Windows指派了一个可区别于其它窗口的惟一的标识符(ID),咱们称之为窗口句柄(HWND)。
直接给定窗口标题来表示窗口的一个缺点就是没法保证在脚本运行的过程当中始终以该窗口为操做目标,由于在这个过程当中颇有可能会有其它“同名”窗口(或者说知足匹配条件的窗口)出现,而若是咱们使用这个标识符来表示窗口天然就能保证命令/函数的操做窗口老是同一个窗口了。
咱们先来了解一下得到窗口句柄的命令/函数:
AHK:
WinGet[, 输出变量, ID, 窗口标题, 窗口文本, 排除标题, 排除文本]
AU3:
WinGetHandle ( "窗口标题" [, "窗口文本"] )
其中WinGet得到的窗口ID将经过“输出变量”返回,而WinGetHandle的返回值就是得到的窗口ID。
咱们在进行自动化操做时是要先运行某个程序,如何得到这个程序成功运行后显示的窗口句柄?一个比较保险的办法是先得到这个程序的进程ID,而后根据这个进程ID得到它的窗口句柄,AHK支持使用进程ID做为窗口标题使用;但AU3不支持这样使用,只能先得到该窗口的类名再根据该类名来得到窗口句柄(不够保险):
【示例 3.1.3 】
AHK:
Run, NotePad, , , ThisPID
WinWait, ahk_pid %ThisPID%
;这里的ahk_pid代表跟在后面的变量是进程ID
WinGet, ThisID, ID, ahk_pid %ThisPID%
;ThisID将保存得到的窗口句柄
AU3:
Opt("WinTitleMatchMode", 4)
Run("Notepad")
$handle = WinGetHandle("classname=Notepad")
如今暂且先忘记了AU3吧,由于它的窗口函数通常都不支持使用窗口句柄做为(窗口标题)参数。
至于如何在AHK中使用窗口句柄,简单的说,凡有“窗口标题”参数的命令就能够用窗口句柄来代替,好比:
【示例 3.1.4 】
AHK:
Run, Notepad, , , ThisPID
;先得到运行的记事本程序的进程ID
WinWait, 无标题 - 记事本 ahk_pid %ThisPID%
;等待该进程窗口的出现
WinGet, ThisHWND, ID, 无标题 - 记事本 ahk_pid %ThisPID%
;得到窗口句柄
WinActivate, ahk_id %ThisHWND%
;这里的ahk_id代表跟在后面的变量是窗口句柄
WinWaitActive, ahk_id %ThisHWND%
Sleep, 3000
WinClose, ahk_id %ThisHWND%
WinWaitClose, ahk_id %ThisHWND% 测试
一、模拟鼠标点击(按钮等)控件
既然是模拟用户操做,天然就包括了模拟鼠标点击在内。
适用命令/函数:Click/MouseClick/ControlClick
其中Click/MouseClick用来模拟用户的物理操做(点击),把鼠标点击事件发送到指定坐标位置(相对当前窗口或绝对位置)上,但这种方法并不能保证100%的准确性,屏幕分辨率、用户干扰和系统环境等都会影响到它们的执行结果,而ControlClick则直接把鼠标点击事件发送到目标窗口的目标控件上,于是更准确,通常咱们不考虑使用坐标位置方式的点击,下面仅以ControlClick为例说明:
AHK:
ControlClick [, 目标控件或坐标位置, 窗口标题, 窗口文本, 鼠标按钮, 点击次数, 选项,排除标题, 排除文本]
AU3:
ControlClick ( "窗口标题", "窗口文本", 控件ID [, 按钮] [, 点击次数]] )
对AHK而言,“目标控件”参数是指要点击的控件的类别名(ClassNN)或控件文本,另外还可使用控件句柄(若用的是控件句柄则第一个参数需留空,并在第二个参数中使用ahk_id %控件句柄%)。
Q:用什么工具来得到目标控件的这些信息呢?
A:AHK用户请使用 AutoIt3 Window Spy,AU3用户则请使用AutoIt Window Info,你能够在相应的开始菜单项目里找到它们,或者到安装目录下寻找。
Q:如何使用这两个工具?
A:先打开你要进行操做的目标窗口,而后运行 AutoIt3 Window Spy 或 AutoIt Window Info,接下来就是把鼠标移到目标控件上(好比某个按钮):
AutoIt3 Window Spy 使用演示截图: url
AutoIt Window Info 使用演示截图:.net
如今咱们假设已打开并激活了“系统属性”窗口,而任务是点击它的“肯定”按钮,则可用如下几种方法:
【示例4.1.1】
AHK:
ControlClick, 肯定, 系统属性
ControlClick, Button2, 系统属性命令行
AU3:翻译
ControlClick("系统属性", "", 1)
ControlClick("系统属性", "", "Button2")
ControlClick("系统属性", "", "肯定")
提醒:即便目标窗口或控件是隐藏状态,ControlClick命令仍是能够“点击”目标控件,但不能保证成功率。
二、模拟键盘操做
键盘也是咱们在操做窗口时会用到的工具,好比说在安装软件的时候经典的“一路回车大法”。下面简单介绍一下模拟键盘操做的方法。
Send
这个是最直接的方法,就是模拟用户按键行为,直接发送键击命令,用法请参考官方文档,在此不予说明。
最简单的应用――按回车:
AHK:
Run, Control Sysdm.cpl
WinWait, 系统属性
Send, {Enter}
AU3:
Run("Control Sysdm.cpl")
WinWait("系统属性")
Send("{Enter}")
常见的组合键――Alt+X / Ctrl+N等等,在安装软件的时候常常会有提供一个按钮“下一步(N)”,表示按下Alt+N便可触发等同于点击该按钮的效果,其它的可举一反三。以打开记事本窗口的“文件”菜单为例:
AHK:
Run, Notepad
WinWait, 无标题 - 记事本
WinActivate, 无标题 - 记事本
WinWaitActive, 无标题 - 记事本
Send, !f
AU3:
Run("Notepad")
WinWait("无标题 - 记事本")
WinActivate("无标题 - 记事本")
WinWaitActive("无标题 - 记事本")
Send("!f")
5、自动化操做轻松入门系列5
yonken
控件操做
然而,在真正实现自动化时仅靠上面的技术每每难以达到预期目的。下面开始进入最为重要的控件操做。
一、设置文本
在安装软件的过程当中用户每每须要提供一些必需信息,好比安装目录。不少用户并不喜欢把软件安装到默认的C盘而更愿意把它们安装到别的地方,那么脚本究竟提供了什么方法能让咱们修改以下图所示的路径呢?
咱们先用上文中提到的AutoIt3 Window Spy 或 AutoIt Window Info 来得到这个路径的编辑框的信息,假设这个窗口的标题为Setup foobar,该路径编辑框的类名是Edit1,而咱们须要把它改为“D:\foobar2000”,接下来就可使用下列命令/函数来设置它的文本了:
AHK:
ControlSetText [, 目标控件, 新文本, 窗口标题, 窗口文本, 排除标题, 排除文本]
AU3:
ControlSetText ( "窗口标题", "窗口文本", 控件ID, "新文本")
具体用法以下:
【示例5.1.1】
AHK:
ControlSetText, Edit1, D:\foobar2000, Setup foobar
AU3:
ControlSetText("Setup foobar", "", "Edit1", "D:\foobar2000")
二、选中和取消选中单选框和复选框项目
有时程序为了知足用户的个性化设置而须要用户提供更多的信息,咱们常常会遇到这样的状况:
如何保证选中所需项目并取消某些项目呢?
下面先来介绍AHK和AU3中用来对控件进行各类属性设置的命令/函数:
AHK:
Control [, 命令, 值, 目标控件, 窗口标题, 窗口文本, 排除标题, 排除文本]
AU3:
ControlCommand ( "窗口标题", "窗口文本", 控件ID, "命令", "选项")
其中,“命令”就是让咱们指定要进行何种设置的参数。对这些单选框/复选框按钮来讲,适用的命令是“Check”和“UnCheck”。
假设这个窗口的标题是为Setup foobar,咱们打算进行下来操做:
选中它的“桌面”复选框(Button5)、取消选中“快速启动栏”复选框(Button7);
选中“0.7x”单选框(Button14)。
那么具体的用法示例以下:
【示例5.1.2】
AHK:
Control, Check, , Button5, foobar
Control, UnCheck, , Button7, foobar
Control, Check, , Button14, foobar
AU3:
ControlCommand("foobar", "", "Button5", "Check", "")
ControlCommand("foobar", "", "Button7", "UnCheck", "")
ControlCommand("foobar", "", "Button14", "Check", "")
二、选择下拉列表的项目
相信你确定遇到过下面这种状况:
问题又来了:如何选中本身须要的项目?
答案还是使用上面提到的命令/函数。对这种控件而言,AHK适用的命令是“Choose, N”和“ChooseString, String”,分别表示选中第N个项目和选中与字符串String匹配的项目;而AU3适用的命令则是“SetCurrentSelection, N”和“SelectString, String”,分别表示选中第N+1(注意是从零开始表示!)个项目和选中与字符串String匹配的项目。
假设咱们要选中第五个项目“简体中文”,那么具体的用法示例以下:
【示例5.1.3】AHK:Control, Choose, 5, ComboBox1, InstallerControl, ChooseString, 简体中文, ComboBox1, InstallerAU3:ControlCommand("Installer", "", "ComboBox1", "SetCurrentSelection", 4)ControlCommand("Installer", "", "ComboBox1", "SelectString", "简体中文")