android自动化测试中实现长按并拖动

   android应用自动化过程中,会遇见需要长按并拖动的场景,例如类似UC浏览器中,长按某个导航中的图标,使其处于可移动状态,然后再将其移动到另一个地方,与其它导航图标换个位置,在robotium中有个drag(float fromX, float toX, float fromY, float toY,int stepCount)方法,但由于drag没有长按这个步骤,因此不能使应用处于可移动的状态,是没法完成这样的常见而简单的操作的。

  drag方法源码实现如下:

  public void drag(float fromX, float toX, float fromY, float toY,

  int stepCount) {

  long downTime = SystemClock.uptimeMillis();

  long eventTime = SystemClock.uptimeMillis();

  float y = fromY;

  float x = fromX;

  float yStep = (toY - fromY) / stepCount;

  float xStep = (toX - fromX) / stepCount;

  MotionEvent event = MotionEvent.obtain(downTime, eventTime,MotionEvent.ACTION_DOWN, fromX, fromY, 0);

  try {

  inst.sendPointerSync(event);

  } catch (SecurityException ignored) {}

  for (int i = 0; i < stepCount; ++i) {

  y += yStep;

  x += xStep;

  eventTime = SystemClock.uptimeMillis();

  event = MotionEvent.obtain(downTime, eventTime,MotionEvent.ACTION_MOVE, x, y, 0);

  try {

  inst.sendPointerSync(event);

  } catch (SecurityException ignored) {}

  }

  eventTime = SystemClock.uptimeMillis();

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP,toX, toY, 0);

  try {

  inst.sendPointerSync(event);

  } catch (SecurityException ignored) {}

  }

  可以看出其实是通过MotionEvent的ACTION_DOWN模拟屏幕按下操作,ACTION_MOVE模拟手势在屏幕上滑动,ACTION_UP模拟手势离开屏幕,从而完成整个拖动过程,而且其实robotium中的各种点击类方法也都是通过模拟不同的手势完成的。

  因此要想完成长按并拖动的操作,只要在ACTION_DOWN之后,停留一段时间即可模拟长按操作。

  /**

  * 实现将一个视图拖动到另一个视图所在的位置,用于实现快讯栏目、手机报的排序

  * @param viewFrom 起始View

  * @param viewTo 终点View

  * @throws Exception

  */

  public void clickLongAndDrag(View viewFrom,View viewTo) throws Exception {

  //获得视图View中手机屏幕上的绝对x、y坐标

  final int[] location = new int[2];

  final int[] location2 = new int[2];

  viewFrom.getLocationOnScreen(location);

  viewTo.getLocationOnScreen(location2);

  float xStart=location[0];

  float yStart=location[1];

  float xStop=location2[0];

  float yStop=location2[1];

  Log.i(TAG, "xStart:"+String.valueOf(xStart));

  Log.i(TAG, "yStart:"+String.valueOf(yStart));

  Log.i(TAG, "xStop:"+String.valueOf(xStop));

  Log.i(TAG, "yStop:"+String.valueOf(yStop));

  long downTime = SystemClock.uptimeMillis();

  long eventTime = SystemClock.uptimeMillis();

  try{

  MotionEvent event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_DOWN, xStart+10f, yStart+10f, 0);

  inst.sendPointerSync(event);

  //event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, xStart+10f+1.0f, yStart+10f+1.0f, 0);

  //inst.sendPointerSync(event);

  //Thread.sleep(1000);

  //延迟一秒,模拟长按操作

  eventTime = SystemClock.uptimeMillis() + 1000;

  //xStop加了10点坐标,获得的View坐标需根据应用实际情况稍做一点调整

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, xStop+10f, yStop+50f, 0);

  inst.sendPointerSync(event);

  eventTime = SystemClock.uptimeMillis() + 1000;

  //又再小小移动了一次,不这么做的话可以无法激活被测应用状态,导致View移动后又回复到原来位置

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_MOVE, xStop+10f, yStop+10f, 0);

  inst.sendPointerSync(event);

  eventTime = SystemClock.uptimeMillis() + 1000;

  event = MotionEvent.obtain(downTime, eventTime, MotionEvent.ACTION_UP, xStop+10f, yStop+10f, 0);

  inst.sendPointerSync(event);

  }catch (Exception ignored) {

  // Handle exceptions if necessary

  }

  }

时间: 2025-01-21 07:11:35

android自动化测试中实现长按并拖动的相关文章

android webview中图片 长按点击保存本地 部分手机不能实现。

问题描述 android webview中图片 长按点击保存本地 部分手机不能实现. 代码如下 private String imgurl = """"; /*** * 功能:长按图片保存到手机 */@Overridepublic void onCreateContextMenu(ContextMenu menu View v ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu v menuInfo)

item长按监听-Android ActionBar中Action按钮怎么设置长按监听?

问题描述 Android ActionBar中Action按钮怎么设置长按监听? 如题. 或者是滑动监听,只要是和单机区分开就好,不知哪位大神以前做过这个? 解决方案 如果有按下/抬起事件,而不是只有Click事件,就可以考虑自己实现长按的功能. 否则,就只能放弃:或者,自定义按键来实现类似的功能. 解决方案二: 如果有按下/抬起事件,而不是只有Click事件,就可以考虑自己实现长按的功能. 否则,就只能放弃:或者,自定义按键来实现类似的功能.

自动化测试MonkeyRunner、adb shell向Android APP中自动输入中文

在做一些Android自动化脚本,比如向手机QQ中输入中文聊天内容,由于使用Robotium.Appium等工具来做时,由于TX作了签名校验的,所以登录不了QQ的.后来只能使用最傻的MonkeyRunner来做,不过它是完全模拟人为点击,而数据中文就很麻烦了.为此我们尝试了多种方案,简单分享一下: 1. 通过PC的剪贴板与Android模拟器中共享来实现:先将要输入的中文放到PC的剪贴板中,再到Android模拟器中粘贴到QQ聊天输入框中.其缺点是,很不稳定,有时候成功,有时候比较莫名的失败.

腾讯Android自动化测试实战

腾讯Android自动化测试实战 丁如敏 盛娟 等著 图书在版编目(CIP)数据 腾讯Android自动化测试实战 / 丁如敏等著. -北京:机械工业出版社,2016.10 ISBN 978-7-111-54875-1 Ⅰ. 腾-   Ⅱ. 丁-   Ⅲ. 移动终端-应用程序–程序设计   Ⅳ. TN929.53 中国版本图书馆CIP数据核字(2016)第223713号 腾讯Android自动化测试实战 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:

解放双手——Android自动化测试

解放程序猿宝贵的右手(或者是左手) --Android自动化测试技巧 Google大神镇楼 : http://developer.android.com/tools/testing-support-library/index.html#UIAutomator 前言: 觉得文章太长不想往后翻的朋友,你们会后悔的,当然,你也可以选择先看后面的,你会觉得很爽,但是相信我,你还是会回来看前面的.那么,还是慢慢往后翻吧. 导入: 人们懒的走路,才创造了汽车: 人们懒的爬楼,才创造了电梯: 人们懒的扫地,才

浅析android系统设计中的回调思想

一.为何写作本文 在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想.比如activity的生命周期,fragment的生命周期,皆是回调函数实现的,android中的事件处理机制其一就是回调,线程方面的异步任务.loader.hanlder等都是基于回调的,等等. 可见android的其一根本思想就是回调,需要你来参与时,回调用相关的回调方法,你来填充. 可以说回调的思想浸润与android设计的方方面面,android开发中几乎带有

Office教程 教你在word2007中画长横线

  你可能会在word中用一种方法画横线,也许是两种,也许是三种,那么如果一下子让你用四种方法画出长横线你会吗?如果不会的朋友们就来看看这篇教程吧. Office教程 教你在word2007中画长横线 方法一:切换到[开始]选项卡,单击[下划线]按钮的下拉列表,有多种线供你选择,这里选择直线.这样当你开始打字时,打出的字自然带上横线.如果只想要线条,一直按[空格键]即可. 方法二:切换到[插入]选项卡,在[插图]功能选项卡中,单击[形状]按钮,在弹出的下拉列表中选择[直线],这时鼠标光标变为十字

Android编程中activity的完整生命周期实例详解_Android

本文实例分析了Android编程中activity的完整生命周期.分享给大家供大家参考,具体如下: android中 activity有自己的生命周期,对这些知识的学习可以帮助我们在今后写程序的时候,更好的理解其中遇到的一些错误.这篇文章很长,希望不要耽误大家的时间- 今天不会涉及太多关于activity栈的东西,主要说activity自身的生命周期 区分几个概念 1 Activity 官方解释为 "An Activity is an application component that pro

Android 开发中利用异步来优化运行速度和性能

本文讲的是Android 开发中利用异步来优化运行速度和性能, 我们知道,在Android框架中提供了很多异步处理的工具类.然而,他们中大部分实现是通过提供单一的后台线程来处理任务队列的.如果我们需要更多的后台线程的时候该怎么办呢? 大家都知道Android的UI更新是在UI线程中进行的(也称之为主线程).所以如果我们在UI线程中编写耗时任务都可能会阻塞UI线程更新UI.为了避免这种情况我们可以使用 AsyncTask, IntentService和Threads.在之前我写的一篇文章介绍了An