一种桌面自动化测试开发方法及系统与流程

文档序号:16327882发布日期:2018-12-19 06:01阅读:693来源:国知局
一种桌面自动化测试开发方法及系统与流程

本发明涉及桌面自动化测试开发技术领域,具体涉及一种桌面自动化测试开发方法及系统。

背景技术

目前桌面自动化测试开发领域没有通用的跨语言的api,这个是最大的痛点,不支持各种主流编程语言比如java语言、c#语言、python语言等,顶多只支持自己定义的脚本编辑,很复杂,不方便,在测试开发领域没法推广。

各大公司更为通用的是使用国外团队开发的autoit工具,虽然也是使用了微软底层的api技术,但定位效率很差,并不精确,依赖太多的元素信息才能定位。autoit工具用一种类似vb的语言编写脚本生成exe,然后给各种语言来调用,没有能直接运用于测试开发本身的框架,不能直接能被各种语言编写的测试开发代码直接能调用,本身还很复杂,即使生成exe,也是需要编写,不懂代码的人员很难做到的脚本编写。另外仅生成exe,没有api接口,相当于放弃了对界面进行验证的可能,这个是测试开发的大忌,测试开发的目的不仅仅需要自动化所有的操作,更需要验证每一步操作和验证操作后的效果有没有达到,比如,点击开始菜单,测试开发的正常流程应该是先确认菜单是否出现,菜单出现后才会继续下一步操作,因为前面生成的只是一个自动化操作的exe,并没有对每个操作进行验证。

webdriver支持各种常用的测试开发中常用的开发语言,java语言、c#语言、python语言等。但是,webdriver的作用域仅仅局限于浏览器网页展示区部分,超过网页区域的部分无法控制,当然也就无法实现自动化,比如浏览器菜单、工具栏等等,想要自动操作浏览器设置修改选项等等都无法做到。还有网页中很多操作它也无法办到,比如网页中有上传图片按钮会打开文件对话框,点击一个下载的链接会打开下载对话框,有时浏览器还会弹出是否允许插件等,这些webdriver都无法办到。

另外,国外商用软件,比如qtp,也是仅仅通过一种类似vb的语言来运行,而且本身需要安装软件,体积还比较大。



技术实现要素:

本发明的目的在于提供一种桌面自动化测试开发方法及系统,用以解决目前桌面自动化测试开发技术没有通用的跨语言的api、定位效率差等问题。

为实现上述目的,本发明提供了一种桌面自动化测试开发方法,所述方法包括:定位到元素对象获取元素对象的父窗口必要信息及元素对象的automationid、名称name、类名class、controltype信息;根据父窗口必要信息获取父窗口的起始搜索的iuiautomationelement元素对象并作为起始搜索点;调用findelement接口并把定位获取的元素对象的automationid、名称name、类名class、controltype信息作为参数传入;搜索到的精确定位的元素对象的iuiautomationelement元素指针;根据iuiautomationelement元素指针的getclickablepoint方法获取元素对象的可点击的点的坐标;及调用windowsapi模拟鼠标点击元素对象。

进一步地,所述精确定位的元素对象的iuiautomationelement元素指针的搜索方法包括:通过统一为char*类型的接口接收定位传来的参数并将所有char*类型的参数转化为底层com组件可识别的bstr类型的参数;根据iuiautomation接口的get_controlviewcondition函数创建控件视图接口的iuiautomationcondition指针并形成第一条件接口;根据定位获取的元素对象的automationid、名称name、类名class、controltype信息分别创建元素对象的automationid、名称name、类名class、controltype的iuiautomationcondition条件接口指针并形成第二条件接口,如果元素对象的automationid、名称name、类名class、controltype在定位器中信息为空,则对应iuiautomationcondition条件接口指针设为null;利用iuiautomation接口的createandcondition方法对第一条件接口和第二条件接口进行组合,如果相应条件接口指针为null则忽略;及以起始搜索点元素对象a作为起始搜索点,应用经组合得到的条件接口组合进行搜索,搜到的第一个满足条件的元素对象即确定精确定位的元素对象的iuiautomationelement元素指针。

进一步地,在调用findelement接口搜索精确定位的元素对象的iuiautomationelement元素指针之前,所述方法还包括:建立索引函数startindexing,其具体包括:定义一个map结构对象,所述map结构由superitem结构体和iuiautomationelement元素对象形成,其中,所述superitem结构体是一个包含元素对象的automationid、名称name、类名class、controltype信息的结构体,所述superitem结构体需要重载操作符以使所述superitem结构体可比较;从获取到的起始搜索点元素对象a节点开始遍历父窗口下所有元素并建立索引,遍历到每个元素对象的automationid、名称name、类名class、controltype信息和每个元素对象的iuiautomationelement指针所指向的元素对象;利用map结构建立key-value映射,key是superitem结构体的结构,所述key包含元素对象的automationid、名称name、类名class、controltype信息,value即为元素对象的iuiautomationelement指针。

进一步地,在建立所述索引函数startindexing的前提下,所述精确定位的元素对象的iuiautomationelement元素指针的搜索方法包括:通过统一为char*类型的接口接收传来的参数并将所有char*类型的参数转化为底层com组件可识别的bstr类型的参数;根据定位获取的元素对象的automationid、名称name、类名class、controltype信息填充superitem结构体;及根据填充完毕的superitem结构体利用建立的所述索引函数startindexing快速获取到精确定位的元素对象的iuiautomationelement元素指针。

进一步地,所述根据父窗口必要信息获取父窗口的起始搜索的iuiautomationelement元素对象的方法包括:定位获取的父窗口必要信息作为参数提供给动态链接库dll接口的开始搜索函数startsearchfrom;调用windowsapifindwindowex函数并传入父窗口必要参数信息,从而获取当前元素对象父窗口句柄;通过iuiautomation接口指针的elementfromhandle方法得到从所述父窗口起始的iuiautomationelement元素指针;及根据从所述父窗口起始的iuiautomationelement元素指针获取父窗口的起始搜索的iuiautomationelement元素对象。

进一步地,定位获取的所述父窗口必要信息为类名class信息和标题title信息。

进一步地,所述类名class信息为shell_traywnd信息,所述shell_traywnd为外壳函数类,主要用于管理状态栏及任务栏。

进一步地,所述父窗口类名class信息和标题title信息的定位获取方法包括:利用iuiautomation接口指针指向对象的方法get_controlviewwalker获取iuiautomationtreewalker指针;根据iuiautomationtreewalker接口的getparentelement方法和iuiautomation接口的compareelements方法从控件视图树形结构得到根节点下面最近的窗口即为元素对象父窗口的iuiautomationelement指针;通过iuiautomationelement接口的get_currentnativewindowhandle方法得到窗口句柄uia_hwnd;将窗口句柄uia_hwnd直接转换为hwnd得到父窗口的句柄;及根据父窗口的句柄通过windowsapigetclassnamet函数和getwindowtex函数分别得到父窗口类名class信息和标题title信息。

进一步地,所述元素对象的automationid、名称name、类名class、controltype信息的定位获取方法包括:通过mfc对话框窗口的onmousemove(uintnflags,cpointpoint)函数得到当前鼠标位置的cpoint;通过调用iuiautomation接口的elementfrompoint方法根据当前鼠标位置的cpoint得到指向所述元素对象的iuiautomationelement指针;及通过指向所述元素对象的iuiautomationelement指针得到所述元素对象的automationid、名称name、类名class、controltype信息。

本发明还提供了一种桌面自动化测试开发系统,所述系统包括:用c++语言开发的定位器,用于定位到元素对象获取元素对象的父窗口必要信息及元素对象的automationid、名称name、类名class、controltype信息;用c语言和c++语言开发的暴露c语言接口的动态链接库dll,用于根据所述定位器传入的参数搜索到的精确定位的元素对象的iuiautomationelement元素指针以获取元素对象的可点击的点的坐标并调用windowsapi模拟鼠标点击元素对象;及用c++语言开发的用于生成exe文件的内核,所述exe文件包含定位函数findelement和sendkeys函数,所述定位函数findelement和sendkeys函数放在所述exe文件中的预定数据块中的预定位置,所述定位函数findelement和sendkeys函数的已知数据块地址后面为要调用函数的标记,所述标记后面为统一char*类型的函数参数,所述函数参数后面为具体函数字符。

本发明具有如下优点:

本发明只需要4要素便可以高效定位桌面元素,4要素可以通过专门开发的定位器来识别,并且改进了搜索算法,比国外同类软件autoit工具要强很多,比它定位的更精准,定位时间更短、更高效,识别更准确,还克服了webdriver的作用域仅仅局限于浏览器网页展示区部分的问题,超过网页区域的部分也能实现控制,本发明可以做到支持各种语言,支持c++语言、java语言、c#语言、python语言等主流测试开发常用语言。

附图说明

图1为本发明公开的在元素对象在主界面上定位和操作不频繁情况下的一种桌面自动化测试开发方法的流程图。

图2为本发明公开的在元素对象在主界面上定位和操作不频繁情况下的一种桌面自动化测试开发方法中的精确定位的元素对象的iuiautomationelement元素指针的搜索方法的流程图。

图3为本发明公开的在元素对象在主界面上定位和操作频繁情况下的一种桌面自动化测试开发方法的流程图。

图4为本发明公开的在元素对象在主界面上定位和操作频繁情况下的一种桌面自动化测试开发方法中的建立索引函数startindexing的流程图。

图5为本发明公开的在元素对象在主界面上定位和操作频繁情况下的一种桌面自动化测试开发方法中的精确定位的元素对象的iuiautomationelement元素指针的搜索方法的流程图。

图6为本发明公开的一种桌面自动化测试开发方法中的根据父窗口必要信息获取父窗口的起始搜索的iuiautomationelement元素对象的方法的流程图。

图7为本发明公开的一种桌面自动化测试开发方法中的父窗口类名class信息和标题title信息的定位获取方法的流程图。

图8为本发明公开的一种桌面自动化测试开发方法中的元素对象的automationid、名称name、类名class、controltype信息的定位获取方法的流程图。

图9为本发明公开的一种桌面自动化测试开发系统的定位器定位任务栏中的firefox图标时自动获取父窗口信息的示意图。

具体实施方式

以下实施例用于说明本发明,但不用来限制本发明的范围。

实施例1

本实施例公开的一种桌面自动化测试开发系统包括:用c++语言开发的定位器,用于定位到元素对象获取元素对象的父窗口必要信息及元素对象的automationid(automationid:唯一地将ui自动化元素从其同级中标识出来的属性。有关与控件标识相关的属性标识符的更多信息)、名称name、类名class、controltype信息;用c语言和c++语言开发的暴露c语言接口的动态链接库dll,用于根据所述定位器传入的参数搜索到的精确定位的元素对象的iuiautomationelement元素指针以获取元素对象的可点击的点的坐标并调用windowsapi模拟鼠标点击元素对象;及用c++语言开发的用于生成exe文件的内核,所述exe文件包含定位函数findelement和sendkeys函数(sendkeys函数用于模拟键盘输入字符和快捷键操作),所述定位函数findelement和sendkeys函数放在所述exe文件中的预定数据块中的预定位置,所述定位函数findelement和sendkeys函数的已知数据块地址后面为要调用函数的标记,所述标记后面为统一char*类型的函数参数,所述函数参数后面为具体函数字符。

由于微软底层的api涉及太多元素对象,而且从桌面根节点搜索元素对象效率很低,本实施例摒弃众多没有价值的信息,仅仅根据4要素(实际上传入参数的一般只需要2-4个要素属性信息即可精确定位),从而大大提升定位效率。另外,由于本实施例中的技术方案不强制要求必须提供4个元素对象要素属性信息,4个元素对象要素属性信息中部分属性信息可能会传空值,如果按照api正常的逻辑是没法解决定位问题或者很困难实现定位,本实施例中对搜索的各种查询条件的接口进行了重新封装和设计,先给4个元素对象要素属性信息中有值的属性信息创建搜索条件接口,然后,不管是4个元素对象要素属性信息中哪些没有值,统一用自行封装的函数进行组合,创建条件搜索接口的意义在于按众多条件搜索元素,底层api可以提供搜索的条件太多了,但本实施例中技术方案仅需按照原创的搜索算法快速定位并顶多提供4要素的条件搜索接口,这样就完美的解决了问题。另外,在原始api中每个元素对象的action,就是人能对每个元素对象进行的操作是非常不一样的,每个元素对象还会支持一个或者多个不一样的操作,设计起来相当复杂,为了解决这个问题,这里代码可以获取这个元素对象的矩形区域,本实施例中公开的系统框架集成了底层鼠标操作,在区域内进行点击即可做到所有元素对象的一致性,当定位到该元素对象的时候,底层api可以获取这个元素所在的位置(一般是矩形区域),然后,只要在该区域内模拟一次鼠标单击即可获取可点击的坐标位置,也可以调用iuiautomationelement元素指针的getclickablepoint()方法来获取元素对象可点击的坐标位置。

本实施例中公开的一种桌面自动化测试开发系统编写暴露c语言接口的动态链接库dll,从而使各种编程语言都能调用,这一整套解决方案高效定位并完美支持了各种开发语言,为了支持各种开发语言c语言接口参数统一用char*类型的参数,底层的各种宽字符和bsr类型数据都在底层进行转换。为了支持各种开发语言,c语言接口参数类型char*更容易被各种语言所更好的兼容。本实施例中公开的技术方案定位元素对象的接口为:boolfindelement(char*pstrid,char*pstrname,char*pstrclassname,char*pstrcontroletype);在进行下一步操作前,可以判断如果定位函数findelement返回false则说明菜单并未打开,需要等待,这样自己可以有充分的验证和控制。

至于内核方面,内核生成的exe文件会包含定位函数findelement和sendkeys函数,把定位函数findelement和sendkeys函数放在exe文件中的预定数据块中的预定位置,定位函数findelement和sendkeys函数的已知数据块地址后面为要调用函数的标记,比如f,为了完美支持各种开发语言,参数类型统一是char*类型,因此,标记后面为统一char*类型的函数参数,函数参数后面为具体函数字符。内核本身大小是已经知道的,所以执行的时候一旦大小比内核本身大,则说明需要到已知数据块地址后面去依次执行函数和参数。当然这些数据可以用各种加密方法去提前加密,可以进一步提高安全。

本实施例中公开的一种桌面自动化测试开发系统只需要元素对象的至多4个属性信息,通常2-3个属性信息便足以精确定位,4个属性信息分别为元素对象的automationid、名称name、类名class、controltype信息,为了降低易用性和门槛,controltype信息自行进行了封装,定位器暴露出来的都是易于人类理解的控件类型,而不是底层的一串数字,大大提高了效率和易用性。

定位器主要是基于windows底层提供的uiautomationapi为基础开发的,但这些windows底层api不能跨各种开发语言,所以至今没有一个像webdriver一样可以大量推广的跨各种开发语言的框架和解决方案标准。本实施例中定位器的设计理念是为自行开发的dll接口提供更多的高效信息并作为参数提供给接口。底层api提供的关于元素对象的属性信息太多太多了,以至于很难用统一的方式去解决问题。本技术方案在定位元素对象时大大优化了搜索算法,并且已全力将搜索的性能做到极致。关于一个元素对象的属性信息,元素对象的automationid、名称name、类名class、controltype信息4个信息是最关键的,但仅靠这个也是远远不够的,重要的是需要高效的搜索算法为支撑。底层api默认搜索元素对象是从根节点开始搜索而且是跨进程的,消耗比较大,从根节点搜索到当前节点很可能会经历成百上千的元素对象,每个元素的信息都需要比对校验,效率很低,而且很可能不准确,针对此问题,定位器还会提供需定位元素对象的直接父窗口必要信息(类名class信息和标题title信息)。

参考图1、2和6,在元素对象在主界面上定位和操作不频繁情况下,本实施例公开的一种桌面自动化测试开发方法包括:定位器定位到元素对象获取元素对象的父窗口类名class信息和标题title信息及元素对象的automationid、名称name、类名class、controltype信息;定位器定位获取的父窗口类名class信息和标题title信息作为参数提供给动态链接库dll接口的开始搜索函数startsearchfrom;调用windowsapifindwindowex函数(findwindowex函数是在窗口列表中寻找与指定条件相符的第一个子窗口)并传入父窗口类名class参数信息和标题title参数信息,从而获取当前元素对象父窗口句柄;通过iuiautomation接口指针的elementfromhandle方法(用于根据句柄得到iuiautomationiuiautomationelement元素指针)得到从所述父窗口起始的iuiautomationelement元素指针;根据从所述父窗口起始的iuiautomationelement元素指针获取父窗口的起始搜索的iuiautomationelement元素对象a并作为起始搜索点;调用findelement接口并把定位获取的元素对象的automationid、名称name、类名class、controltype信息作为参数传入;通过统一为char*类型的接口接收定位传来的参数并将所有char*类型的参数转化为底层com组件可识别的bstr类型的参数;根据iuiautomation接口的get_controlviewcondition函数创建控件视图接口的iuiautomationcondition指针并形成第一条件接口;根据定位获取的元素对象的automationid、名称name、类名class、controltype信息分别创建元素对象的automationid、名称name、类名class、controltype的iuiautomationcondition条件接口指针并形成第二条件接口,如果元素对象的automationid、名称name、类名class、controltype在定位器中信息为空,则对应iuiautomationcondition条件接口指针设为null;利用iuiautomation接口的createandcondition方法对第一条件接口和第二条件接口进行组合,如果相应条件接口指针为null则忽略;以起始搜索点元素对象a作为起始搜索点,应用经组合得到的条件接口组合进行搜索,搜到的第一个满足条件的元素对象即确定精确定位的元素对象的iuiautomationelement元素指针;根据iuiautomationelement元素指针的getclickablepoint方法获取元素对象的可点击的点的坐标;及调用windowsapi模拟鼠标点击元素对象。

一个元素对象的属性很多,定位时如果只用一个的话,产生重复和歧义的概率会很大,比如,开始菜单的名称name是开始,桌面有个文件名也是开始,或者其他窗口有个元素对象的名称name也是这个名称。本实施例中的技术方案为了用最快的速度最高的效率去精确的搜素到指定的元素。正因为有了算法的支持,只要元素对象的至多4个属性信息已经足够快速并精确的定位到元素对象。

本实施例对于父窗口有两种情况需要说明并为了提升搜索速度做了创造性的优化。一种情况是:对于应用程序来说,就是可以打开一个主界面窗口的应用程序,比如,打开一个word文档、打开一个记事本、打开一个计算器等等,对于这种情况,父窗口就是应用程序主界面的窗口,定位器会自动获取父窗口信息。另一种情况是:比如,定位一个任务栏中firefox元素的图标,定位任务栏中的firefox图标的时候,定位器也会自动获取父窗口信息如图9所示。此时,父窗口的信息就是类名class信息为shell_traywnd,shell_traywnd是个外壳函数类,主要是用于管理状态栏及任务栏的,它还可以分为一些小的子类,如管理程序最小化后跑到任务栏里等。shell_traywnd的窗口并不是可见的应用程序窗口。这样,不管需要定位的元素的父窗口是可见的应用程序窗口或者是窗口不可见的情况,都可以获取到父窗口信息。这样,用户在使用系统的时候只要把父窗口信息提供给dll接口的开始搜索函数startsearchfrom,并把定位器提供的父窗口必要信息(类名class信息和标题title信息)作为参数提供给接口,然后调用findelement接口并把定位器提供的元素对象的4要素信息作为参数传入,这样,搜索将从距离需要定位元素对象最近并且包含该元素对象的窗口开始搜索,可以使搜索速度大大增加。另外,直接从父窗口开始搜索,准确率也得到了极大的提高,并且需要的信息也就自然少了很多,通过4要素(通常2-3个就行)已经基本足够唯一定位元素对象。

本实施中公开的一种桌面自动化测试开发系统可以和webdriver框架互补,并且定位元素对象接口名称和webdriver接口一致,在测试开发领域在pc端需要界面自动化测试的无非就是桌面端和web端。web端的webdriver框架支持各种开发语言接口都是统一的,而且已经形成了行业的事实标准,系统的桌面框架如果跟webdriver框架完全一致,用户只要知晓统一的接口便能在桌面端和web端的测试开发代码编写自如,并且各个开发语言调用的接口还都是统一的,这样使用相当方便,本实施例中,甚至更简单的输入接口,比如findelement接口、sendkeys接口,也和webdriver完全一致,各种语言使用起来都很傻瓜。

本实施中公开的一种桌面自动化测试开发系统的内核支持根据简单脚本生成exe文件,比autoit更加方便,更加强大,生成exe文件可以让没有任何编程经验的人只要在txt输入接口名称和参数即可,参数从自行开发的定位器中直接获得。比如,在txt中仅仅需输入:

sendkeys("你好吗?测试文档!!!123");

findelement("","文件(f)","","menuitem");

findelement("3","保存(s)ctrl+s","","menuitem");

参数都是通过定位器提供的信息,直接复制粘贴过来即可,根本不需要任何编程知识,内核是命令行运行的,只要传入-filename:{文件路径名},回车后自动生成exe文件,使用起来比autoit方便多了。

定位器本身的目的是让用户拖动鼠标或者按住快捷键即可定位到鼠标所在位置的元素对象的4个属性信息以及元素对象的父窗口必要信息。

参考图7和8,实现大致方法为:

在mfc对话框窗口的onmousemove(uintnflags,cpointpoint)方法(用于在鼠标移动过程中执行操作及获取即时鼠标位置)里,可以很容易得到当前鼠标位置的cpoint;通过调用iuiautomation接口的elementfrompoint方法根据当前鼠标位置的cpoint得到指向所述元素对象的iuiautomationelement指针,通过该指针可以得到元素对象的automationid、名称name、类名class、controltype信息,这里通过底层接口得到的controltype信息是long型(长整型)的数字,为了更方便用户使用,本实施例将数字转化为通俗易懂的type的英语解释。同时,定位器为了极大提高搜索效率还给用户提供了父窗口信息,首先利用iuiautomation接口指针,由该指针指向对象的方法get_controlviewwalker获取iuiautomationtreewalker指针,后续可以根据iuiautomationtreewalker接口的getparentelement方法和iuiautomation接口的compareelements方法从控件视图树形结构可以得到根节点下面最近的窗口即为该元素对象父窗口的iuiautomationelement指针,下一步通过iuiautomationelement接口的get_currentnativewindowhandle方法得到窗口句柄uia_hwnd,这个句柄可以直接转换为hwnd,这样就得到了父窗口的句柄,下面根据父窗口的句柄通过windowsapigetclassnamet函数和getwindowtex函数分别可以得到父窗口的类名class信息和标题title信息。

经过以上元素搜索算法优化,定位元素对象所需时间已经提高了3-8倍以上。利用搜素算法的优化,在直接父窗口下寻找,4要素重名率已经降到了最低可能,从而保证了定位器提供的的4要素可以精确的定位,并使跨语言的dll接口得以实现,本实施例中的解决方案的精髓在于利用算法的优化将定位元素的效率和精确性达到了极致并通过精确定位的算法,并实现了跨语言的解决方案,各种开发语言都会得到效率的提升。

实施例2

本实施例公开的一种桌面自动化测试开发系统包括:用c++语言开发的定位器,用于定位到元素对象获取元素对象的父窗口必要信息及元素对象的automationid、名称name、类名class、controltype信息;用c语言和c++语言开发的暴露c语言接口的动态链接库dll,用于根据所述定位器传入的参数搜索到的精确定位的元素对象的iuiautomationelement元素指针以获取元素对象的可点击的点的坐标并调用windowsapi模拟鼠标点击元素对象;及用c++语言开发的用于生成exe文件的内核,所述exe文件包含定位函数findelement和sendkeys函数,所述定位函数findelement和sendkeys函数放在所述exe文件中的预定数据块中的预定位置,所述定位函数findelement和sendkeys函数的已知数据块地址后面为要调用函数的标记,所述标记后面为统一char*类型的函数参数,所述函数参数后面为具体函数字符。

由于微软底层的api涉及太多元素对象,而且从桌面根节点搜索元素对象效率很低,本实施例摒弃众多没有价值的信息,仅仅根据4要素(实际上传入参数的一般只需要2-4个要素属性信息即可精确定位),从而大大提升定位效率。另外,由于本实施例中的技术方案不强制要求必须提供4个元素对象要素属性信息,4个元素对象要素属性信息中部分属性信息可能会传空值,如果按照api正常的逻辑是没法解决定位问题或者很困难实现定位,本实施例中对搜索的各种查询条件的接口进行了重新封装和设计,先给4个元素对象要素属性信息中有值的属性信息创建搜索条件接口,然后,不管是4个元素对象要素属性信息中哪些没有值,统一用自行封装的函数进行组合,创建条件搜索接口的意义在于按众多条件搜索元素,底层api可以提供搜索的条件太多了,但本实施例中技术方案仅需按照原创的搜索算法快速定位并顶多提供4要素的条件搜索接口,这样就完美的解决了问题。另外,在原始api中每个元素对象的action,就是人能对每个元素对象进行的操作是非常不一样的,每个元素对象还会支持一个或者多个不一样的操作,设计起来相当复杂,为了解决这个问题,这里代码可以获取这个元素对象的矩形区域,本实施例中公开的系统框架集成了底层鼠标操作,在区域内进行点击即可做到所有元素对象的一致性,当定位到该元素对象的时候,底层api可以获取这个元素所在的位置(一般是矩形区域),然后,只要在该区域内模拟一次鼠标单击即可获取可点击的坐标位置,也可以调用iuiautomationelement元素指针的getclickablepoint()来获取可点击的坐标位置。

本实施例中公开的一种桌面自动化测试开发系统编写暴露c语言接口的动态链接库dll,从而使各种编程语言都能调用,这一整套解决方案高效定位并完美支持了各种开发语言,为了支持各种开发语言c语言接口参数统一用char*类型的参数,底层的各种宽字符和bsr类型数据都在底层进行转换。为了支持各种开发语言,c语言接口参数类型char*更容易被各种语言所更好的兼容。本实施例中公开的技术方案定位元素对象的接口为:boolfindelement(char*pstrid,char*pstrname,char*pstrclassname,char*pstrcontroletype);在进行下一步操作前,可以判断如果定位函数findelement返回false则说明菜单并未打开,需要等待,这样自己可以有充分的验证和控制。

至于内核方面,内核生成的exe文件会包含定位函数findelement和sendkeys函数,把定位函数findelement和sendkeys函数放在exe文件中的预定数据块中的预定位置,执行函数的已知数据块地址后面为要调用函数的标记,比如f,为了完美支持各种开发语言,参数类型统一是char*类型,因此,标记后面为统一char*类型的函数参数,函数参数后面为具体函数字符。内核本身大小是已经知道的,所以执行的时候一旦大小比内核本身大,则说明需要到已知数据块地址后面去依次执行函数和参数。当然这些数据可以用各种加密方法去提前加密,可以进一步提高安全。

本实施例中公开的一种桌面自动化测试开发系统只需要元素对象的至多4个属性信息,通常2-3个属性信息便足以精确定位,4个属性信息分别为元素对象的automationid、名称name、类名class、controltype信息,为了降低易用性和门槛,controltype信息自行进行了封装,定位器暴露出来的都是易于人类理解的控件类型,而不是底层的一串数字,大大提高了效率和易用性。

定位器主要是基于windows底层提供的uiautomationapi为基础开发的,但这些windows底层api不能跨各种开发语言,所以至今没有一个像webdriver一样可以大量推广的跨各种开发语言的框架和解决方案标准。本实施例中定位器的设计理念是为自行开发的dll接口提供更多的高效信息并作为参数提供给接口。底层api提供的关于元素对象的属性信息太多太多了,以至于很难用统一的方式去解决问题。本技术方案在定位元素对象时大大优化了搜索算法,并且已全力将搜索的性能做到极致。关于一个元素对象的属性信息,元素对象的automationid、名称name、类名class、controltype信息4个信息是最关键的,但仅靠这个也是远远不够的,重要的是需要高效的搜索算法为支撑。底层api默认搜索元素对象是从根节点开始搜索而且是跨进程的,消耗比较大,从根节点搜索到当前节点很可能会经历成百上千的元素对象,每个元素的信息都需要比对校验,效率很低,而且很可能不准确,针对此问题,定位器还会提供需定位元素对象的直接父窗口必要信息(类名class信息和标题title信息)。

参考图3-5和6,在元素对象在主界面上定位和操作频繁情况下,本实施例公开的一种桌面自动化测试开发方法包括:定位器定位到元素对象获取元素对象的父窗口类名class信息和标题title信息及元素对象的automationid、名称name、类名class、controltype信息;定位器定位获取的父窗口类名class信息和标题title信息作为参数提供给动态链接库dll接口的开始搜索函数startsearchfrom;调用windowsapifindwindowex函数并传入父窗口类名class参数信息和标题title参数信息,从而获取当前元素对象父窗口句柄;通过iuiautomation接口指针的elementfromhandle方法得到从所述父窗口起始的iuiautomationelement元素指针;根据从所述父窗口起始的iuiautomationelement元素指针获取父窗口的起始搜索的iuiautomationelement元素对象a并作为起始搜索点;定义一个map结构对象,所述map结构由superitem结构体和iuiautomationelement元素对象形成,其中,所述superitem结构体是一个包含元素对象的automationid、名称name、类名class、controltype信息的结构体,所述superitem结构体需要重载操作符以使所述superitem结构体可比较;从获取到的起始搜索点元素对象a节点开始遍历父窗口下所有元素并建立索引,遍历到每个元素对象的automationid、名称name、类名class、controltype信息和每个元素对象的iuiautomationelement指针所指向的元素对象;利用map结构建立key-value映射建立索引函数startindexing,key是superitem结构体的结构,所述key包含元素对象的automationid、名称name、类名class、controltype信息,value即为元素对象的iuiautomationelement指针;调用findelement接口并把定位获取的元素对象的automationid、名称name、类名class、controltype信息作为参数传入;通过统一为char*类型的接口接收定位传来的参数并将所有char*类型的参数转化为底层com组件可识别的bstr类型的参数;根据定位获取的元素对象的automationid、名称name、类名class、controltype信息填充superitem结构体;根据填充完毕的superitem结构体利用建立的所述索引函数startindexing快速获取到精确定位的元素对象的iuiautomationelement元素指针;根据iuiautomationelement元素指针的getclickablepoint方法获取元素对象的可点击的点的坐标;及调用windowsapi模拟鼠标点击元素对象。

一个元素对象的属性很多,定位时如果只用一个的话,产生重复和歧义的概率会很大,比如,开始菜单的名称name是开始,桌面有个文件名也是开始,或者其他窗口有个元素对象的名称name也是这个名称。本实施例中的技术方案为了用最快的速度最高的效率去精确的搜素到指定的元素。正因为有了算法的支持,只要元素对象的至多4个属性信息已经足够快速并精确的定位到元素对象。

本实施例对于父窗口有两种情况需要说明并为了提升搜索速度做了创造性的优化。一种情况是:对于应用程序来说,就是可以打开一个主界面窗口的应用程序,比如,打开一个word文档、打开一个记事本、打开一个计算器等等,对于这种情况,父窗口就是应用程序主界面的窗口,定位器会自动获取父窗口信息。另一种情况是:比如,定位一个任务栏中firefox元素的图标,定位任务栏中的firefox图标的时候,定位器也会自动获取父窗口信息如图9所示。此时,父窗口的信息就是类名class信息为shell_traywnd,shell_traywnd是个外壳函数类,主要是用于管理状态栏及任务栏的,它还可以分为一些小的子类,如管理程序最小化后跑到任务栏里等。shell_traywnd的窗口并不是可见的应用程序窗口。这样,不管需要定位的元素的父窗口是可见的应用程序窗口或者是窗口不可见的情况,都可以获取到父窗口信息。这样,用户在使用系统的时候只要把父窗口信息提供给dll接口的开始搜索函数startsearchfrom,并把定位器提供的父窗口必要信息(类名class信息和标题title信息)作为参数提供给接口,然后调用findelement接口并把定位器提供的元素对象的4要素信息作为参数传入,这样,搜索将从距离需要定位元素对象最近并且包含该元素对象的窗口开始搜索,可以使搜索速度大大增加。另外,直接从父窗口开始搜索,准确率也得到了极大的提高,并且需要的信息也就自然少了很多,通过4要素(通常2-3个就行)已经基本足够唯一定位元素对象。

本实施中公开的一种桌面自动化测试开发系统可以和webdriver框架互补,并且接口和webdriver完全一致,在测试开发领域在pc端需要自动化的无非就是桌面端和web端。web端的webdriver框架支持各种开发语言接口都是统一的,而且已经形成了行业的事实标准,系统的桌面框架如果跟webdriver框架完全一致,用户只要知晓统一的接口便能在桌面端和web端的测试开发代码编写自如,并且各个开发语言调用的接口还都是统一的,这样使用相当方便,本实施例中,甚至更简单的接口比如findelement接口、sendkeys接口,提供的和webdriver完全一致,各种语言使用起来都很傻瓜。

本实施中公开的一种桌面自动化测试开发系统的内核支持根据简单脚本生成exe文件,比autoit更加方便,更加强大,生成exe文件可以让没有任何编程经验的人只要在txt输入接口名称和参数即可,参数从自行开发的定位器中直接获得。比如,在txt中仅仅需输入:

sendkeys("你好吗?测试文档!!!123");

findelement("","文件(f)","","menuitem");

findelement("3","保存(s)ctrl+s","","menuitem");

参数都是通过定位器提供的信息,直接复制粘贴过来即可,根本不需要任何编程知识,内核是命令行运行的,只要传入-filename:{文件路径名},回车后自动生成exe文件,使用起来比autoit方便多了。

一般在桌面自动化开发中,可能需要操作同一父窗口下的元素对象很频繁,中间还会涉及很多重复的操作,比如,记事本窗口中文件菜单需要频繁操作,或者这个窗口中的各种控件元素对象需要频繁的操作的话,本实施例中公开的解决方案提供了进一步的优化:

首先定义一个结构体:

然后,声明一个map结构的对象map<superitem,point>supermap;从当前元素对象父窗口开始遍历父窗口下所有元素对象然后建立索引,可以遍历到每一个元素对象的4要素信息和该元素对象的iuiautomationelement指针所指向的元素对象,利用map结构建立key-value映射,key是superitem的结构,它包含了元素对象的4个要素信息,value即为该元素对象的iuiautomationelement指针,这样用户在使用findelement(char*pstrautomationid,char*pstrname,char*pstrclassname,char*pstrcontroletype)接口时,根据定位器提供的4要素信息,可以通过快速填入结构体:

以最快的方式获取该元素对象的定位而不需重新查找,supermap[item]的值即为该元素对象的精确指针。

经过以上算法的优化和索引,大大缩小了查找范围,可以将原先每个元素对象需要几百毫秒的定位时间缩短到20-50毫秒,大大提升了定位速度和准确度,从而各种开发语言使用通用的接口可以快速准确的定位到每个元素对象,实质性解决了跨语言下的定位速度和准确度的问题,定位速度和准确度已经得到了极大的提升。

定位器本身的目的是让用户拖动鼠标或者按住快捷键即可定位到鼠标所在位置的元素对象的4个属性信息以及元素对象的父窗口必要信息。

参考图7和8,实现大致方法为:

在mfc对话框窗口的onmousemove(uintnflags,cpointpoint)方法(用于在鼠标移动过程中执行操作及获取即时鼠标位置)里,可以很容易得到当前鼠标位置的cpoint;通过调用iuiautomation接口的elementfrompoint方法根据当前鼠标位置的cpoint得到指向所述元素对象的iuiautomationelement指针,通过该指针可以得到元素对象的automationid、名称name、类名class、controltype信息,这里通过底层接口得到的controltype信息是long型(长整型)的数字,为了更方便用户使用,本实施例将数字转化为通俗易懂的type的英语解释。同时,定位器为了极大提高搜索效率还给用户提供了父窗口信息,首先利用iuiautomation接口指针,由该指针指向对象的方法get_controlviewwalker获取iuiautomationtreewalker指针,后续可以根据iuiautomationtreewalker接口的getparentelement方法和iuiautomation接口的compareelements方法从控件视图树形结构可以得到根节点下面最近的窗口即为该元素对象父窗口的iuiautomationelement指针,下一步通过iuiautomationelement接口的get_currentnativewindowhandle方法得到窗口句柄uia_hwnd,这个句柄可以直接转换为hwnd,这样就得到了父窗口的句柄,下面根据父窗口的句柄通过windowsapigetclassnamet函数和getwindowtex函数分别可以得到父窗口的类名class信息和标题title信息。

经过以上元素搜索算法优化,定位元素对象所需时间已经提高了3-8倍以上。利用搜素算法的优化,在直接父窗口下寻找,4要素重名率已经降到了最低可能,从而保证了定位器提供的的4要素可以精确的定位,并使跨语言的dll接口得以实现,本实施例中的解决方案的精髓在于利用算法的优化将定位元素的效率和精确性达到了极致并通过精确定位的算法,并实现了跨语言的解决方案,各种开发语言都会得到效率的提升。

虽然,上文中已经用一般性说明及具体实施例对本发明作了详尽的描述,但在本发明基础上,可以对之作一些修改或改进,这对本领域技术人员而言是显而易见的。因此,在不偏离本发明精神的基础上所做的这些修改或改进,均属于本发明要求保护的范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1