目录:导读

引言

选择Windows UIA框架进行自动化测试的原因

查找窗口

读取QQ软件的好友列表

结语


引言

每个使用QQ的人都有自己的好友列表,但是如果你想要查看所有好友信息,手动一个个点击会非常浪费时间。那么有没有什么快速获取好友列表的方法呢?

答案是有的!Windows UIA自动化测试框架可以帮助你轻松实现自动抓取好友列表,并且不需要编写太多代码。

在这篇文章中,我将与大家分享如何使用Windows UIA自动化测试框架获取QQ好友列表,让你从此告别繁琐的手动操作,享受高效的自动化体验!

选择Windows UIA框架进行自动化测试的原因

前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation,但是pywinauto主要是封装Win32的api,只局限于winform框架,而python中的uiautomation其实是封装的windows中的uia框架。基于项目效率考虑,所以最后决定使用windows中的UIAutomation框架。

这款WindowsUIA框架是同时支持wpf和winform,由于公司项目主要是wpf为主,所以以下学习和举例也是基于wpf框架,没有深入研究winform下的差异,但是大体上还是差不多的。

仅仅作为客户端来invoke的话,只需要引用下面两个dll即可,可以在.Net框架中查找:UIAutomationClient.dll,UIAutomationTypes.dll

在UIA框架中,所有元素包括窗口和控件都表现为AutomationElement。一个进程中的UI在空间上分布在一棵UI树上面,只需要找到UI树的根元素,就可以检索到与之相关联的其他任何元素

查找窗口

查找每个进程的根元素最常用的是根据控件句柄查找,方法如下:

但是这个框架没有提供检索句柄的功能,所以需要和API配合使用:

private static extern IntPtr findWindow(string lpClassName, string lpWindowName);

根据这个API获取某个窗口的句柄,根据这个窗口的句柄获取到AutomationElement,然后就可以通过下面的方法来查找其他元素

以上两个方法可以搜索到这颗UI树上的所有子控件,例如查找某个Name属性为MyButton的Button控件并触发它的点击事件,就可以这样实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

PropertyCondition typeProperty = new PropertyCondition(AutomationElement.IsInvokePatternAvailableProperty, true);

                PropertyCondition nameProperty = new PropertyCondition(AutomationElement.AutomationIdProperty, “MyButton”);//搜索条件

                AutomationElement ele = _mainAutomationElement.FindFirst(TreeScope.Subtree, new AndCondition(typeProperty, nameProperty));

                if (ele != null)

                {

                    if (ele.Current.IsEnabled)

                    {

                        InvokePattern pattern = (InvokePattern)ele.GetCurrentPattern(InvokePattern.Pattern);

                        pattern.Invoke();//触发点击事件

                    }

                 }

需要注意的是WPF中控件的属性映射到AutomationElement有以下对应关系

Control property in WPF Property in AutomationElement
Name         AutomationIdProperty
Content   Name
Title   Name

窗口的Title和继承ContentControl 的控件的Content  都会映射为AutomationElement中的Name属性

通过上述方法,基本可以查找到WPF中所有常用的控件,至于三方控件也有一定的兼容性。

基于以上信息,我们可以开发一个小工具,用于读取QQ软件的好友列表。

读取QQ软件的好友列表

​这个小功能还是通过win32API+UIA框架实现的,获取到qq好友列表中的成员备注名称,图中的好友姓名只取姓氏。

用到的API如下:

private const int MOUSEEVENTF_LEFTDOWN = 0x0002;//press the  mouse left button
private const int MOUSEEVENTF_LEFTUP = 0x0004; //release the mouse right button
private const int MOUSEEVENTF_WHEEL = 0x800;//mouse wheel
[DllImport("user32.dll", EntryPoint = "FindWindow")]
private static extern IntPtr findWindow(string lpClassName, string lpWindowName);
[DllImport("user32.dll")]
private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
[DllImport("user32.dll", EntryPoint = "SetCursorPos")]
private static extern bool setCursorPos(int X, int Y);

第一个API是为了获取qq窗口的句柄,第二个和第三个是用来模拟鼠标操作。

主程序代码很简单,基本流程是先检索到列表名称的控件,然后通过获取坐标控制鼠标点击将列表展开,检索该列表中所有的成员。检索完成后将列表重新隐藏,避免列表成员太多,列表太长,影响下一个列表的展开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
IntPtr ptr = findWindow( null , "QQ" );
List< string > tables =  new List< string >() { "高中" , "小学" , "初中" , "网友" , "大学" }; //好友列表名称
AutomationElement _mainElement = AutomationElement.FromHandle(ptr);
foreach ( var item  in tables)
{
     PropertyCondition type =  new PropertyCondition(AutomationElement.IsControlElementProperty,  true );
     PropertyCondition name =  new PropertyCondition(AutomationElement.NameProperty, item);
     AutomationElement tableElement = _mainElement.FindFirst(TreeScope.Subtree,  new AndCondition(type, name));
     if (tableElement!= null )
     {
         Click(tableElement.GetClickablePoint().X, tableElement.GetClickablePoint().Y); //展开列表
         AutomationElementCollection ac = _mainElement.FindAll(TreeScope.Subtree,  new PropertyCondition(AutomationElement.IsSelectionItemPatternAvailableProperty,  true ));
         Console.ForegroundColor = ConsoleColor.Red;
         Console.WriteLine(tableElement.Current.Name+ ":" );
         Console.ForegroundColor = ConsoleColor.White;
         foreach (AutomationElement ele  in ac)
         {
             Console.WriteLine(ele.Current.Name.Substring(0, 1) +  "**" );
         }
         Click(tableElement.GetClickablePoint().X, tableElement.GetClickablePoint().Y); //重新隐藏列表
     }
}
Console.ReadLine();

  

通过控制鼠标的API和UIA框架基本可以实现模拟任何人为操作,对实现windows app自动化测试是一个不错的选择。

结语

这篇贴子到这里就结束了,最后,希望看这篇帖子的朋友能够有所收获。

更多软件测试技巧获取方式:留言【软件测试学习】即可

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

自动抓取QQ好友列表?Windows UIA教你轻松实现相关推荐

  1. 用python 、itchat登录微信网页版 微商自动回复功能、抓取微信好友信息列表。

    最近用Python实现了一些微信的简单玩法 我们可以通过网页版的微信 微信网页版 ,扫码登录后去抓包爬取微信信息,还可以post去发送信息. >>安装itchat这个库 pip insta ...

  2. qq好友列表获取之动态爬虫清洗爬取好友列表数据 - 获取qq好友、群、群成员列表

    qq好友列表获取之动态爬虫清洗爬取qq好友列表数据 - 获取qq好友ip.群.群成员列表.我们的好友列表要从 qzone 获取,现在打开 qzone 的链接 https://h5.qzone.qq.c ...

  3. QQ好友列表获取导出类:爬虫爬取QQ号

    QQ好友列表获取类:爬虫爬取QQ号,这个个爬虫是拿来练手的,可以爬取网络中的QQ号,然后存储到本地 import urllib.request import ssl import re import ...

  4. python获取qq好友ip_使用Python模拟登录QQ邮箱获取QQ好友列表

    最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表. 实现方式: 通过google一搜,实现的方式大 ...

  5. 手把手教你使用Python抓取QQ音乐数据(第四弹)(文末赠书)

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 千里之行,始于足下. [一.项目目 ...

  6. jupyter分割代码块_科研分享—Python根据关键词自动抓取Pubmed文献标题(附全部代码)文末有福利...

    写在前面:接触Python应该是8月初的一篇公众号文章,大致内容是使用py爬取数据库并汇总到本地.正好手头需要对某个领域的文献进行调研,不妨学习一下. 什么是Python? 百度说:Python (计 ...

  7. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  8. 手把手教你使用Python抓取QQ音乐数据!

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  9. 自动化抓取stackoverflow问题列表

    自动化抓取stackoverflow问题列表 最近在关注stackoverflow上的某一类问题, 所以想用程序帮我做监控,自动打开浏览器,搜索指定关键词,然后把前30个问题列表保存或者发给我. 源代 ...

最新文章

  1. 【组合数学】排列组合 ( 多重集组合数 | 所有元素重复度大于组合数 | 多重集组合数 推导 1 分割线推导 | 多重集组合数 推导 2 不定方程非负整数解个数推导 )
  2. Mysql 存储引擎有哪些以及MyISAM和InnoDB区别
  3. JavaWeb学习之路——SpringBoot 中thymeleaf模板用法(三)
  4. Poj2480欧拉函数
  5. 集线器(Hub)、交换机(Switch)与路由器(Router)之间的区别和联系
  6. 测试硬盘读写速度软件_机械硬盘回春:2023年容量破40TB 读写速度媲美SATA SSD
  7. GXU - 7D - 区间求和 - 前缀和
  8. Linux之shell脚本(2)
  9. HeadFirstJava——11_异常处理
  10. Atitit 圣阿提拉克斯阿克巴仁波切诗歌集 1. 诗歌集分类 1 1.1. 国王颂歌 1 1.2. 爱情类(相逢 赞美 相识 思念 离去 分分离离 忘记) 1 1.3. 其他 1 1.4. 大
  11. elasticsearch,spring boot,mybatis项目小结
  12. Composer 的常用命令
  13. 应用|5G时代10大应用场景!
  14. 小米Redis的K8s容器化部署实践
  15. CTF--2016中国西安西电华山杯网络安全技能大赛之crackme6
  16. “冰箱强行播广告关不了”上热搜,网友:买了块广告牌回家
  17. 环境问题-无外接显示屏(虚拟显示屏)远程控制Ubuntu
  18. Android避坑指南,Gson与Kotlin碰撞出一个不安全的操作
  19. Nextcloud集成Active Directory(AD)LDAP用户身份验证
  20. 网络术语MSL/TTL/RTT

热门文章

  1. 【效率神器】电脑上实现语音输入文字
  2. MyBatis中大于号以及小于号的表达方式
  3. xml文件使用浏览器打开,提示This page contains the following errors解决办法
  4. matlab中除法的使用,错误使用 / 矩阵维度必须一致
  5. 树莓派无法识别摄像头+树莓派中opencv调用视频流人脸检测
  6. 大白话教你认识 Kafka 背后优秀的架构设计
  7. 离线语音芯片-开发指南
  8. 判赔腾讯108万,科技公司为公众号“刷量”构成不正当竞争
  9. 一个数如果恰好等于它的因子之和,这个数就称为 完数 。例如6=1+2+3.编程 找出1000以内的所有完数。
  10. windowxp网络无法发现其他计算机,几个步骤轻松解决win7无法访问XP系统共享问题...