发明内容
本发明的主要目的在于提供一种自定义控件获取方法和装置,以解决现有技术中无法获取到自定义控件的精确位置的问题。
为了实现上述目的,根据本发明实施例的一个方面,提供了一种自定义控件获取方法,用于用户界面自动化测试。根据本发明的自定义控件获取方法包括:获取目标控件的查询条件,其中,所述目标控件为待获取的自定义控件,所述查询条件为用于查询所述目标控件的条件;获取所述目标控件所在的父窗口;通过遍历所述父窗口的子控件来查询满足所述查询条件的控件,将满足所述查询条件的控件作为所述目标控件;在查询到所述目标控件之后,获取所述目标控件的位置属性,其中,所述位置属性为用于表示所述目标控件位置的属性;以及通过所述目标控件的位置属性获取所述目标控件的位置信息。
进一步地,通过遍历所述父窗口的子控件来查询满足所述查询条件的控件包括:判断所述父窗口的子控件中是否存在容器型控件,所述容器型控件内包含有多个控件;以及如果判断出所述父窗口的子控件中存在所述容器型控件,则通过遍历所述父窗口的子控件和所述容器型控件中的多个控件来查询满足所述查询条件的控件。
进一步地,所述查询条件包括以下至少之一:所述目标控件的名称、所述目标控件的控件类型和所述目标控件的Text属性,通过遍历所述父窗口的子控件来查询满足所述查询条件的控件包括:调用所述父窗口的子控件的名称、控件类型和Text属性;将所述目标控件的名称、所述目标控件的控件类型和所述目标控件的Text属性分别与调用的所述父窗口的子控件的名称、控件类型和Text属性进行比对;以及如果所述父窗口的子控件的名称与所述目标控件的名称一致和/或所述父窗口的子控件的控件类型与所述目标控件的控件类型一致和/或所述父窗口的子控件的Text属性与所述目标控件的Text属性一致,则确定所述父窗口的子控件为所述目标控件。
进一步地,通过所述目标控件的位置属性获取所述目标控件的位置信息包括:使用所述目标控件定义的类调用所述目标控件内部的接口;以及通过调用的所述目标控件内部的接口获取所述目标控件的位置信息。
进一步地,在获取目标控件的查询条件之前,所述自定义控件获取方法还包括:获取所述目标控件的动态链接库,其中,所述动态链接库为记录有所述目标控件的位置信息的文件;将所述动态链接库引用到所述用户界面自动化测试工程,其中,通过所述目标控件的位置属性获取所述目标控件的位置信息包括:通过所述目标控件的位置属性从引用的所述动态链接库中获取所述目标控件的位置信息。
为了实现上述目的,根据本发明实施例的另一方面,提供了一种自定义控件获取装置,用于用户界面自动化测试。根据本发明的自定义控件获取装置包括:第一获取单元,用于获取目标控件的查询条件,其中,所述目标控件为待获取的自定义控件,所述查询条件为用于查询所述目标控件的条件;第二获取单元,用于获取所述目标控件所在的父窗口;查询单元,用于通过遍历所述父窗口的子控件来查询满足所述查询条件的控件,将满足所述查询条件的控件作为所述目标控件;第三获取单元,用于在查询到所述目标控件之后,获取所述目标控件的位置属性,其中,所述位置属性为用于表示所述目标控件位置的属性;以及第四获取单元,用于通过所述目标控件的位置属性获取所述目标控件的位置信息。
进一步地,所述查询单元包括:判断模块,用于判断所述父窗口的子控件中是否存在容器型控件,所述容器型控件内包含有多个控件;以及查询模块,用于如果判断出所述父窗口的子控件中存在所述容器型控件,则通过遍历所述父窗口的子控件和所述容器型控件中的多个控件来查询满足所述查询条件的控件。
进一步地,所述查询条件包括以下至少之一:所述目标控件的名称、所述目标控件的控件类型、所述目标控件的Text属性,所述查询单元包括:第一调用模块,用于调用所述父窗口的子控件的名称、控件类型和Text属性;比对模块,用于将所述目标控件的名称、所述目标控件的控件类型和所述目标控件的Text属性分别与调用的所述父窗口的子控件的名称、控件类型和Text属性进行比对;以及确定模块,用于如果所述父窗口的子控件的名称与所述目标控件的名称一致和/或所述父窗口的子控件的控件类型与所述目标控件的控件类型一致和/或所述父窗口的子控件的Text属性与所述目标控件的Text属性一致,则确定所述父窗口的子控件为所述目标控件。
进一步地,所述第四获取单元包括:第二调用模块,用于使用所述目标控件定义的类调用所述目标控件内部的接口;以及获取模块,用于通过调用的所述目标控件内部的接口获取所述目标控件的位置信息。
进一步地,所述自定义控件获取装置还包括:第五获取单元,用于在获取目标控件的查询条件之前,获取所述目标控件的动态链接库,其中,所述动态链接库为记录有所述目标控件的位置信息的文件;引用单元,用于将所述动态链接库引用到所述用户界面自动化测试工程,其中,所述第四获取单元还用于通过所述目标控件的位置属性从引用的所述动态链接库中获取所述目标控件的位置信息。
根据本发明实施例,先获取目标控件的查询条件,通过遍历父窗口的子控件来查询满足查询条件的控件,将满足查询条件的控件作为目标控件,在查询到目标控件之后,获取目标控件的位置属性,最后通过目标控件的位置属性获取目标控件的位置信息,这样,通过遍历父窗口的子控件来查找目标控件,然后利用目标控件的位置属性来获取目标控件的位置信息,以得到目标控件的精确位置,解决了现有技术中无法获取到自定义控件的精确位置的问题,达到了获取到自定义控件的精确位置的效果。
具体实施方式
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
本发明实施例提供了一种自定义控件获取方法。该自定义控件获取方法可以通过计算机设备实现,用于用户界面自动化测试。
图2是根据本发明实施例的自定义控件获取方法的流程图。如图2所示,该自定义控件获取方法包括步骤如下:
步骤S102,获取目标控件的查询条件。其中,目标控件为待获取的自定义控件,查询条件为用于查询目标控件的条件。
查询条件可以是例如目标控件的名称、控件类型、Test属性等,该条件可以是在自动化测试过程中,通过测试人员输入的或者选择的用于获取目标控件的条件。
步骤S104,获取目标控件所在的父窗口。
父窗口可以是一个窗体form,在该父窗口下可以包含有一个或者多个控件,这些控件可以是系统预设的控件,也可以是自定义控件。
步骤S106,通过遍历父窗口的子控件来查询满足查询条件的控件,将满足查询条件的控件作为目标控件。
在系统窗口中,所有控件都有一定的组织顺序,容器型控件含有很多子控件。父窗口作为容器型控件。在获取到目标控件所在的父窗口之后,通过遍历父窗口下的子控件来查询满足查询条件的控件,即目标控件。具体地,对父窗口中子控件检测一下是否符合想要找的查询条件,从而找出满足查询条件的自定义控件,以便于精确找到自定义控件的位置。如果父窗口的子控件中存在容器型控件,则在对父窗口的子控件遍历完后,在遍历其中的容器型控件内的子控件。
例如,对于windows系统的自定义控件,可以在获取到父窗口之后,通过Control.Controls接口来对父窗口中子控件进行遍历,找出满足查询条件的自定义控件。因为所有控件都继承与Control类型,因此都有Controls属性,如果父窗口的子控件中还存在着容器控件,则仍然可以利用Controls属性逐层在容器控件中进行遍历,直到找到目标自定义控件。其中,Control是一个类型,是C#中所有Windows控件的基类。Controls是属性,是当前Congrol类型实例的所有子控件的集合。由于自定义控件的基类是Control类型,因此能够调用Control类型的所有属性或函数。
步骤S108,在查询到目标控件之后,获取目标控件的位置属性。其中,位置属性为用于表示目标控件位置的属性。
步骤S110,通过目标控件的位置属性获取目标控件的位置信息。
在查询到目标控件之后,则可以获取目标控件的位置属性,该位置属性记载有目标控件的精确位置,利用该位置属性可以获取目标控件的位置信息,从而获取到目标控件的精确位置。
根据本发明实施例,先获取目标控件的查询条件,通过遍历父窗口的子控件来查询满足查询条件的控件,将满足查询条件的控件作为目标控件,在查询到目标控件之后,获取目标控件的位置属性,最后通过目标控件的位置属性获取目标控件的位置信息,这样,通过遍历父窗口的子控件来查找目标控件,然后利用目标控件的位置属性来获取目标控件的位置信息,以得到目标控件的精确位置,解决了现有技术中无法获取到自定义控件的精确位置的问题,达到了获取到自定义控件的精确位置的效果。
优选地,通过遍历父窗口的子控件来查询满足查询条件的控件包括:判断父窗口的子控件中是否存在容器型控件,容器型控件内包含有多个控件;如果判断出父窗口的子控件中存在容器型控件,则通过遍历父窗口的子控件和容器型控件中的多个控件来查询满足查询条件的控件。
由于父窗口的子控件中可能存在容器型控件,本发明实施例中,通过检测判断父窗口中是否存在容器型控件,如果存在容器型控件,则可以对父窗口中的子窗口和子窗口中的容器型窗口进行遍历,从而查找出满足查询条件的自定义控件,保证遍历查找的全面性,从而提高查找目标控件的精确性。
优选地,查询条件包括以下至少之一:目标控件的名称、目标控件的控件类型和目标控件的Text属性,通过遍历父窗口的子控件来查询满足查询条件的控件包括:调用父窗口的子控件的名称、控件类型和Text属性;将目标控件的名称、目标控件的控件类型和目标控件的Text属性分别与调用的父窗口的子控件的名称、控件类型和Text属性进行比对;以及如果父窗口的子控件的名称与目标控件的名称一致和/或父窗口的子控件的控件类型与目标控件的控件类型一致和/或父窗口的子控件的Text属性与目标控件的Text属性一致,则确定父窗口的子控件为目标控件。
本发明实施例中,以目标控件的名称、目标控件的控件类型和目标控件的Text属性作为查询条件,通过利用上述属性来对父窗口的子控件进行匹配查找,如果各属性中有一个属性一致,则认为查询到的控件为目标控件。
以Control类型的父窗口为例,由于自定义控件的基类是Control类型,因此能够调用Control类型的所有属性或函数,即,父窗口的子控件名称(Name属性)、控件类型(GetType()函数)和Text属性都是Control类型可以直接调用。
例如,要查找的自定义控件的名称(Name)为m_customControl;类型(GetType())为CustomClass;Text属性为“xyz”。那么我们在遍历父窗口的所有子控件时,只需要如下条件就能确定当前遍历到的子控件是否就是我们需要找的控件。
根据本发明实施例,利用目标控件的属性来匹配查询目标控件,从而可以提高查询的准确性。
优选地,通过目标控件的位置属性获取目标控件的位置信息包括:使用目标控件定义的类调用目标控件内部的接口;以及通过调用的目标控件内部的接口获取目标控件的位置信息。
自定义控件定义的类是开发人员根据研发项目实际需要确定的,其内部的属性和成员也都是根据不同需求提供的。上述中Control类型是基类,Controls接口是基类中提供的某一属性。自定义控件及其接口则可以提供更确切详细的类型及接口信息。这样,在查找到目标控件之后,可以使用目标控件定义的类调用自定义控件内部的接口,获取到目标控件的位置信息。
优选地,在获取目标控件的查询条件之前,自定义控件获取方法包括:获取目标控件的动态链接库,其中,动态链接库为记录有目标控件的位置信息的文件;将动态链接库引用到用户界面自动化测试工程,其中,通过目标控件的位置属性获取目标控件的位置信息包括:通过目标控件的位置属性从引用的动态链接库中获取目标控件的位置信息。
自定义控件所在动态链接库是开发人员在进行窗体程序开发时生成的dll文件。该文件包含什么样的自定义控件,包含哪些自定义控件是根据项目需要来确定的。因此测试人员在使用时只需要和开发人员确认测试的自定义控件是属于哪个dll动态链接库,再引用到测试工程中来就可以直接使用了。
由于有些自定义控件内部构件较为复杂,如图3所示的控件,该控件是一个经过开发人员封装的控件,如果我们不引用他具体类型的动态链接库,而通过基类Control仅能访问到它的Location属性(左上角坐标位置)和Bounds属性(上下左右范围)。而不能具体获取到里面X后紧跟的输入控件框的精确位置。如果引用了该控件所在的动态链接库,开发人员在开发该控件的时候肯定会提供X后紧跟的输入控件的精确位置,因此就能够解决精确定位控件内部构件的需求。
本发明实施例还提供了一种自定义控件获取装置。该装置可以通过计算机设备实现其功能。需要说明的是,本发明实施例的自定义控件获取装置可以用于执行本发明实施例所提供的自定义控件获取方法,本发明实施例的自定义控件获取方法也可以通过本发明实施例所提供的自定义控件获取装置来执行。本发明实施例的自定义控件获取装置可以用于用户界面自动化测试。
图4是根据本发明实施例的自定义控件获取装置的示意图。如图4所示,自定义控件获取装置包括:第一获取单元10、第二获取单元20、查询单元30、第三获取单元40和第四获取单元50。
第一获取单元10用于获取目标控件的查询条件,其中,目标控件为待获取的自定义控件,查询条件为用于查询目标控件的条件。
查询条件可以是例如目标控件的名称、控件类型、Test属性等,该条件可以是在自动化测试过程中,通过测试人员输入的或者选择的用于获取目标控件的条件。
第二获取单元20用于获取目标控件所在的父窗口。
父窗口可以是一个窗体form,在该父窗口下可以包含有一个或者多个控件,这些控件可以是系统预设的控件,也可以是自定义控件。
查询单元30用于通过遍历父窗口的子控件来查询满足查询条件的控件,将满足查询条件的控件作为目标控件。
在系统窗口中,所有控件都有一定的组织顺序,容器型控件含有很多子控件。父窗口作为容器型控件。在获取到目标控件所在的父窗口之后,通过遍历父窗口下的子控件来查询满足查询条件的控件,即目标控件。具体地,对父窗口中子控件检测一下是否符合想要找的查询条件,从而找出满足查询条件的自定义控件,以便于精确找到自定义控件的位置。如果父窗口的子控件中存在容器型控件,则在对父窗口的子控件遍历完后,在遍历其中的容器型控件内的子控件。
例如,对于windows系统的自定义控件,可以在获取到父窗口之后,通过Control.Controls接口来对父窗口中子控件进行遍历,找出满足查询条件的自定义控件。因为所有控件都继承与Control类型,因此都有Controls属性,如果父窗口的子控件中还存在着容器控件,则仍然可以利用Controls属性逐层在容器控件中进行遍历,直到找到目标自定义控件。其中,Control是一个类型,是C#中所有Windows控件的基类。Controls是属性,是当前Congrol类型实例的所有子控件的集合。由于自定义控件的基类是Control类型,因此能够调用Control类型的所有属性或函数。
第三获取单元40用于在查询到目标控件之后,获取目标控件的位置属性,其中,位置属性为用于表示目标控件位置的属性。
第四获取单元50用于通过目标控件的位置属性获取目标控件的位置信息。
在查询到目标控件之后,则可以获取目标控件的位置属性,该位置属性记载有目标控件的精确位置,利用该位置属性可以获取目标控件的位置信息,从而获取到目标控件的精确位置。
根据本发明实施例,先获取目标控件的查询条件,通过遍历父窗口的子控件来查询满足查询条件的控件,将满足查询条件的控件作为目标控件,在查询到目标控件之后,获取目标控件的位置属性,最后通过目标控件的位置属性获取目标控件的位置信息,这样,通过遍历父窗口的子控件来查找目标控件,然后利用目标控件的位置属性来获取目标控件的位置信息,以得到目标控件的精确位置,解决了现有技术中无法获取到自定义控件的精确位置的问题,达到了获取到自定义控件的精确位置的效果。
优选地,查询单元包括:判断模块,用于判断父窗口的子控件中是否存在容器型控件,容器型控件内包含有多个控件;以及查询模块,用于如果判断出父窗口的子控件中存在容器型控件,则通过遍历父窗口的子控件和容器型控件中的多个控件来查询满足查询条件的控件。
由于父窗口的子控件中可能存在容器型控件,本发明实施例中,通过检测判断父窗口中是否存在容器型控件,如果存在容器型控件,则可以对父窗口中的子窗口和子窗口中的容器型窗口进行遍历,从而查找出满足查询条件的自定义控件,保证遍历查找的全面性,从而提高查找目标控件的精确性。
优选地,查询条件包括以下至少之一:目标控件的名称、目标控件的控件类型、目标控件的Text属性,查询单元包括:第一调用模块,用于调用父窗口的子控件的名称、控件类型和Text属性;比对模块,用于将目标控件的名称、目标控件的控件类型和目标控件的Text属性分别与调用的父窗口的子控件的名称、控件类型和Text属性进行比对;以及确定模块,用于如果父窗口的子控件的名称与目标控件的名称一致和/或父窗口的子控件的控件类型与目标控件的控件类型一致和/或父窗口的子控件的Text属性与目标控件的Text属性一致,则确定父窗口的子控件为目标控件。
本发明实施例中,以目标控件的名称、目标控件的控件类型和目标控件的Text属性作为查询条件,通过利用上述属性来对父窗口的子控件进行匹配查找,如果各属性中有一个属性一致,则认为查询到的控件为目标控件。
根据本发明实施例,利用目标控件的属性来匹配查询目标控件,从而可以提高查询的准确性。
优选地,第四获取单元包括:第二调用模块,用于使用目标控件定义的类调用目标控件内部的接口;以及获取模块,用于通过调用的目标控件内部的接口获取目标控件的位置信息。
自定义控件定义的类是开发人员根据研发项目实际需要确定的,其内部的属性和成员也都是根据不同需求提供的。上述中Control类型是基类,Controls接口是基类中提供的某一属性。自定义控件及其接口则可以提供更确切详细的类型及接口信息。这样,在查找到目标控件之后,可以使用目标控件定义的类调用自定义控件内部的接口,获取到目标控件的位置信息。
优选地,自定义控件获取装置还包括:第五获取单元,用于在获取目标控件的查询条件之前,获取目标控件的动态链接库,其中,动态链接库为记录有目标控件的位置信息的文件;引用单元,用于将动态链接库引用到用户界面自动化测试工程,其中,第四获取单元还用于通过目标控件的位置属性从引用的动态链接库中获取目标控件的位置信息。
自定义控件所在动态链接库是开发人员在进行窗体程序开发时生成的dll文件。该文件包含什么样的自定义控件,包含哪些自定义控件是根据项目需要来确定的。因此测试人员在使用时只需要和开发人员确认测试的自定义控件是属于哪个dll动态链接库,再引用到测试工程中来就可以直接使用了。
由于有些自定义控件内部构件较为复杂,如图3所示的控件,该控件是一个经过开发人员封装的控件,如果我们不引用他具体类型的动态链接库,而通过基类Control仅能访问到它的Location属性(左上角坐标位置)和Bounds属性(上下左右范围)。而不能具体获取到里面X后紧跟的输入控件框的精确位置。如果引用了该控件所在的动态链接库,开发人员在开发该控件的时候肯定会提供X后紧跟的输入控件的精确位置,因此就能够解决精确定位控件内部构件的需求。
需要说明的是,对于前述的各方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
在本申请所提供的几个实施例中,应该理解到,所揭露的装置,可通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可为个人计算机、移动终端、服务器或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、移动硬盘、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。