Appium 开源分享-【如何搞定小米手机安全提示】

中年_Brain · 2014年08月13日 · 最后由 中年_Brain 回复于 2014年08月28日 · 2146 次阅读

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

思路很简单

在运行 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 这里处理方式,也请其他同学提供更加灵活的方式解决。

共收到 10 条回复 时间 点赞

有没 iOS 方面的? 像点掉评分那个窗口的,Appium 抓不到的窗口

#1 楼 @532589730 iOS 你就别想了。。

#2 楼 @lihuazhang
我暂时用 sikuli 搞的,appium java 代码塞进 sikuli 的 api

#3 楼 @532589730 你越做越好了,期待分享

#4 楼 @lihuazhang
唉,只会皮毛中的皮毛,差得远啊。

#4 楼 @lihuazhang
估计实用性不大,塞 sikuli 的话,像评分这种窗口应该处理不了,因为不知道什么时候出现,即无法预计窗口出现的时间。

弄了

  1. Eclipse/Intellij IDEA + Maven + Java + TestNG + ReportNG + YAML; 2. 加入了失败时自动截图,在 ReportNG 里面加入了失败截图链接的 Log (主要在 Jenkins 上使用); 3. 根据网上某大神的指引,把 Element 独立成 Yaml 独立管理 (依赖开发的配合),把测试一些数据如测试帐户信息,测试失败时的错误提示独立成 Yaml 管理,减少 Appium Java 测试脚本的 Hard Code。 4. 加入 sikuli script 和 sikuli slides 的 api。 这东西挺好玩的,主要是 sikuli slides 可以使用 google presentation,不用在本地储存 PPTX 文件,直接获取在线的,还可以跑指定某个 slide。不过 sikuli slides 不支持 Mac 10.9,我邮件问过开发者,10 个月前就在解决这个问题,到现在还没解决,所以又加入了 sikuli script 的 api。

有时间,分享下上面说的。

#6 楼 @532589730 每个都很不错,我比较感兴趣的。

有时间研究一下

#6 楼 @532589730 有时间跟你学习一下 YAML,其他的框架都跟你一样,哈哈

#1 楼 @532589730 IOS 方面的东西,我还没有开始研究,需要沉下心来做

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册