本文目录
引言
一款产品如果能提供用户界面,又能提供功能调用接口API,这对程序员来讲无疑有福了,他可以通过PowerShell或者其它程序语言调用来达到自动化的目的,把重复的事情交给机器,让人来做更有意义的事情。UI自动化测试自然是通过程序操作用户界面来达到测试的目的,核心思想就是:“桌面版找控件,网页版找DOM节点”
UI Automation
介绍
这应当是微软最新的桌面UI自动化测试框架,之前还有MSAA,我只听过,还没有用过。UI Automation位于.NET Framework中。关键程序集有两个:
- UIAutomationClient.dll
- UIAutomationTypes.dll
大概路径为:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\
使用技巧:
- 每个控件都是一个AutomationElement对象。
- AutomationElement可以通过FindAll和FindFirst方法递归搜索子控件,通过参数可以过滤控件的类型。
- 每一个AutomationElement都有它本身所支持的可被执行的模式(Pattern),其实就是动作啦,比如按钮自然是点击模式,文本框自然是取值和赋值模式。
- 一款能够显示当前控件树结构的工具必不可少,visual studio中自带的有Spy++,但是用着不爽。这里推荐和分享一个UISpy:链接: http://pan.baidu.com/s/1jGiITsq 密码: vi56
操作Windows计算器实例
光说不练,咋行!下面使用C#来举例说明:先打开计算器,依次点击 1,6,平方根 按钮,其实就是求16的平方根。
//以桌面为根节点,找到计算器窗口 var calcWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "计算器")); //按钮序列求16的平方根AutomationElement var buttons=calcWindow.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ClassNameProperty, "Button")) .Cast<AutomationElement>() .Where(b=>new string[]{"1","6","平方根"}.Contains(b.Current.Name)); foreach (AutomationElement btn in buttons) { //获取鼠标点击模式 var click = btn.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern; //执行点击 click.Invoke(); }
先手动打开计算器calc.exe,然后运行上面的代码,计算器会停留在该界面:
上面的C#代码很容易转换成PowerShell脚本,这不是本章的重点,所以略过。
关于第三方控件
这是微软的测试框架,自然支持标准的Windows控件,但是有些第三方控件可能不支持,比如QQ的密码框(如果支持,还了得)。
UI Automation PowerShell扩展
之前Victor推荐过这个UI Automation PowerShell Extensions。今天由荔非苔在本博客上再正式推荐一下吧!
还是上面的例子,让我们用UI Automation PowerShell扩展来完成吧。既然是PowerShell,没什么好讲的,顾名思义即可,直接看脚本吧:
$calc=Get-UiaWindow -Name '计算器' '1','6','平方根' | foreach { $calc | Get-UiaButton -Name $_ | Invoke-UiaButtonClick }
为什么推荐它,您自己眼见为实。您也许会说这例子弱爆了,powershell控制台就可计算平方根。是的!那就下一篇玩个稍微有点意思的,自动给QQ群发消息,敬请期待!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
早上想学习下这个方法,下载了UIAutomation 0.8.7 Beta 2但不会安装。要到Powershell哪个版本才支持Get-UiaWindow命令?
你下载了以后里面会有一个UIAutomation.dll。你把这个dll用Import-module导入即可出现Get-UiaWindow命令。
import-module导入UIAutomation.dll要注意什么吗?新手上路,求指导(用import-module -name UIAtomation.dll导入不成功,加路径也不成功)
具体什么错误?
Import-Module : Could not load file or assembly
你的PowerShell是4.0或者更高版本吗?你的系统是win7还是win8,还是win8.1,或者win10.
我当时是在win8.1上测试通过的。
我的也是win8.1,告诉我具体命令
就是Import-Module E:\Powershell\UIA\UIAutomation.dll
还是不对,不知道问题在哪,好尴尬
第一保持你的UIAutomation.dll和原压缩包中的其它dll在同一目录。
第二:出错以后,$e=$Error[0];$e.Exception.InnerException;
看下有没有更详细的错误。
看下InneException是不是这个错误:
An attempt was made to load an assembly from a network location which would have
caused the assembly to be sandboxed in previous versions of the .NET Framework. This
release of the .NET Framework does not enable CAS policy by default, so this load may
be dangerous. If this load is not intended to sandbox the assembly, please enable the
loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for
more information.
荔非苔大哥,不知道怎么看
我试试 刚才没看到
An attempt was made to load an assembly from a network location which would have caused the assembly to be sandboxed
in previous versions of the .NET Framework. This release of the .NET Framework does not enable CAS policy by default,
so this load may be dangerous. If this load is not intended to sandbox the assembly, please enable the
loadFromRemoteSources switch. See http://go.microsoft.com/fwlink/?LinkId=155569 for more information.是这个错误
UIAutomation.dll这个dll使用的是之前的powershellSDk编译的,貌似目前只支持PowerShell 2.0,和3.0.我们系统中的PowerShell版本应当已经是4.0或者5.0,所以暂时不支持。另外UIA的官网上也没有最新的版本。
目前经测试发现一个备选方案,让PowerShell 运行在2.0的runtime中。
谢谢大哥
经过深入测试发现其实还有更好方案,你试一下。
给下载的uia所在文件夹的文件全部解锁。这样操作:
成功了,谢谢荔哥
广播: PowerShell 自动给QQ群发消息 | PowerShell 中文博客
荔非苔大哥,这个功能看上去挺诱人的,但是小弟没有c#基础,纯粹盯着powershell,不是非常看得明白啊.有木有前期的铺垫材料分享一下?
另外就是我在英文操作系统下,把代码中的中文改成Calculator和sqrt,可是结果还是报错,计算机上就显示16,貌似没有执行平方根.Get-UiaButton : failed to get control in 5000 milliseconds by: title: ‘sqrt’, automationId: ”, className: ”, value: ”.At line:3 char:12+ $calc | Get-UiaButton -Name $_ | Invoke-UiaButtonClick+ ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : OperationTimeout: (:) [Get-UiaButton], Exception + FullyQualifiedErrorId : ControlIsNull,UIAutomation.Commands.GetUiaButtonCommand
我这个例子中用的是控件的名字去找的。在英文的系统中开平方的按钮名字为:”Square root”,你的‘sqrt’肯定不对啦。
原来如此,根据你的第二篇文章找到了uispy,那个里面看了到.
针对你的问题,我刚才把本文更新了下,可以去网盘下载uispy。
UISpy 已经被微软抛弃了,现在微软官方推荐Inspect.exe了,包含在Windows Software Development Kit (SDK) http://msdn.microsoft.com/en-us/library/dd318521(v=vs.85).aspx
UI Automation这两天试了下这个东西,最新的0.8.7beta2,卡死比较频繁,论坛也有其他版本的卡死反馈,稳定性欠佳
我之前测试时,也遇到了偶尔卡死的情况。所以尽量少用递归,采用顺序查找。
;ahk的写法
Run calc
Sleep,1000
op:=[“1″,”6″,”平方根”]
for key,val in op
InvokeUiaButtonClick(GetUiaButton(val))
return
GetUiaButton(_in)
{
;这里需要配置
keymap:={“1″:”Button5″,”2″:”Button11″,”3″:”Button16″,”4″:”Button4″,”5″:”Button10″,”6″:”Button15″,”7″:”Button3″,”8″:”Button9″,”9″:”Button14″,”0″:”Button6″,”.”:”Button17″,”平方根”:”Button25″,”+”:”Button23″,”-“:”Button22″,”*”:”Button21″,”/”:”Button20″,”=”:”Button28″,”C”:”Button13″}
for key,value in keymap
{
if (key=_in)
return %value%
}
}
InvokeUiaButtonClick(_in)
{
ControlClick,%_in%,ahk_class CalcFrame
}
感谢分享,之前都没有听说过autohotkey,今天也长知识了。
请教楼主关于这个工具每次执行完获取操作和点击操作后都会在power shell里弹出下面的提示,请问有什么设置可以关闭这些自动出来的提示呢?
如 执行 Get-UiaWindow -n Cal*后就会出现如下:
Current : UIAutomation.UiElementInformation
Descendants : Castle.Proxies.UiExtendedModelHolderProxy
Children : Castle.Proxies.UiExtendedModelHolderProxy
Control : Castle.Proxies.UiControlInputHolderProxy
Mouse : Castle.Proxies.UiMouseInputHolderProxy
Keyboard : Castle.Proxies.UiKeyboardInputHolderProxy
__interceptors : {UIAutomation.MethodSelectorAspect, UIAutomation.ErrorHandlingAspect}
你好,用UIA我打开notepad,并写入内容。我想问下我怎么能选中我写的一部分内容呢。Get-UiaDocumentRangeText -TextLength 15,这条语句能得到写入的前15个字符,谢谢!
比如说,我想选中在文本中写的第10到第20个字符之间的字符串,应该如何实现呢?
UIAutomation在哪里下载
https://archive.codeplex.com/?p=uiautomation
UIAutomation Powershell扩展下载后,压缩包里面没有UIAutomation.dll
不知道还更不更新了,我在推荐的网站上下载的UI Automation扩展包里面都是cs文件,并没有.dll文件,不知道怎么使用这个工具?