zghwelcome 发表于 2019-6-19 14:42:48

关于IUIAutomation接口的一些应用讨论

本帖最后由 zghwelcome 于 2020-1-7 14:08 编辑

前言: 因小的才疏学浅,本帖不上代码,仅对这个接口能帮我们实现哪些操作做个探讨.


1. 什么是IUIAutomation接口?请移步这里了解下 https://docs.microsoft.com/zh-cn/windows/desktop/api/uiautomationclient/nn-uiautomationclient-iuiautomation
2. 这个接口帮我们能做些什么?
Autoit3 操作标准控件是非常便利的,但是遇到自绘窗口(非标准控件)的操作却是一筹莫展。利用IUIAutomation接口,我们可以非常便利的操控非标准控件的窗口(前提是:这个非标准控件窗口支持IUIAutomation接口)。
3.如何知道哪些窗口支持这个接口呢?你可能需要用到的测试工具:Inspect.exe
Inspect这个工具非常便利,把鼠标移动任意坐标,Inspect就会得到该坐标最顶端的IUIAutomation接口元素。

4.如何从0基础入手学习这个接口呢?
英文官网已经有个UDF,可以从这里学习使用方法: https://www.autoitscript.com/forum/topic/153520-iuiautomation-ms-framework-automate-chrome-ff-ie/?tab=comments#comment-1105530
这个接口可不仅限于操控谷歌、IE这些浏览器窗口哦

导航:
      2F      利用该接口获取QQ聊天窗口的聊天记录消息
      3F      在简单滑块验证中的应用测试,以TB滑块验证为例
      4F      在中等难度的滑动拼图验证测试,以企*鹅为例演示
      7F      在浏览器网页填表中的应用,以某度搜索关键词为例
      12F      进阶篇●高等难度的滑块拖动验证测试 (以J*D为例)


UIA接口使用Demo         1.通过UIA接口、HOOK系统Event监控QQ窗口消息和输入
                                     2.Au3与web交互简单demo,关键词【UIA、回调、IE、对象】

zghwelcome 发表于 2019-6-19 21:22:53

在浏览器网页填表中的应用,以某度搜索关键词为例


如上图所示,UIA接口中有两种方法可以实现点击,分别是 "Invoke.Invoke" 和 "LegacyIAccessible.DoDefaultAction"
后者更通用,可以实现网页中链接和按钮的点击操作。
还有一种方法 "LegacyIAccessible.SetValue" 可以实现对可修改值的元素设置新的内容
这三种方法就可以实现网页填表了,无需鼠标移动和点击操作,精准高效

定位搜索栏元素和搜索按钮元素方法我就不累述了


下图是谷歌浏览器BD搜索演示:

zghwelcome 发表于 2019-6-19 14:44:06

本帖最后由 zghwelcome 于 2019-6-19 15:19 编辑

利用该接口获取QQ聊天窗口的聊天记录消息
先上图,后说话

QQ聊天窗口是一个非标准控件窗口,Au3的信息抓取工具Au3Info,根本就没法抓取里面的聊天记录,但是我们可以利用该接口完成该操作。
打开工具Inspect.exe, 我们把鼠标移动到聊天记录区域稍停片刻,Inspect上面就会展示该区域的元素信息, 上图中绿色框选部分相当于该元素的属性,ControlType 可以理解为标准控件中的控件类型。
元素的文字信息一般体现在元素属性"Name" 或 "Value.Value" 中。所以,在枚举某个窗口某种控件类型(ControlType)的集合后,可以利用属性"Name" 或 "Value.Value" 精确定位元素对象,并实现操控。

那么获取QQ聊天窗口的聊天记录思路为:
枚举该窗口的所有控件类型 UIA_EditControlTypeId , 然后判断每个元素对象的属性"Name" ,如果值为 "消息", 那么我们就取该元素的属性 "Value.Value" 的值------即为我们需要的聊天记录信息!

zghwelcome 发表于 2019-6-19 14:45:09

本帖最后由 zghwelcome 于 2019-6-19 19:54 编辑

在简单滑块验证中的应用测试,以TB滑块验证为例TB的登录滑块验证是相当简单的了,无需识图就可以精准操作。先上图

这是谷歌浏览器中的登录界面,乱输入几次后触发出拖动验证。
在浏览器页面内,每句话,每个图片,每个Input框,每个Button等等...,都是UIA接口中的一个元素,它们都有自己的元素属性、及属性值。
如何判断登录界面出现拖动验证了呢?只需判断 UIA_TextControlTypeId 该控件集合中是否有元素的 "Name" 属性值为 "请按住滑块,拖动到最右边",如果有则说明需要拖动验证了。
拖动验证,首先需要定位上图标识 "①"滑块的起始位置,和拖动到的结束位置。
通过工具 Inspect,我们发现下图中的元素关系


我们只需先定位元素 "请按住滑块,拖动到最右边" 这个文本控件,它的矩形区域右边坐标即是拖动的结束位置,它的前一个元素就是滑块拖动的起点位置。
拖动效果如下图(不受桌面分辨率,浏览器缩放影响)



zghwelcome 发表于 2019-6-19 14:46:12

本帖最后由 zghwelcome 于 2019-6-19 20:34 编辑

在中等难度的滑动拼图验证测试,以企*鹅为例演示先上图

这种验证就比TB的复杂不少,如上图,也需要定位红色滑块(左一)的位置、大小,以及获取绿色背景框的右侧边界
这两个元素与TB不同,控件类型是 UIA_ImageControlTypeId (图片) ,如何定位就不累述了,无非就是利用元素属性判断。
企*鹅的滑动验证的拖动结束位置有个取巧的方法,大概率会出现上图中文字说明的情况,获取绿色框右侧边界,往左侧减一个红色框大小就是拖动的结束位置。
如果偶尔出现不是这种情况的话,验证失败,可以刷新下验证,再重新识别拖动。85%的几率一次成功
下图是演示效果(可以通用企*鹅各平台登录界面,背景越复杂,效率越慢):




afan 发表于 2019-6-19 16:15:47

这个可以发在资料区或者交流区

zghwelcome 发表于 2019-6-19 18:43:50

afan 发表于 2019-6-19 16:15
这个可以发在资料区或者交流区

麻烦A版移一下

yohoboy 发表于 2019-6-20 00:19:16

推推... 可以好好參考了。

afan 发表于 2019-6-20 13:13:42

辛苦了~ 有空可以学学

heavenm 发表于 2019-6-20 19:44:06

厉害了,楼主伟大!

supermaket 发表于 2019-6-22 13:53:43

看下看下,小白上路,请多关照,不胜感激

zghwelcome 发表于 2019-6-22 17:27:50

进阶篇●高等难度的滑块拖动验证测试 (以J*D为例)
先上图:

难点提示:
1. 背景复杂,滑块左右位置-X坐标漂浮不定,不能像企*鹅拖动验证那样可以取巧(如前面篇章所述,上下位置-Y坐标我们已经可以轻松get)

2. J*D还加入了JS的鼠标轨迹检测,即使我们取到准确的滑块拖动结束的X坐标, MouseClickDrag 的匀速拖动也会令失败率高达90%以上
这个情况难道真得用深度学习或机器视觉学习才能解决问题吗?如果有这个时间精力这个方法当然是一个不错的选择,下面来介绍怎么用纯AU3借用UIA接口解决

(如果初识AU3,建议不要点进来浪费时间,没有代码,只有思路)

**** Hidden Message *****




heavenm 发表于 2019-6-22 19:58:51

有代码就完美了!

xin266 发表于 2019-6-25 09:03:44

不会用啊 !

f4李文杨 发表于 2019-6-29 16:23:17

这个要好好研究一下!
页: [1] 2 3 4
查看完整版本: 关于IUIAutomation接口的一些应用讨论