场景:我们在划水看直播,然后想给自己喜欢的主播点赞(刷赞),但是手指一直点赞好累哦,可不可以用什么方式来代替我们手动点赞呢。
接下来我们来分享两种方式,第一种就是使用adb shell命令来模拟点击,第二种就是使用自动化测试的方法来模拟点击,如果还有更好的方法或者思路请在文章底部留言哦。
介绍方法之前我们先来介绍一个工具,作为安卓开发的应该都接触过也或多或少的使用过了。工具名字叫做Android Device Monitor。这个工具位于你的SDK目录下的tools文件夹中,名字为monitor.bat(Windows系统)。双击打开后界面如下所示:
为了测试我们手机打开淘宝直播任意的直播页面,类似如下所示,然后手机连接电脑记得开启USB调试模式。一切准备就绪之后,我们首先点击“11”所示的手机按钮,然后稍等片刻可以看到中间区域出现了手机直播的截图,如“22”所示。出现截图后移动鼠标到右下角点赞区域,点击点赞按钮,可以在右侧看到相关信息了,这里我们要注意的就是一个resource-id以及一个bounds,resource-id就是这个控件的id了,bounds就是这个组件的区域。记住这两个数据,下面我们会用到。
使用命令的方式很简单易懂了,就是使用input tap命令来直接模拟点击事件,x、y就是要点击位置的坐标了。
adb shell input tap x y
那x,y的坐标怎么获取的呢,还记得上面介绍的工具吗,对的,就是那个bounds数据。
这里我们取[620,1200]来测试好了,打开Android Studio的Terminal输入:
adb shell input tap 620 1200,然后回车,手机上的页面也要保持在直播页面哦,这样不出意外就会看到点赞按钮自动点击了下。
好了基本的思路就是使用adb shell来操作了,那可能有疑问了,我这么点赞一次还需要输入这么多代码然后再回车嘛,这不更麻烦了??不不不,重点是在后面啦,前面只是介绍这么个代码,然后我们需要循环使用这么个代码就好了,对吧,那么怎么使用呢,这里又有两种方法:
之所以想到bat文件是因为这个本来就是在命令行窗口下执行的,所以使用批处理来循环执行这段命令真是在合适不过了,但是我又不会批处理的代码,所以网上找了段循环代码然后稍微修改了下,如下所示:
@echo off
:1
adb shell input tap 620 1200
call "auto.bat"
goto 1
将上文的代码拷贝到记事本中,然后保存为auto.bat文件,双击该文件可以看到点赞按钮在自动一个个点击了。
但是效果不太好,点击速度太慢,因为执行一次adb命令时间有点久。所以解决办法呢就是-----你多双击几次这个bat文件,然后开好几个这样的窗口就好了啊,哈哈哈哈哈!当然你也可以再写一个批处理来伪装多线程方式,这里就不写代码了,因为我也不怎么懂批处理的代码。
这是第二种利用adb shell的方式,就是安卓机获取root权限,然后在手机中自动执行代码,伪代码如下:
String cmd = "input tap 620 1200";
Process process = Runtime.getRuntime().exec("su");
OutputStream os = process.getOutputStream();
os.write((cmd + " \n").getBytes());
os.flush();
思路就是获取root权限,然后执行代码,我是通过悬浮窗的方式展现出一个按钮,然后打开淘宝直播页面,然后点击悬浮窗的按钮,开始循环执行shell命令,具体代码在GameHelper,这里就不在详解。
这种方案就是利用自动化测试来进行模拟点击操作,首先使用Android Studio新建安卓项目,然后在app模块的build.gradle中添加测试框架的依赖(版本看情况选择,我目前是2。2.1.2):
androidTestImplementation ‘com.android.support.test.uiautomator:uiautomator-v18:2.1.2’,
依赖添加完毕后打开项目的androidTest文件,如下所示app/java/com.cooloongwu.helper(androidTest),然后在该包下新建TaoBaoTest.java文件:
TaoBaoTest.java文件具体代码如下:
package com.cooloongwu.helper;
import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Created by CooLoongWu on 2018-10-16 20:57.
*/
@RunWith(AndroidJUnit4.class)
public class TaoBaoTest {
public Instrumentation instrumentation;
public UiDevice uiDevice;
@Before
public void setUp() {
instrumentation = InstrumentationRegistry.getInstrumentation();
uiDevice = UiDevice.getInstance(instrumentation);
}
//点赞按钮ID:com.taobao.taobao:id/taolive_favor_icon_config
//点赞按钮范围[618,1179][696,1257]
@Test
public void test() throws InterruptedException {
//点击喜欢按钮
while (true) {
//换用click方法,感觉比findObject方法效率高很多,而且findObject()执行有时会遇到一些奇怪的错误
uiDevice.click(620, 1200);
Thread.sleep(100);
uiDevice.click(622, 1202);
// uiDevice.findObject(By.res(
// "com.taobao.taobao:id/taolive_favor_icon_config"))
// .click();
}
}
}
编辑完后在test()方法上右键,然后点击 Run ‘test’,确保手机页面在淘宝直播的页面,运行后你就可以看到点赞按钮在自动点击了。
上面是最基本的自动化测试代码,注解可能需要稍微理解下,然后其他代码都是很明显了看名字都能知道意思的。关于安卓的自动化测试这里只是展示了一丢丢的内容,但是比较的有趣,通过这个例子入门自动化,后面要继续努力学习啦。
按照上述代码进行对比,使用自动化测试的方式明显要比adb shell的方式效率高,点击速度快,而且不会造成直播卡顿,开了多个黑窗口来执行adb shell后总会造成直播有一定的延迟及卡顿感,暂不清楚怎么回事。