51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1801|回复: 2
打印 上一主题 下一主题

[Appium] 在 Appium 中快速单击控件的变通方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-27 14:26:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么需要快速点击控件
在我要测试的APP中,有一个名曰“秘密花园”的玩意儿,里面可以切换 正式、灰度、测试 环境;因为不想让用户随便就可以点进去切环境,开发同学在正常界面的某个位置放了一个控件(由于是保密的,所以这个位置点我就不公布了 ),必须快速单击这个控件5次,才能进入(咒语很简单 )仅供测试时候使用;所以在自动化测试的时候,必须实现这个快速单击5次的动作。



踩坑
既然是连续单击5次,常规方法就是循环 里面套上5次 click;尝试之后不成功,于是打印一下click 时间,吓了一跳;
具体代码和输出结果如下:
  1. WebElement secret = driver.findElementByXPath("//android.view.View[contains(@resource-id,'id/touch')]");
  2. for(int i = 1; i <= 5; i++) {
  3.     long start = System.currentTimeMillis();
  4.     secret.click();
  5.     long end = System.currentTimeMillis();

  6.     long duration = end - start;
  7.     System.out.println("页面View对象单击: 第 " + i + " 次, 耗时: " + duration + "毫秒 !");
  8. }
复制代码
输出结果如下:
页面View对象单击: 第 1 次, 耗时: 3636毫秒 !
页面View对象单击: 第 2 次, 耗时: 3160毫秒 !
页面View对象单击: 第 3 次, 耗时: 3157毫秒 !
页面View对象单击: 第 4 次, 耗时: 3159毫秒 !
页面View对象单击: 第 5 次, 耗时: 3146毫秒 !
可见虽然是连续5次的单击,但是每次单击的耗时要3秒以上,其实已经不能算是5次快速单击了,只是5次有充足间隔的单击;
分析
很明显 对象.click() 格式的单击调用一次会比较耗时,而秘密花园的进入条件是5次连续单击,研发代码控制的单击间隔时间在300毫秒以下才被认为是连续;
变通
如果用 对象.click() 调用有时间太长的问题,就必须换一种单击方法,屏幕坐标点单击 driver.tap() ;
思路:
  • 获取单击对象左上角x轴坐标;
  • 获取单击对象左上角y轴坐标;
  • 单击对象左上角往右 往下 挪10个像素的点位 (x+10, y+10) 基本可以肯定这个点一定会落在对象有效范围内;
  • 循环坐标点单击5次;
  • 记录每次单击后的耗时;
看代码:
  1. WebElement secret = driver.findElementByXPath("//android.view.View[contains(@resource-id,'id/touch')]");
  2. int x = secret.getLocation().getX(); //获取对象左上角的x点坐标
  3. int y = secret.getLocation().getY(); //获取对象左上角的y点坐标

  4. for(int i = 1; i <= 5; i++) {
  5.     long start = System.currentTimeMillis();
  6.     driver.tap(1, x+10, y+10, 0);
  7.     long end = System.currentTimeMillis();

  8.     long duration = end - start;
  9.     System.out.println("屏幕点直接单击: 第 " + i + " 次, 耗时: " + duration + "毫秒 !");
  10. }
复制代码
看输出结果:
屏幕点直接单击: 第 1 次, 耗时: 73毫秒 !
屏幕点直接单击: 第 2 次, 耗时: 39毫秒 !
屏幕点直接单击: 第 3 次, 耗时: 37毫秒 !
屏幕点直接单击: 第 4 次, 耗时: 40毫秒 !
屏幕点直接单击: 第 5 次, 耗时: 42毫秒 !
总结
可以看出用driver.tap() 调用的每次单击耗时明显减少,如果需要有快速单击控件的需求可以用这种方法做变通。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 2017-6-27 15:08:52 | 只看该作者
这是因为对象的click方法,其实是先去递归搜索这个控件,然后再点击,肯定没有直接点击坐标快。
回复 支持 反对

使用道具 举报

该用户从未签到

3#
 楼主| 发表于 2017-6-27 15:10:07 | 只看该作者
对,代码遍历的东西少了自然就快很多
回复 支持 反对

使用道具 举报

本版积分规则

关闭

站长推荐上一条 /1 下一条

小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

GMT+8, 2024-11-27 03:01 , Processed in 0.062958 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2024 Comsenz Inc.

快速回复 返回顶部 返回列表