使用UIautomator获取手机QQ登录验证码

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这个框架,随便玩玩。

你可能感兴趣的:(Android,android,验证码,qq,uiautomato)