monkeyrunner之坐标或控件ID获取方法(六)
Monkeyrunner的环境已经搭建完成,现在对Monkeyrunner做一个简介。
Monkeyrunner工具提供了一套API让用户/测试人员来调用,调用这些api可以控制一个Android设备或模拟器,而不需要了解对应的源码。
有了Monkeyrunner,我们可以编写python脚本来控制apk包的安装和卸载、启动app、向app发送各种动作事件、截取图片并保存。
除此之外,MonkeyRunner是Google提供的一个基于坐标点的Android黑盒自动化测试工具。所以,要使用Monkeyrunner进行自动化测试,首先,要了解Monkeyrunner中获取坐标点的方式。
|
方式 |
工具 |
说明 |
|
控件坐标 |
MonkeyRecorder坐标获取、其他工具获取 |
脚本中需要对不同分辨率兼容,坐标要动态转换 |
|
控件ID |
HierarchyViewer解析控件ID |
对环境有要求,需要开发机、模拟器,市面商用机需要破解才能使用,一般有风险,速度慢;对不同分辨率通用 |
|
控件ID |
MonkeyDevice |
只能进行简单的常用动作 |
本文中,我们主要介绍两种获取坐标点的方式。一种是通过MonkeyRecorder获取坐标;另一种是通过HierarchyViewer工具获取控件ID。
一、控件坐标获取
1.Pointer location获取坐标
先说一个比较简单的获取坐标的方式,是通过模拟器中的设置-开发者选项,找到“指针位置”的选项,勾选上。如下图所示。

勾选后,模拟器的最顶部则显示坐标,比如点击模拟器上的任一应用,最顶部显示X、Y的值即该应用的坐标;同理,如果想要获取任一应用中的任一位置的坐标,也可用此方法。

2. MonkeyRecorder获取坐标
下面就MonkeyRecorder获取坐标的方式,进行演示。MonkeyRecorder是一个比较好用的获取坐标的工具,它是用来获取真机或模拟器上坐标的工具,当我们点击真机或模拟器上的空间时,就能显示真机或模拟器上的点击点的坐标。
(1)MonkeyRecorder的启动
首先安卓手机连接上电脑,并保证以下两个条件成立:
a.终端USB调成开发者模式
b.电脑安装手机驱动
手机连接成功后,打开cmd窗口,输入adb devices查看已连接真机或模拟器设备的名称,我们这里仍以模拟器为代表。
之后,在cmd窗口,输入monkeyrunner后,启动Monkeyrunner。做以下操作:导入MonkeyRecorder包、连接模拟器设备、以MonkeyRecorder方式启动模拟器,并依次输入
如下命令:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder device=MonkeyRunner.waitForConnection() recorder.start(device)
到此,MonkeyRecorder正式启动。截图如下。

(2)MonkeyRecorder的使用
我们这里只是使用MonkeyRecorder来记录坐标,获取坐标的方式很简单。比如qq的登录界面,点击“登录”按钮,右侧就会显示该按钮的坐标;同样,点击账号输入框或密码输入框,右侧同样会显示坐标。这个坐标就是我们需要获得的坐标。

同时,MonkeyRecorder中的界面是同模拟器页面保持一致的,在MonkeyRecorder中触发任一操作,模拟器上会有相应的触发。如果两者没有保持一致,则点击MonkeyRecorder右上角的Refresh Display即可刷新页面。

3.控件坐标之Monkeyrunner脚本演示
我们将下面一段Monkeyrunner脚本写到一个test.py文件中,然后运行test.py文件,查看模拟器或真机上是不是做相应的操作。
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
device=MonkeyRunner.waitForConnection()
#启动activity(这里启动qq)
device.startActivity(component="com.tencent.mobileqq/.activity.SplashActivity")
#登录界面,点击账号输入框
device.touch(60,300,'DOWN_AND_UP')
#输入qq账号
device.type('3469191693')
二、控件ID获取
通过控件ID实现自动化脚本的运行,就性能而言,会比控件坐标的实现差一些;但是对于不同分辨率的设备都通用,不需要动态变换坐标。控件ID的获取主要是通过HierarchyViewer。下面就HierarchyViewer从打开方式和使用两方面进行讲解。
1.HierarchyViewer的打开方式
HierarchyViewer的打开方式有两种:一种是eclipse中打开HierarchyView视图,另外一种是命令行中执行sdk/tools/hierarchyviewer.bat。
HierarchyViewer默认只能在非加密设备使用,例如工程机,工程平板或者模拟器。如果要在手机上使用HierarchyViewer,你需要在你的应用中添加一个开源库View Server。链接地址:https://github.com/romainguy/ViewServer。该篇文章中有讲解如何启动真机View Server,大家如果有兴趣,可参考:https://dup2.org/node/1538。
方式一:连接您的真机设备,或打开模拟器,在eclipse中, 依次选择Window-Open Perspective-Other,在Other中,选择HierarchyView视图,即可打开。


方式二:连接您的真机设备或打开模拟器,运行cmd窗口,进入到sdk/tools目录下,输入命令hierarchyviewer.bat,运行hierarchyviewer。

或者直接在sdk/tools目录下,找到hierarchyviewer.bat,双击运行。

下面讲解利用HierarchyViewer获取控件ID的方法。
2.HierarchyViewer获取控件ID
HierarchyViewer启动后,首先会看到的第一个窗口显示了设备和模拟器的列表。点击左边的箭头,就会展开当前设备或模拟器的Activity对象列表。列表中显示了设备或模拟器上,UI当前可视的所有Activity对象。这些对象按照它们的Android组件名称列出来。列表中的内容包含应用的Activity对象和系统的Activity对象。
当模拟器activity画面变更后,点击refresh可以加载新的页面布局信息。

从列表中选择你的activity名称,双击,或点击菜单栏的Load View Hierarchy按钮,进入View Hierarchy窗口,查看它的view层次结构;或者点击Inspect Screenshot按钮,进入Pixel Perfect窗口,从而查看UI的一个放大图像。我们这里点击进入View Hierarchy窗口。
可以从下图中看到模拟器此activity的画面布局信息,左边部分是hierarchy通过树形结构展示的布局形式,右下角是模拟器上当前页面的UI布局信息。

通过滚动鼠标,可以放大每个树节点;拖拽鼠标,移动树形结构布局。双击树节点可以展示单独的UI部分。从下图中,可以看到,id/btn_login即为登录按钮的ID。依次类推,可以查看其它控件ID。
注:对于列表、或者弹出框则无法直接通过点击ID操作成功,需要计算ID的坐标。

3.控件ID之Monkeyrunner脚本演示
同样的,我们将下面一段Monkeyrunner脚本写到一个test.py文件中,然后运行test.py文件,查看模拟器上是不是做相应的操作。
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice #提供了根据ID进行访问
from com.android.monkeyrunner.easy import By #根据ID返回PyObject的方法
device=MonkeyRunner.waitForConnection()
#启动activity(这里启动qq)
device.startActivity(component="com.tencent.mobileqq/.activity.SplashActivity")
easy_device=EasyMonkeyDevice(device) #必须在activity启动之后
#登录界面,点击账号输入框
easy_device.touch(By.id('id/0x20e'),MonkeyDevice.DOWN_AND_UP)
device.type('3469191693') #输入qq账号
test.py
到这里,获取控件坐标和控件ID的两种方式已经介绍完,由于没有深入研究,肯定有不少功能点没有介绍到,有时间的话再做完善。
但是执行时发现,未按上图显示???
查看命令窗口显示如下错误:
The standalone version of hieararchyviewer is deprecated.
Please use Android Device Monitor (tools/monitor.bat) instead.
05:06:09 E/hierarchyviewer: Unable to get view server version from device 127.0.0.1:62001
05:06:09 E/hierarchyviewer: Unable to get view server protocol version from device 127.0.0.1:62001
05:06:09 E/ViewServerDevice: Unable to debug device: samsung-nexus-127.0.0.1:62001
05:06:09 E/hierarchyviewer: Missing forwarded port for 127.0.0.1:62001
05:06:09 E/hierarchyviewer: Unable to get the focused window from device 127.0.0.1:62001
05:06:26 E/hierarchyviewer: Missing forwarded port for 127.0.0.1:62001
05:06:26 E/hierarchyviewer: Unable to load window data for window <Focused Window> on device 127.0.0.1:62001
05:06:26 E/hierarchyviewer: null
如何解决呢?
于是,找到指定的monitor.bat,启动后,点击:
获取到了我想要的id内容,至此问题解决了,希望对大家有所帮助。
真机的话,如何获取呢?
使用ViewServer让Android真机可用HierarchyView视图检测工具
HierarchyViewer是Android SDK自带的用于布局检测的工具,其位置在\Android SDK目录\tools目录下,关于使用HierarchyView优化Android布局的方法,可以参考官方的这篇文章:http://developer.android.com/training/improving-layouts/optimizing-layout.html
但是该工具并不支持直接连接真机进行检测,连接真机时会报如下错误:
01:47:20 E/hierarchyviewer: Unable to get view server version from device e8ef8e7e
01:47:20 E/hierarchyviewer: Unable to get view server protocol version from device e8ef8e7e
01:47:20 E/ViewServerDevice: Unable to debug device: xiaomi-hm_note_1lte-e8ef8e7e
01:47:20 E/hierarchyviewer: Missing forwarded port for e8ef8e7e
01:47:20 E/hierarchyviewer: Unable to get the focused window from device e8ef8e7e
为了能够让该工具能够对真机使用,Android SDK开发团队提供了VIewServer开源库,项目地址https://github.com/romainguy/ViewServer
将该库引入项目,同时参考其中的ViewServerActivity即可,主要代码如下:
1 package com.android.debug.hv.sample; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.widget.TextView; 8 9 import com.android.debug.hv.ViewServer; 10 11 public class ViewServerActivity extends Activity { 12 private int mCounter; 13 14 @Override 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 19 if (getIntent().getExtras() != null) mCounter = getIntent().getExtras().getInt("counter"); 20 ((TextView) findViewById(R.id.label)).setText("Activity #" + (mCounter + 1)); 21 22 ViewServer.get(this).addWindow(this); 23 } 24 25 public void nextActivity(View v) { 26 Intent intent = new Intent(this, getClass()); 27 intent.putExtra("counter", mCounter + 1); 28 startActivity(intent); 29 } 30 31 @Override 32 public void onDestroy() { 33 super.onDestroy(); 34 ViewServer.get(this).removeWindow(this); 35 } 36 37 @Override 38 public void onResume() { 39 super.onResume(); 40 ViewServer.get(this).setFocusedWindow(this); 41 } 42 }
只要在Activity的onCreate、onDestroy、onResume三个生命周期方法中调用ViewServer的对应方法即可在真机环境下使用HierarchyView工具
--------------------- 本文来自 菠萝菠萝派 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/wanglu198506/article/details/43106133?utm_source=copy

浙公网安备 33010602011771号