1.启动QQ
public void testDemo() throws UiObjectNotFoundException {
device = UiDevice.getInstance(getInstrumentation());
device.pressHome();
device.waitForWindowUpdate("", 2000);
startQQ();
device.waitForWindowUpdate("", 3000);
startLogin();
device.waitForWindowUpdate("", 2000);
}
/**
* 运行QQ
*/
public void startQQ(){
Context context = InstrumentationRegistry.getInstrumentation().getContext();
//sets the intent to start your app
Intent intent = context.getPackageManager().getLaunchIntentForPackage("com.tencent.mobileqq");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
//starts the app
context.startActivity(intent);
}
2.使用UIautomator模拟账号密码输入并点击登陆
//点击登陆按钮,进入登陆界面
UiObject ui_loginBtn= new UiObject(new UiSelector().resourceId("com.tencent.mobileqq:id/btn_login"));
try {
ui_loginBtn.click();
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
device.waitForWindowUpdate("", 2000);
//输入账号
UiObject usernameEt=new UiObject(new UiSelector().className("android.widget.EditText"));
try {
usernameEt.click();
usernameEt.setText("");//填写测试用QQ
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
device.waitForWindowUpdate("", 2000);
//输入密码
UiObject pwEt = new UiObject(new UiSelector().resourceId("com.tencent.mobileqq:id/password"));
try {
pwEt.click();
pwEt.setText("");//填写测试用QQ密码
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
device.waitForWindowUpdate("", 2000);
//点击登陆
UiObject btnLogin = new UiObject(new UiSelector().resourceId("com.tencent.mobileqq:id/login"));
try {
btnLogin.click();
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
device.waitForWindowUpdate("", 2000);
3.获取验证码
在某些情况下登陆QQ会要求填写验证码,如异地登录或者多次输入错误的密码等情况。
主要思路:将验证码控件截取保存为图片,保存到本地文件夹。
3.1 根据类名查找到验证码控件,验证码界面只有一个ImageView。
//UiSelector代表一个搜索UI控件的条件。如果发现多个满足条件的控件则会返回第一个控件。
UiObject ivCode = new UiObject(new UiSelector().className("android.widget.ImageView"));
3.2 先截屏整个界面
String path = "/sdcard/.system/test.png";
File file = new File(path);
device.waitForWindowUpdate("", 2000);
UiDevice.getInstance().takeScreenshot(file,1.0f,0);
3.3 获取到ImageView坐标,根据坐标截取验证码图片
Rect rect;
try {
rect = ivCode.getBounds();
device.waitForWindowUpdate("", 2000);
cutBitmap(rect,path,file);
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
3.4 截图保存到本地
public void cutBitmap(Rect rect,String path,File file) throws IOException {
Bitmap b = BitmapFactory.decodeFile(path);
b = b.createBitmap(b,rect.left,rect.top,rect.width(),rect.height());
FileOutputStream out = new FileOutputStream(file);
b.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
}
保存到本地之后,就可以进行验证码的识别神马的。第一次接触到UIautomator这个框架,随便玩玩。