测试可以自动化,日常工作也可以自动化,autoit帮你搞定!

    新进一个公司,应聘的是java开发职位,进公司后让我做个软件自动化的东西,这可是个新鲜事情,以前自己从来没有搞过。

    废话少说,先把需要做的事情描述一下:有一个基金交易管理系统,是delphi开发的。我的任务就是模拟基金经理下指令,然后把指令分发出去,由交易员委托给交易所。把这个过程做成自动化。

    如下图:点击“ETF指令”——>点击“ETF指令”——>选择“基金编号”——>填写“指令数量”——>点击“计算”按钮——>点击“确定”按钮。

测试可以自动化,日常工作也可以自动化,autoit帮你搞定!_第1张图片

    接到这个任务,有些发懵,自己从没搞过,不知道如何下手。幸好知道测试可以自动化,那么我可不可以用到这里哪?也是个思路啊。搜索了下,发现还真有不少这样的工具,如ibm的robot、loadrunner等,不少啊。担心不能领会领导意图,就问了问同事,他们觉得应该是做个录屏的工具。这样才具有更多的通用性。我就赶紧查了查录屏的资料,主要是用c++开发的居多,并且用到win32的api,甚至有汇编内容。我的妈,赶紧往后退,我没学过windows编程,更谈不上汇编了。太难了。不过,做个录屏的工具效果更好。咋办,下班前就给老大发了封邮件,说了一下这个情况,打算使用测试软件来做这个事情。

    第二天,老大推荐了一个小的脚本语言——autoti,可以做自动化的事情。

    我的工作就是基于它完成的,但是也遇到了很多困难。

    先说好处吧。autoit语法类似于basic,非常简单,几分钟就可以上手干活。功能很强大,能够操作web页面、客户端软件,识别html代码、windows控件,模拟鼠标移动、键盘点击、发送快捷键、发送windows消息等。

    delphi的控件并不完全是windows控件的封装,有些是delphi特有的,有些是程序员画出来的。就像上面的这个示例,最下面的还有“ETF指令”、“ETF交易”的面板,就是delphi的TSpeedBar,这个控件容器的特点是不返回句柄,拿不到里面的按钮的句柄。没有句柄,就无法识别按钮控件,无法发送点击事件。这可犯了愁,搜索了国内外论坛,发现可以使用坐标定位的方式。这种定位使用的是客户端坐标,不是屏幕坐标,因此和屏幕分辨率无关。但是面板上面的按钮是可变的,我目前没有办法解决,只能是打开客户端的时候默认显示这几个按钮。

    还有最上面的ETF指令,也是通过坐标定位的方式识别的,然后发送单击事件。

 

    以上这个东西还算简单。不管实现方式多么笨拙,起码是能够跑通了。真正头疼的,以及耗费1周时间的地方在下面哪。

    在上图中下了指令后,在下图中会有显示。因为网络有延迟,所以需要点击刷新按钮,下面的表格内容才会有变化。可恨的地方就在这里。下面的表格控件是delphi的TDBGridEh,看源码的时候发现是画出来的。用spy++等也无法拿到表格数据。但是,我这里非要使用这里的数据,因为我要知道是哪条指令,以及指令的具体内容。autoit不认识这个控件,无法取到数据,看来这条路是堵死了。老大建议用win32来搞一搞。本来打算绕过去,看来还是不能幸免。最后我想了个主意,就是通过钩子注入到客户端程序,把句柄转化成delphi对象,调用控件的api。看来这是个好主意。

测试可以自动化,日常工作也可以自动化,autoit帮你搞定!_第2张图片

    接下来的一周我就开始研读win32编程,了解windows的消息机制,windows进程和线程的不同,windows程序的内存结构、映射文件、进程间通信。妈的,累啊。把《Windows程序设计(第五版)》、《WINDOWS.核心编程第五版》、《Delphi下深入Windows核心编程》看了至少一遍,有的章节看了至少三四遍。因为自己一点基础也没有,看一遍根本不懂啥意思。幸好有百度等工具,不懂得名词立刻查。这一周,同时学习delphi如何写钩子。自己被java溺爱惯了,哪见过win32这么多指针、这么多数据类型,而且delphi还不是编译时检查,非要运行时才检查,有时候,一个多小时,才写一个函数!心里那个郁闷!!!每天加班到10点多才回家,奶奶的!

    幸运的是,我通过delphi注入钩子,拿到了表格控件的对象。可气的是,调用表格对象的dataSource.dataSet的方法时,报内存访问错误。有经验的同事说,指针飞了。他奶奶的,费了我一周时间,竟然又搞不通!如果再让我去根据内存地址读数据,我估计又要花费一周时间啊。我心想,完了,刚进公司,第一件事情没有弄个开门红,没啥好印象了。郁闷的脸上都起疙瘩了,严重毁容!

    正当无路可走的情况下,忽然发现,鼠标点击表格的每一行后,下面会显示明细!如果我能够控制光标在表格每行的变化,是不是就可以根据明细取到详细数据啊?!下手干!!

    我首先让鼠标定位到这个控件,然后根据第一行的相对坐标位置,发送一个点击事件,然后利用上下键移动光标!!

    搞定!!!!!

 

    这个活,干了3周多,光人力成本,公司也花费小2万了。搞的这个东西虽然稳定性比较差,受键盘和鼠标干扰严重,但是毕竟做出了东西,也算是完成了任务。

    原本以为很简单的任务,没想到搞得这么复杂,大大出乎所有人预料。

    虽然算是完成了任务,但是自己心里还是不满意,毕竟程序的健壮性很差。

 

    通过这个小任务,熟悉了autoit的强大功能,以后真的可以应用到其他程序中,比如自动化,或者日常的繁琐性重复性工作中,会极大简化我们的工作。

    各位朋友,可以了解一下这个小语言。如果对此感兴趣,本人把这段时间收集的相关资料奉献出来,很多资料并不是那么好找的哦。

你可能感兴趣的:(auto)