论坛内有人分享过类似的解决方案,但是我还是想重新整理一下,给后面的人提供更加直接的解决方案。

思路很简单

在运行 appium 初始化代码,前使用新的线程去自动点击掉那个该死的弹出框。

AppiumDriver appdriver = new AppiumDriver(new URL(urls), capabilities);

1、首先设置手机,任意键唤醒,不要设置屏幕锁,因为锁这个东西还是很烦的,appium 有时候 unlock 会失效。
2、在执行初始化前,调用我的点击方案,运行进程
3、手机上拉起了测试 APP 后,关闭进程

提供代码实例,写的简陋,请自己改良

public class IntSetUpApp extends Thread {
    public static boolean flag = false;
    public static boolean tapflag = false;
    public static int tapx = 0;
    public static int tapy = 0;
    public static String devName;

    public IntSetUpApp(String dev_Name) {
        // TODO Auto-generated constructor stub
        devName = dev_Name;
        flag = true;
    }

    //标签,用来表示我的循环内的代码是否一致执行
    public static void setflag(boolean stflag) {
        flag = stflag;
    }

    //需要点击的地方,请自己调整
    public static void settapflag(boolean stflag, int x, int y) {
        tapflag = stflag;
        tapx = x;
        tapy = y;
    }

    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + "开始点击小米安全提示");

            Runtime.getRuntime().exec(
                    "adb -s " + devName + " shell input keyevent 26");
            while (flag) {
                                //这个时间根据自己的要求调整
                Thread.sleep(15000);
                if (tapflag) {
                                        //循环次数也根据自己的要求调整
                    for (int i = 0; i < 2; i++) {
                        Runtime.getRuntime().exec(
                                "adb -s " + devName + " shell input tap "
                                        + tapx + " " + tapy);
                        // Runtime.getRuntime().exec(
                        // "adb -s " + devName + " shell input keyevent 26");
                        Thread.sleep(1500);
                        tapflag = false;
                    }
                }
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

怎么调用这个方法呢?也是一个参考,如下:

       // 创建一个可重用固定线程数的线程池
ExecutorService pool = Executors.newSingleThreadExecutor();

// 创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
IntSetUpApp mp = new IntSetUpApp(deviceName);

// 将线程放入池中运行
pool.execute(mp);

// 提前进行执行
// 红米NOTE,这里的设备名,自己获取,需要点击的地方也需要自己获取,我没有
if (deviceName.equals("79S4DAOZSSSK5SZT")) {
    IntSetUpApp.settapflag(true, 525, 1165); 
}

//初始化你要执行的app
       AppiumDriver appdriver = new AppiumDriver(new URL(urls), capabilities);

//这里的等待时间,最好跟你进程里面的时间对应起来,不然会有执行上的异常
        TimeUnit.SECONDS.sleep(5);
        //让进程内的循环释放,不在被占用
IntSetUpApp.setflag(false);
TimeUnit.SECONDS.sleep(10);
System.out.println("关闭小米安全提示进程");
// 关闭线程池
pool.shutdownNow();

这里写的比较简陋,java 这里处理方式,也请其他同学提供更加灵活的方式解决。


↙↙↙阅读原文可查看相关链接,并与作者交流