海鸥一飞 发表于 2018-5-30 15:51:55

ADB+UiAutomator实现智能精准化测试

引入UiAutomator智能化获取元素

Uiautomator对自动化测试同学来说并不陌生;使用UIAutomatorViewer可以清晰的找到所选元素的属性列表:
(这里暂且叫它XML树)


是不是很吃惊?右边FrameLayout红框中居然显示了“WLAN”这行元素的所有属性;index|class|package等;
那这意味着什么?

说明,我们可以利用这个先决的便利条件,把元素获取出来,再传给Uiautomator去执行回放;

换句话说:我们可以利用Uiautomator去执行回放,便可大大提升回放时的精准性;

再换句话说:将红框中的部分看成一个对象,一个Node,一个树的节点,只要把这个对象交给Uiautomator,
它就可以在手机的界面上画个框框,是不是也就能再对象上进行操作了?!(怎样把对象交给Uiautomator
我们放到最后讲,这里不是重点)

重点是如何将手指点击位置和上文中的这个“对象”联系起来

这里就不得不提到大家耳熟能详的ADB了,废话少说,直接上代码:

adb shell getevent

输出格式 --> 设备名: 事件type 事件code 事件value


这里的0035和0036分别表示屏幕上的X坐标和Y坐标,后面的值表示具体的坐标点,通过16进制转换可以
得到值1142和1527,随便找个手机的屏幕分辨率为800*480的,很明显两个点是完全不匹配,那如何转换呢?


在cmd中输入adb shell getevent -p


找到您的屏幕设备中0035和0036的含义,我的手机中可以看到x的值min为0,max为1172,y的值min为0,
max为1900。

这样就找到您的设备的坐标具体大小值,这里计算公式如下:

x=(x-xmin)*480/(xmax-xmin) ;

y=(y-ymin)*800/(ymax-ymin);

得到触碰点坐标后,千万别高兴太早,核心点在最后这一步:需将坐标点带入到上面的XML树中去反查该
坐标属于哪个树节点。(具体的算法就不在这里做介绍了,实现方式有很多种,具体以性能最优为佳;如
实在没有头绪可以私聊)

将查到的对象构造出来交给Uiautomator实现精准执行


总结:

以上方法智能化的监控了人在手机界面的一系列操作,实现了操作时的跟随录制,并以元素操作的方式实
现了精准性回放;对自动化测试本身来说实现了往智能化方向的转变,并留下可以参数化构建用例,持续
集成式回放的可能,扩展性较强。


页: [1]
查看完整版本: ADB+UiAutomator实现智能精准化测试