CN111694744B - 一种基于monkey源码的测试开发方法 - Google Patents
一种基于monkey源码的测试开发方法 Download PDFInfo
- Publication number
- CN111694744B CN111694744B CN202010529287.2A CN202010529287A CN111694744B CN 111694744 B CN111694744 B CN 111694744B CN 202010529287 A CN202010529287 A CN 202010529287A CN 111694744 B CN111694744 B CN 111694744B
- Authority
- CN
- China
- Prior art keywords
- interface
- server
- root node
- client
- calling
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3692—Test management for test results analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请公开了一种基于monkey源码的测试开发方法,利用monkey源码中的系统API或者隐藏API,来实现所需逻辑,获取根节点,封装自动化逻辑,完成自动化操作。具体为:以手机端作为服务器,在所述手机端,利用monkey源码中的系统API或者隐藏API,调用类和方法,构造实例,获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点,将所需逻辑封装为函数,当需要运行时,调用所述函数,得到所需的自动化操作结果。解决了Appium框架存在很多问题,测试开发效率更高,用最底层的方式查找和操作控件,并且可以在元素出现的第一时间进行操作,非常精准和高效。
Description
技术领域
本发明属于计算机软件应用领域,具体涉及一种基于monkey源码的测试开发方法。
背景技术
目前的测试开发框架各大公司基本大多采用国外的Appium框架,Appium框架可以时支持android操作系统的App自动化测试,Appium框架存在很多问题,比如:1.由于Appium为了减低门槛牺牲了执行效率采用webdriver restful协议,交互太频繁,执行速度较慢;2.Appium其实依赖于手机端的bootstrap.jar作为服务器端,这个server端其实是调用的UI automator(用户界面自动化);3.启动被测app的时候可能会弹出各种申请系统权限等Appium处理起来就很麻烦。4.对Android的toast组件无法操作;5.由于设计模式问题导致执行效率比直接使用原生框架要慢;6.Android端针对开发直接在Activity里加的webview控件无法操作;7.定位元素的方式比如id,name,classname,xpath等都只能在编译时确定的,一旦界面发生变化,编译时的定位方式不能定位立即导致定位失败;8.App界面变化会导致维护成本比较大。
针对以上技术问题,目前没有更优的解决方案。
发明内容
为解决现有技术中的不足,本发明提出一种基于monkey源码的测试开发方法,利用monkey源码中的系统API或者隐藏API,来实现所需逻辑,获取根节点,封装自动化逻辑,完成自动化操作。
所述利用monkey源码中的系统API或者隐藏API来实现所需逻辑,获取根节点,完成自动化操作,具体为:以手机端作为服务器,在所述手机端,利用monkey源码中的系统API或者隐藏API,调用类和方法,构造实例,获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点,将所需逻辑封装为函数,当需要运行时,调用所述函数,得到所需的自动化操作结果。
所述获取根节点的方法,过程如下:
实例化包名为android.app.UiAutomation下的类名为UiAutomation的实例,通过UIAutomation类的public UiAutomation(Looperlooper, IUiAutomationConnectionconnection)构造方法进行构造实例A;
调用所述实例A,调用connect方法;
调用所述实例A的getServiceInfo方法,并通过该方法返回值获得AccessibilityServiceInfo类型的变量记为info;
调用所述实例A的setServiceInfo方法并将info变量作为参数传入;
获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点。
所述获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点,具体为:实现OnAccessibilityEventListener接口的onAccessibilityEvent方法;调用所述实例A的setOnAccessibilityEventListener方法,并传入OnAccessibilityEventListener接口;调用实例A的getRootInActiveWindow()方法获取当前界面的根节点;
在onAccessibilityEvent方法中,监测到界面的任意变化,调用例A的getRootInActiveWindow()方法获取当前界面的根节点。
所述获取当前活动界面的根节点,不经过中间过程,直接获取当前活动界面的根节点。
所述获取根节点,完成自动化操作,包括:定位器以及执行器;
所述定位器,以monkey为底层获取根节点,所述定位器,实现流程如下:
客户端向服务器端的jar包服务器发送socket请求,获取当前服务器端界面的信息;
jar包服务器接收到客户端的socket请求后,将所述服务器端界面的信息发送给客户端;
客户端将传递过来的服务器端界面的信息显示出来;
用户根据个人需求,在客户端点击所述界面的信息中某个位置,并将此位置相对于客户端屏幕的坐标传递到服务器端的jar包服务器;
jar包服务器接收所述位置坐标,根据所述位置坐标,调取对应控件信息,并且将控件信息发送给客户端;
客户端接收所述控件信息,将控件信息中各种元素属性保存到中间文件或数据库中,画出所述位置坐标的具体位置,并在客户端界面上显示所述控件信息的各种元素属性。
所述执行器,以monkey为底层获取根节点,将所需逻辑封装为函数,当所需元素出现时,查找到所述元素,并进行相应操作。
所述执行器,执行根据直接push到手机里的记录action和控件属性的文件来读取并进行操作,或者执行器作为手机端的server 等待计算机端传过来的socket指令进行操作。
所述执行器,实现流程如下:
将所述控件信息中各种元素属性推送到服务器端的jar包服务器中,进行保存;
客户端运行查找元素API;
客户端使用查找元素功能,向服务器端的jar包服务器发送socket请求,请求调用元素某一个属性值;
服务器端的jar包服务器,从当前界面的信息查找是否存在所述元素的某一个属性值,并给出对应的查询结果;
服务器端的jar包服务器将查询结果发送到客户端。
所述界面的信息,包括界面截图或者视频流。
所述控件信息中各种元素属型,通过socket发送给服务器,或者作为文件或数据库提供给服务器端读取。
所述进行保存的操作,还应包括:在定位器定位元素的时候直接保存。
所述定位器,还能够具有录制功能,即将所述属性和操作进行保存;
所述执行器,还能够具有回放功能,即根据定位器保存下来的属性和操作进行控件的自动化操作。
所述jar包服务器,采用monkey源码编译出来的jar包作为用来测试的服务器代码的外壳框架,在外壳框架下编辑用来测试的服务器代码,能够访问隐藏的API,所以能够调用IPackageManager的getPackageInfo获取PackageInfo类型的变量pkgInfo,根据pkginfo变量的requestPermissions获取所需权限的字符串数组,利用 pkgInfo的grantRuntimePermission方法让app所需要的所有权限都自动允许,使得待测试app具有所有所需要请求的权限,jar包服务器能够响应客户端发送过来的监听界面的请求。
所述监听界面的请求,客户端向jar包服务器端发送socket请求,jar包服务器接收客户端发送的socket请求,在任何界面的变化下都能够获取当前界面的根节点,根据根节点能够遍历获取整个界面的信息,来封装查询和操作控件元素的逻辑。
所述监听界面的请求:为从客户端发送socket来发送请求,或者把这些操作actions保存在手机端的文件或者数据库中。
本申请所达到的有益效果:(根据我们合并后的稿,您可以在重新修改一下有益技术效果)
本发明提出的一种基于monkey源码的测试开发方法,测试开发效率更高。
现有的Appium框架,服务器端一旦查询不到含有对应元素的控件则立马失败,而本发明可以根据多元维度包中其他元素重新查找,并可以自动修正产生错误的元素。这样就可以一定程度解决界面不断变化导致之前的自动化代码失效的痛点。
现有的Appium框架中,启动被测app的时候可能会弹出各种申请系统权限等Appium处理起来就很麻烦,本发明采用monkey源码编译出来的jar包作为外壳框架,使得待测试app可以获取所需所有的动态请求的权限,避免了每次因处理权限问题导致的工作量。
本发明采用monkey源码编译出来的jar包作为其他服务器代码的外壳框架,在外壳框架下编辑测试用来测试的服务器代码,能够访问隐藏的API,使得jar包服务器能够响应客户端发送过来的监听界面的请求。无需在设置里面开启辅助服务,无需有另外的APP界面。并且不需要界面也可以发送socket,因为普通的实现辅助服务的app需要有界面而且需要运行在后台才能进行socket通信。
在jar包服务器,采用Tcp协议传输monkey源码编译出来的jar包,速度和效率会提高很多。
原有的Ui automator方式改为更底层的控件操作和监听,速度更快。而且可以轻松解决toast问题,执行速度会大大加快。
对于现有技术中,Appium框架对Android的toast组件无法操作问题,因为本发明可以实现监听界面的变化,进而检测到toast组件的界面变化,实现对toast组件的操作。
对于现有技术中,Appium框架对Android端针对开发直接在Activity里加的webview控件无法操作,本发明因可以检测到界面变化,进而检测到webview控件的界面变化,实现对webview控件的操作。
本专利方法也适用于微信小程序和支付宝小程序。
用几乎最底层的方式查找和操作控件,并且可以在元素出现的第一时间进行操作,非常精准和高效。
附图说明
图1本发明实施例的一种基于monkey源码的测试开发方法流程图;
图2本发明实施例的客户端的定位器流程;
图3本发明实施例的客户端的执行器查询流程;
图4本发明实施例的客户端的基于多元维度包的执行器查询流程。
实施方式
下面结合附图对本申请作进一步描述。以下实施例仅用于更加清楚地说明本发明的技术方案,而不能以此来限制本申请的保护范围。
一种基于monkey源码的测试开发方法,利用monkey源码中的系统API或者隐藏API,来实现所需逻辑,获取根节点,封装自动化逻辑,完成自动化操作。
所述利用monkey源码中的系统API或者隐藏API来实现所需逻辑,获取根节点,封装自动化逻辑,完成自动化操作,如图1所示,具体为:
步骤S1:以手机端作为服务器;
步骤S2:在所述手机端,利用monkey源码中的系统API或者隐藏API,调用类和方法,构造实例;
步骤S3:获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点;
步骤S4:将所需逻辑封装为函数;
步骤S5:当需要运行时,调用所述函数,得到所需的自动化操作结果。
所述获取根节点的方法,过程如下:
实例化包名为android.app.UiAutomation下的类名为UiAutomation的实例,通过UIAutomation类的public UiAutomation(Looperlooper, IUiAutomationConnectionconnection)构造方法进行构造实例A;
调用所述实例A,调用connect方法从而建立Accessbility service;
调用所述实例A的getServiceInfo方法,并通过该方法返回值获得AccessibilityServiceInfo类型的变量记为info;
调用所述实例A的setServiceInfo方法并将info变量作为参数传入;
获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点。
所述获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点,具体为:实现OnAccessibilityEventListener接口的onAccessibilityEvent方法;调用所述实例A的setOnAccessibilityEventListener方法,并传入OnAccessibilityEventListener的接口;调用实例A的getRootInActiveWindow()方法获取当前界面的根节点。
在onAccessibilityEvent方法中,监测到界面的任意变化,调用例A的getRootInActiveWindow()方法获取当前界面的根节点。
所述获取当前活动界面的根节点,不经过中间过程,直接获取当前活动界面的根节点。
所述获取根节点,完成自动化操作,包括:定位器以及执行器;
所述定位器,以monkey为底层获取根节点,获取当前界面信息后,将属性发送给界面;
所述执行器,以monkey为底层获取根节点,将所需逻辑封装为函数,当所需元素出现时,查找到所述元素,并进行相应操作。
所述执行器中,执行根据直接push到手机里的记录action和控件属性的文件来读取并进行操作,或者执行器作为手机端的server 等待计算机端传过来的socket指令进行操作。
获取根节点后,后续执行器做的主要是根据根节点查询指定属性的元素,或者遍历当前界面元素对指定的元素进行查找,并在查找后进行操作。
具体应用举例:
应用1:
利用实例A的getRootInActiveWindow()方法可以或者当前手机界面的AccessibilityNodeInfo类型的便利记为实例root。
类型的根节点,这样可以封装各种操作控件的方法,比如封装函数名为:
Clickbytext,并且参数为String 参数名为text,返回值为boolean的方法,其中text代表控件属性的text值:
调用实例root的findAccessibilityNodeInfosByText方法,并把text参数传入,可以从该方法返回值可以获得List<AccessibilityNodeInfo>。
类型的变量记为nodeList,这个nodeList中每个元素是AccessbilityNodeInfo类型的变量记为info,这样可以遍历nodeList。
当实例info的方法isVisibleToUser为true,并且getText方法返回值即为curText不为null的情况下,比较curText和text的值是否相等,如果相等,则返回值标记为true。
以上便是ClickBytext函数接口的大致过程。
进一步的可以优化为智能等待,下面举例说明,比如点击了text名为下一步的控件后,希望点击text名为登录的控件,如果直接调用clickbytext函数,可能text名为登录的控件还没出现,所以调用clickbytext函数后很可能返回值是false,所以自动化操作没法继续下一个操作。
这个时候可以继续封装一个方法为了方便说明记为clickbytext2,这个函数里面可以通过循环调用clickbytext函数,并且判断它的返回值是否为true,如果返回false则继续循环调用clickbytext函数直到返回为true为止。
进一步的,可能登录名为登录的控件因为界面改变等原因没有找到,可以加一个timeout,如果在一定时间内没有找到则抛出异常或者标记本次测试的结果为失败。
应用2:
这里只是举例并不限制本申请的适用场景,另一种可能的实现方法是:
同样已知实例A的getRootInActiveWindow()方法可以或者当前手机界面的AccessibilityNodeInfo类型的变量记为实例root,这个是当前界面的根节点,然后调用函数名为B并且参数类型为AccessibilityNodeInfo类型的参数记为info的方法。
将根节点root传入函数B,然后利用递归循环遍历子节点,直到info的getChildCount方法返回值为0并且info的isVisibleToUser方法的返回值为true的话这个时候再比较info的getText方法的返回值和需要查询点击的控件的text值是否匹配匹配则点击。
如果找不到,可以重新调用实例A的getRootInActiveWindow()获取当前界面最新的根节点,然后重复以上过程,类似的也可以加timeout。
以上都是阐述了发现第一个匹配的元素然后实现点击,也可以加入索引,明确指定是第几个索引的匹配的元素。因为可能存在多个元素都有同样的属性值。
应用3:
下面再举例说明如何实现进行控件输入:
实现方法和clickbytext类似,同样已知实例A的getRootInActiveWindow()方法可以或者当前手机界面的AccessibilityNodeInfo类型的变量记为实例root,这个是当前界面的根节点,然后调用函数名为B并且参数类型为AccessibilityNodeInfo类型的参数记为info的方法。
将根节点root传入函数B,然后利用递归循环遍历子节点,直到info的getChildCount方法返回值为0并且info的isVisibleToUser方法的返回值为true的话这个时候再比较info的getClassName。
方法的返回值和需要查询点击的控件的classname(对于编辑框,一般是android.widget.EditText,这里只是示范,并不约束本申请应用场景)。
判断是否匹配,匹配则可以对该AccessibilityNodeInfo类型的控件进行控件输入。
这里也有很多方法可以实现,这里只是举例说明实例化Bundle类型的变量记为args。
调用实例变量args的成员方法putCharSequence,传入参数"ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE"和需要输入的字符串变量记为content;
然后调用info的performAction。
方法并传入AccessibilityNodeInfo.ACTION_SET_TEXT和args即可实现输入字符串的瞬间输入。
注意该方法是进行控件输入的最佳方法,另外也可以通过其他非高效方法实现,也应作为本申请保护范围。
应用4:
其他基于本申请进行控件输入可能的方法为,调用info的performAction
方法并传入AccessibilityNodeInfo.ACTION_FOCUS,先获得输入焦点然后利用ClipboardManager将需要输入的字符串保存进剪贴板,随后再利用info的performAction方法并传入AccessibilityNodeInfo.ACTION_PASTE。
应用5:
类似的可以基于本申请可以实现基于id,xpath等方式的操作接口。
可以实现快速的执行安卓的几乎任何操作。
进一步的可以把这些对控件的操作action保存在文件或者数据库中,这里仅举例说明但不作为限制本申请应用范围的依据:
"actions": [
{
"text": "登录",
"action": "clickbytext"
},
{
"text": "我的",
"action": "clickbytext"
}
……
]
可以根据相应的action调用相应的操作api进行操作,比如 action为clickbytext,那么框架就会调用相应的之前本申请公开的方法封装的函数,text是传入的参数,text的值可以由定位器获取text的属性值,这样使用该框架的人员几乎不需要写代码都可以以几乎极快的速度运行安卓手机的各种操作。
客户端获取服务器端界面,并点击所述界面相应位置,进而来获取所述相应位置对应的控件信息的方法,具体包括:客户端的定位器流程与客户端的查询流程。
应用6:
另外可以基于本申请实现对于各种弹出框的拦截处理:
调用该实例的getServiceInfo方法,并通过该方法返回值获得AccessibilityServiceInfo类型的变量记为info。
调用实例A的setServiceInfo方法并将info变量作为参数传入。
下面就可以调用实例A的setOnAccessibilityEventListener(AccessibilityEvent event)方法来监听界面变化:
activityName = event.getClassName();
currentPackages = event.getPackageName().toString();
根据package的变化可以截获异常弹出的窗口或者界面,并基于此进行处理。所述客户端的定位器流程,如图2所示,如下:
步骤101:客户端通过按钮向服务器端的jar包(jar,JavaARchive,Java归档)服务器发送socket(异步选择模式的通信控件)请求,获取当前服务器端界面的截图;
步骤102:jar包服务器接收到客户端的socket请求后,将所述服务器端界面的信息发送给客户端;
步骤103:客户端将传递过来的服务器端界面的信息显示出来;
步骤104:用户根据个人需求,在客户端点击所述界面的信息中某个位置,并将此位置相对于客户端屏幕的坐标传递到服务器端的jar包服务器;
步骤105:jar包服务器接收所述位置坐标,根据所述位置坐标,调取对应控件信息,并将控件信息发送给客户端;
步骤106:客户端接收所述控件信息,将控件信息中各种元素属性保存到中间文件或数据库中,给所述元素定义为唯一指定的名字,画出所述位置坐标的具体位置,并在客户端界面上显示所述控件信息的各种元素属性。
另一种方案:客户端接收所述控件信息,将控件信息中各种元素属性保存到中间文件或数据库中,并将控件信息中各种元素属性的集合称为多元维度包,给多元维度包定义为唯一指定的名字,画出所述位置坐标的具体位置,本实施例采用矩形框框住控件的位置,并在客户端界面上显示所述控件信息的各种元素属性。
所述步骤101和步骤106中的所述socket请求为TCP协议下的socket请求。
Tcp是比http更低的协议,所以速度会快,本实施例是使用TCP来实现的,但是也可以使用http、websocket或UDP或其他协议来实现。
所述执行器,如图3所示,实现流程如下:
步骤301:将所述控件信息中各种元素属性推送到服务器端的jar包服务器中,进行保存;
步骤302:客户端运行查找元素API;
步骤303:客户端使用查找元素功能,向服务器端的jar包服务器发送socket请求,请求调用元素某一个属性值;
步骤304:服务器端的jar包服务器,从当前界面的信息查找是否存在所述元素的某一个属性值,并给出对应的查询结果;
步骤305:服务器端的jar包服务器将正确的查询结果发送到客户端。
若所述步骤106使用另一种方案,即包含多元维度包的方案执行,那么所述执行器查询流程,实现多维度查找控件,如图4所示,具体如下:
步骤201:将所述多元维度包推送到服务器端的jar包服务器中,进行保存;
步骤202:客户端运行多维度查找元素API;
步骤203:客户端使用查找元素功能,向服务器端的jar包服务器发送socket请求,请求调用查询元素,并将所述元素的多元维度包的唯一指定的名字发送给服务器端;
步骤204:服务器端的jar包服务器,根据多元维度包的唯一指定的名字,找到对应的多元维度包;
步骤205:服务器端的jar包服务器对所述找到的多元维度包进行解析;
步骤206:服务器端的jar包服务器,从当前界面的信息查找是否存在这样的控件,与解析后的多元维度包中的各个属性相匹配,并给出每个属性对应的查询结果;
步骤207:服务器端的jar包服务器将正确的查询结果发送到客户端。
所述控件信息中各种元素属型,通过socket发送给服务器,或者作为文件或数据库提供给服务器端读取。
所述jar包服务器预先指定整个界面所有元素的位置以及其对应控件,根据接收的所述位置坐标,计算出所述位置坐标对应的那个可见的控件上,并且选择最内层控件。
所述多元维度包包括控件所有属性和控件截图,具体包括但不限于:图片,id(编号),name(名称),classname(类名称),text(文本),xpath(路径),索引。
其中,id(编号),name(名称),classname(类名称),text(文本),xpath(路径),索引属于控件属性,图片属于控件截图。
所述步骤207,所述正确的查询结果描述如下:若根据多元维度包中每个属性进行查找时,每个属性的对应查找结果应为一致的结果,正确的查找结果意味着其对应的属性也时正确的,对比每个属性对应的查找结果,若出现某个属性的查找结果与其他属性的查找结果不一致的情况,则该错误查找结果能够根据其他正确的查找结果被自动修改为正确的属性,并将自动修改后的正确属性重新保存在对应的多元维度包中。
举例如下:比如findElemrntByText(“确定”), 服务器端收到请求会从当前界面去查询控件text为确定的控件,现有技术的ppium的设计为,一旦查询不到含有text的控件则立马失败,也就是说app控件的界面(位置或者控件属性)一旦发生了改变,则会导致大量失败,这里中间文件包含了查询控件的多个维度的信息(图片,classname,text,索引等),确定这个按钮文字变化了,还可以从其他定位方式来进行判断,如果只是部分属性改变还可以进行更正并保存到多元维度包中。
本发明由于多元维度包的使用,解决了App版本界面变化会导致维护成本比较大的问题。
所述多维度查找元素API,预先编写API接口函数,将客户端的定位器流程中多元维度包的唯一指定的名字传递给API,并且运用多元维度包对查找元素进行多维度查询,并给出正确的查询结果。
所述进行保存的操作,还应包括:在定位器定位元素的时候直接保存。
所述定位器,还能够具有录制功能,即将所述属性和操作进行保存;
所述执行器,还能够具有回放功能,即根据定位器保存下来的属性和操作进行控件的自动化操作。
所述jar包服务器,采用monkey源码编译出来的jar包作为用来测试的服务器代码的外壳框架,在外壳框架下编辑用来测试的服务器代码,能够访问隐藏的API,所以能够调用IPackageManager的getPackageInfo获取PackageInfo类型的变量packageInfo,根据pkginfo变量的requestPermissions获取所需权限的字符串数组,利用 pkgInfo的grantRuntimePermission方法让待测试的app所需要的所有权限都自动允许,使得待测试app具有所有所需要请求的权限,jar包服务器能够响应客户端发送过来的监听界面的请求。
所述监听界面的请求,客户端向jar包服务器端发送socket请求,jar包服务器接收客户端发送的socket请求,在任何界面的变化下都能够获取当前界面的根节点,根据根节点能够遍历获取整个界面的信息,来封装查询和操作控件元素的逻辑。
所述监听界面的请求:为从客户端发送socket来发送请求,或者把这些操作actions保存在手机端的文件或者数据库中。
现有的Appium框架中,启动被测app的时候可能会弹出各种申请系统权限等Appium处理起来就很麻烦,例如我们手机安装App后会弹出,让您授权照相机权限、通讯录权限的界面,本发明采用monkey源码编译出来的jar包作为外壳框架,使得用来测试的服务代码自动获取最高的权限,避免了每次因处理权限问题导致的工作量。
所述jar包服务器,采用Tcp协议传输monkey源码编译出来的jar包;
这一步用tcp协议代替http协议,速度和效率会提高很多。
所述jar包服务器,采用隐藏API实现方式从客户端发过来的监听界面请求,并对查询的元素进行查询操作。
所述jar包服务器,采用monkey源码编译出来的jar包作为其他服务器代码的外壳框架,在外壳框架下编辑测试用来测试的服务器代码,能够访问隐藏的API,使得jar包服务器能够响应客户端发送过来的监听界面的请求。无需在设置里面开启辅助服务,无需有另外的APP界面,结合已经编写好的逻辑,使得待测试app获取所需权限的所有权限,避免了每次因处理权限问题导致的工作量。
如果在普通app里面实现accessbilityservce服务的话,不仅仅是需要设置里有这个辅助服务,而且要通过socket通信的话就必须还得有个app界面,每次必须启动界面这个socket才会起作用,否则在普通的accessbility service中是无法直接使用socket通信的;
若不通过隐藏API或者系统API,只通过实现的Accessbility service本身,则socket无法在内部允许,普通app若能让accessbility service里面监测的数据发送出去,还得需要有个界面放在后台运行。
本发明因采用monkey源码编译出来的jar包作为用来测试的服务器代码的外壳框架,在外壳框架下编辑用来测试的服务器代码,能够访问隐藏的API,所以能够调用IPackageManager的getPackageInfo获取PackageInfo类型的变量packageInfo,根据pkginfo变量的requestPermissions获取所需权限的字符串数组,利用 pkgInfo的grantRuntimePermission方法让app所需要的所有权限都自动允许,使得jar包服务器能够响应客户端发送过来的监听界面的请求,并自动使得jar包服务器带有最高的权限。
安卓隐藏API或者系统API是一种通用的概念,具体的实现方法如步骤1~步骤5:
步骤1:实例化包名为android.app.UiAutomation下的类名为UiAutomation的实例,通过UIAutomation类的public UiAutomation(Looper looper,IUiAutomationConnection connection)构造方法进行构造实例A。
步骤2:调用通过该实例A,调用connect方法从而建立Accessbility service。
步骤3:调用该实例的getServiceInfo方法,并通过该方法返回值获得AccessibilityServiceInfo类型的变量记为info。
步骤4:调用实例A的setServiceInfo方法并将info变量作为参数传入。
步骤5:下面就可以调用实例A的setOnAccessibilityEventListener方法来监听界面变化。
辅助服务,这个是安卓手机一般都有的功能,设置里面是辅助功能,如果直接通过实现accessbility service(可访问性服务)来实现也是可以的,必须独立开发一个app实现辅助服务功能,并且需要再设置里或者命令行去开启辅助功能,本发明避免了这个显示过程,缩短了因开启辅助功能而造成的测试开发时间的浪费。
如果在普通APP里面实现accessbilityservce服务的话,不仅仅是需要设置里有这个辅助服务,而且要通过socket通信的话就必须还得有个APP界面,每次必须启动界面这个socket才会起作用,否则在普通的accessbility service中是无法直接使用socket通信的。
允许待测试app所需要的所有权限请求:调用IPackageManager的getPackageInfo获取PackageInfo类型的变量packageInfo,然后调用PackageInfo的requestPermissions方法获取需要申请的String类型的权限数组,利用 pkgInfo的grantRuntimePermission方法让待测试的app所需要的所有权限都自动允许,使得待测试app具有所有所需要请求的权限。
这一步把原有的Ui automator方式改为更底层的数据操作和监听,速度更快。而且可以轻松解决toast问题,执行速度会大大加快。
toast组件提供一个浮动的简单的小显示块,并且不影响任何其他操作,仅仅用于提示信息,并且会在超时后自动消失。
采用运行时定位的方式可以解决 app界面频繁变化导致原始编译时确定定位方式出现大量错误导致大量维护成本的问题,速度都是极为精准,而且还能自动修复定位属性。
所述监听界面的请求,客户端向jar包服务器端发送socket请求,jar包服务器接收客户端发送的socket请求,在任何界面的变化下都能够获取当前界面的根节点,根据根节点能够遍历获取整个界面的信息,来监听界面变化。
所述监听界面的请求,客户端向jar包服务器端发送socket请求,具体为:在OnAccessibilityEventListener(可访问性事件监听器)接口中实现onAccessibilityEvent(AccessibilityEvent event)(有关可访问性事件的回调函数)这个方法,在任何界面的变化都会调用这个方法,这个方法里去调用,通过查询UIAutomation实例的getRootInActiveWindow方法来获取当前界面AccessibilityNodeInfo,即类型的根节点,根节点是界面的根节点,这样可以遍历界面中所有子元素以及元素信息,即通过构造UiAutomation实例,通过setOnAccessibilityEventListener来实现onAccessibilityEvent来监听界面的变化;
对于现有技术中,Appium框架对Android的toast组件无法操作问题,因为本发明可以实现监听界面的变化,进而检测到toast组件的界面变化,实现对toast组件的操作。
本发明实施例可以获取界面根节点,遍历当前界面元素的text属性,然后去等待监听toast中所显示文字信息有没有出现,也可以基于本申请封装一个函数来达到这个目的,例如:通过onAccessibilityEvent(AccessibilityEvent event) 中通过getEventType()获取int 类型的eventType,它为AccessibilityEvent.TYPE_WINDOWS_CHANGED的时候说明界面发生变化遍历当前元素的text有没有toast信息中的文字,具体实施时很多方法都可以实现此功能。
对于现有技术中,Appium框架对Android端针对开发直接在Activity里加的webview控件无法操作,本发明因可以检测到界面变化,进而检测到webview控件的界面变化,实现对webview控件的操作;
在具体实施例中,AccessibilityServiceInfo类型的变量记为info, info有个int类型名称为flag的变量,将它设为CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY,即可让AccessbilityService,能够监测webView控件,也可以在accessbilityService对应的xml里面设置,都是一样的作用。
所述元素信息包括:所有元素的id(编号), name(名称),text(文本),图片,classname(类名称),xpath(路径)。
所述jar包服务器始终保存当前界面节点信息的列表(List)
同时jar包服务器会有一个Tcp的socket server(socket 服务器)随时间接受来自客户端的socket请求,并且做出响应,例如:客户端调用API,FindElementByText就会向服务器端的jar包服务器发送查询text为指定值的元素,当服务器端通过查询UIAutomation实例的getRootInActiveWindow方法来获取当前界面AccessibilityNodeInfo,即类型的根节点,根节点是界面的根节点,根据根节点,即能够遍历获取整个界面的信息,并查询当前界面有没有该元素并进行响应。
socket用于在两个基于TCP/IP协议的应用程序之间相互通信。最早出现在UNIX系统中,是UNIX系统主要的信息传递方式。
本发明申请人结合说明书附图对本发明的实施示例做了详细的说明与描述,但是本领域技术人员应该理解,以上实施示例仅为本发明的优选实施方案,详尽的说明只是为了帮助读者更好地理解本发明精神,而并非对本发明保护范围的限制,相反,任何基于本发明的发明精神所作的任何改进或修饰都应当落在本发明的保护范围之内。
Claims (8)
1.一种基于monkey源码的测试开发方法,其特征在于,
利用monkey源码中的系统API或者隐藏API,来实现所需逻辑,获取根节点,封装自动化逻辑,完成自动化操作;其中,所述利用monkey源码中的系统API或者隐藏API来实现所需逻辑,获取根节点,封装自动化逻辑,完成自动化操作,具体为:以手机端作为服务器,在所述手机端,利用monkey源码中的系统API或者隐藏API,调用类和方法,构造实例,获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点,将所需逻辑封装为函数,当需要运行时,调用所述函数,得到所需的自动化操作结果;
所述获取根节点的方法,过程如下:
实例化包名为android.app.UiAutomation下的类名为UiAutomation的实例,通过UIAutomation类的public UiAutomation(Looperlooper, IUiAutomationConnectionconnection)构造方法进行构造实例A;
调用所述实例A,调用connect方法;
调用所述实例A的getServiceInfo方法,并通过该方法返回值获得AccessibilityServiceInfo类型的变量记为info;
调用所述实例A的setServiceInfo方法并将info变量作为参数传入;
获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点;
所述获取根节点,完成自动化操作,包括:定位器以及执行器;
所述定位器,以monkey为底层获取根节点,所述定位器,实现流程如下:
客户端向服务器端的jar包服务器发送socket请求,获取当前服务器端界面的信息;
jar包服务器接收到客户端的socket请求后,将所述服务器端界面的信息发送给客户端;
客户端将传递过来的服务器端界面的信息显示出来;
用户根据个人需求,在客户端点击所述界面的信息中某个位置,并将此位置相对于客户端屏幕的坐标传递到服务器端的jar包服务器;
jar包服务器接收所述位置坐标,根据所述位置坐标,调取对应控件信息,并且将控件信息发送给客户端;
客户端接收所述控件信息,将控件信息中各种元素属性保存到中间文件或数据库中,画出所述位置坐标的具体位置,并在客户端界面上显示所述控件信息的各种元素属性;
所述执行器,以monkey为底层获取根节点,将所需逻辑封装为函数,当所需元素出现时,查找到所述元素,并进行相应操作;
所述执行器,实现流程如下:
将所述控件信息中各种元素属性推送到服务器端的jar包服务器中,进行保存;
客户端运行查找元素API;
客户端使用查找元素功能,向服务器端的jar包服务器发送socket请求,请求调用元素某一个属性值;
服务器端的jar包服务器,从当前界面的信息查找是否存在所述元素的某一个属性值,并给出对应的查询结果;
服务器端的jar包服务器将正确的查询结果发送到客户端;
所述jar包服务器,采用monkey源码编译出来的jar包作为用来测试的服务器代码的外壳框架,在外壳框架下编辑用来测试的服务器代码,能够访问隐藏的API,所以能够调用IPackageManager的getPackageInfo获取PackageInfo类型的变量pkgInfo,根据pkginfo变量的requestPermissions获取所需权限的字符串数组,利用 pkgInfo的grantRuntimePermission方法让待测试的app所需要的所有权限都自动允许,使得待测试app具有所有所需要请求的权限,jar包服务器能够响应客户端发送过来的监听界面的请求;
所述监听界面的请求,客户端向jar包服务器端发送socket请求,jar包服务器接收客户端发送的socket请求,在任何界面的变化下都能够获取当前界面的根节点,根据根节点能够遍历获取整个界面的信息,来封装查询和操作控件元素的逻辑。
2.根据权利要求1所述的基于monkey源码的测试开发方法,其特征在于:
所述获取当前活动界面的根节点,或者调用所述实例用来监听界面变化,获取界面变化下的根节点,具体为:实现setOnAccessibilityEventListener接口的onAccessibilityEvent方法;调用所述实例A的setOnAccessibilityEventListener方法,并传入OnAccessibilityEventListener的接口;调用实例A的getRootInActiveWindow()方法获取当前界面的根节点;
在onAccessibilityEvent方法中,监测到界面的任意变化,调用例A的getRootInActiveWindow()方法获取当前界面的根节点。
3.根据权利要求1所述的基于monkey源码的测试开发方法,其特征在于:
所述获取当前活动界面的根节点,不经过中间过程,直接获取当前活动界面的根节点。
4.根据权利要求3所述的基于monkey源码的测试开发方法,其特征在于:
所述执行器,执行根据直接push到手机里的记录action和控件属性的文件来读取并进行操作,或者执行器作为手机端的server 等待计算机端传过来的socket指令进行操作。
5.根据权利要求4所述的基于monkey源码的测试开发方法,其特征在于:
所述界面的信息,包括界面截图或者视频流。
6.根据权利要求5所述的基于monkey源码的测试开发方法,其特征在于:
所述控件信息中各种元素属型,通过socket发送给服务器,或者作为文件或数据库提供给服务器端读取。
7.根据权利要求6所述的基于monkey源码的测试开发方法,其特征在于:
所述进行保存的操作,还应包括:在定位器定位元素的时候直接保存。
8.根据权利要求7所述的基于monkey源码的测试开发方法,其特征在于:
所述定位器,还能够具有录制功能,即将所述属性和操作进行保存;
所述执行器,还能够具有回放功能,即根据定位器保存下来的属性和操作进行控件的自动化操作。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010529287.2A CN111694744B (zh) | 2020-06-11 | 2020-06-11 | 一种基于monkey源码的测试开发方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010529287.2A CN111694744B (zh) | 2020-06-11 | 2020-06-11 | 一种基于monkey源码的测试开发方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111694744A CN111694744A (zh) | 2020-09-22 |
CN111694744B true CN111694744B (zh) | 2023-03-21 |
Family
ID=72480352
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010529287.2A Active CN111694744B (zh) | 2020-06-11 | 2020-06-11 | 一种基于monkey源码的测试开发方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111694744B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113641574B (zh) * | 2021-08-03 | 2024-04-19 | 安然 | 一种安卓自动化的方法与系统 |
CN113791786B (zh) * | 2021-09-23 | 2024-01-19 | 安然 | 基于ios系统的app页面控件自动化方法及装置 |
Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104484273A (zh) * | 2014-12-19 | 2015-04-01 | 广州博冠信息科技有限公司 | 应用程序的测试方法、设备及系统 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105512023B (zh) * | 2014-09-26 | 2019-02-19 | 腾讯科技(深圳)有限公司 | 一种Monkey测试方法及装置 |
CN104331373A (zh) * | 2014-11-28 | 2015-02-04 | 上海斐讯数据通信技术有限公司 | 一种Monkey测试系统及方法 |
CN104461900B (zh) * | 2014-12-19 | 2018-08-10 | 北京奇虎科技有限公司 | 用户界面的测试方法、中控服务器、测试终端及系统 |
US20180203869A1 (en) * | 2017-01-18 | 2018-07-19 | Microsoft Technology Licensing, Llc | Application Programming Interface |
-
2020
- 2020-06-11 CN CN202010529287.2A patent/CN111694744B/zh active Active
Patent Citations (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104484273A (zh) * | 2014-12-19 | 2015-04-01 | 广州博冠信息科技有限公司 | 应用程序的测试方法、设备及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN111694744A (zh) | 2020-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109344065B (zh) | 远程调试方法、调试服务器及目标机 | |
US7779085B2 (en) | Automatic mobile device configuration | |
JP6092249B2 (ja) | 埋込まれたプロセス通信のための仮想チャネル | |
US9323647B2 (en) | Request-based activation of debugging and tracing | |
US7546298B2 (en) | Software, devices and methods facilitating execution of server-side applications at mobile devices | |
KR101986481B1 (ko) | 엔드-투-엔드 엔드 유저 성능 자동 모니터링 방법 및 이러한 방법을 수행하는 장치 | |
US7904421B2 (en) | Transparent virtual machine for mobile applications | |
US7920852B2 (en) | Compression of data transmitted between server and mobile device | |
US20080127054A1 (en) | Connecting with an application instance | |
CN111694744B (zh) | 一种基于monkey源码的测试开发方法 | |
US20080127053A1 (en) | Controlling application features | |
KR20150038757A (ko) | 데이터 저장 시스템과의 통신 | |
CN110083342B (zh) | 一种程序生成方法、装置以及计算机可读存储介质 | |
CN107193674B (zh) | 在线推送消息的处理方法及装置 | |
US20230205503A1 (en) | Method for dynamically integrating application programs, and software system and machine using the same | |
CN112445994A (zh) | 一种在打开的Chrome浏览器中进行自动化操作的方法 | |
US20090132908A1 (en) | Apparatus, program and method for accepting a request from a client computer via a network and executing a web application | |
WO2023246486A1 (zh) | 一种创建连接器的方法及装置 | |
CN112988175A (zh) | 跨平台应用安装包的生成方法、装置、介质及电子设备 | |
KR101418390B1 (ko) | 원격 응용 프로그래밍 디버깅시스템 및 그 제어방법 | |
US20230185867A1 (en) | Conversion of user interface events | |
CN113064987A (zh) | 数据处理方法、装置、电子设备、介质和程序产品 | |
CN110262912B (zh) | 一种过程调用gRPC的调用方法及装置 | |
CN114466401B (zh) | 图像传输方法和电子设备 | |
CN117155991B (zh) | 基于配置的gRPC-gateway代理网关生成方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |