UiAutomator uiautomator2.0 中监听闹钟响起这个事件,怎么实现的呢。

chenglan · 2016年10月10日 · 最后由 零度 回复于 2016年12月03日 · 4695 次阅读

用例操作步骤
1、打开闹钟
2、删除全部闹钟
3、创建一个当前时钟后两分钟的闹钟,将音量调到 1/3
4、等待闹钟响起退出闹钟

共收到 20 条回复 时间 点赞

初步想法:注册一个 UiWatcher 来实现

如果你的测试机的闹钟是悬浮框是拿不到控件的,监听器也只能做拿的到控件的,可以尝试下拉通知栏,等待闹钟提示。

—— 来自 TesterHome 官方 安卓客户端

#2 楼 @erickyang 的确,uiautomator1 的时候没有对应的 UI xml 就拿不到对象。不知道 uiautomator2 怎样。

#3 楼 @Lihuazhang uiautomator2 虽然更加强大,但是基本的抓取控件和 1 还是一样的,问题依然存在!

—— 来自 TesterHome 官方 安卓客户端

#2 楼 @erickyang 是的,响起的是悬浮窗,无法拿到控件,下拉通知栏这个可行,我在想,可否用 android 的方法来监听闹钟响起事件是否被触发呢

#5 楼 @chenglan 可以监听闹钟广播

#6 楼 @heyniu 谢谢,我也是这么想的,但 android 基础不好,不知道怎么实现

@chenglan 基础不好就学啊,没有捷径。都是拿来主义的话,拿到广播你还是不知道有哪些字段,可以获取到哪些信息。有耐心就一点一点慢慢来,学会基础,学会怎么查官网 DOC。

谢谢,关键是要在很短的时间解决这个问题,暂时先用下拉框吧

package com.alarm.test;

/**
 * Created by yakamoz on 16/10/11.
 */

import android.app.Instrumentation;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.By;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject2;
import android.support.test.uiautomator.UiWatcher;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.util.regex.Pattern;

public class TestAlarm{
    public static Instrumentation instrumentation;
    public static UiDevice mDevice;

    @Before
    public void setUp(){
        instrumentation = InstrumentationRegistry.getInstrumentation();
        mDevice = UiDevice.getInstance(instrumentation);
        mDevice.registerWatcher("alarmWatcher", alarmWatcher);
    }

    @After
    public void tearDown() {
        mDevice.removeWatcher("alarmWatcher");}

    @Test
    public void testAlarm()  {

        //TODO 打开闹钟
        //TODO 判断是否存在闹钟,如果存在,清空闹钟
        //TODO 创建一个当前始终后两分钟的闹钟,音量调节可以用mDevice.pressKeyCode(25)实现;
        //TODO 你可以等待2分钟,或者做其他操作,不会影响UiWatcher的触发

    }

        public  final UiWatcher alarmWatcher = new UiWatcher() {
            public boolean checkForCondition() {
                UiObject2 alarmWindows = mDevice.findObject(By.text(Pattern.compile(".*闹钟.*", Pattern.DOTALL)));
                if (alarmWindows != null) {
                    //TODO 根据实际情况关闭闹钟
                    return true;
                } else {
                    return false;
                }
            }
        };
}

创建一个当前始终后两分钟的闹钟,音量调节可以用 mDevice.pressKeyCode(25) 实现;这个我已经实现了,不过谢谢你的分享,我尝试下后面的。太感谢

#10 楼 @ppliulijun 当闹钟响起时,UiautomatorView 无法识别这个闹钟的悬浮框,二楼方法可行

#12 楼 @chenglan 解决了的话,把答案放出来呗

#9 楼 @chenglan uia2 可以很方便注册一个广播接收器,直接监听闹钟广播,但是你要拿到闹钟广播的字段,我觉得可以用下拉框实现就够了,不必要花太高成本!

—— 来自 TesterHome 官方 安卓客户端

#13 楼 @Lihuazhang 为何不自己先试试

@chenglan 我们为何要帮你回答问题?

#16 楼 @lucasluo 我没说我不分享答案,现在在调试阶段,说了什么话还得罪您啦!关键是你有在分享么!!!

chenglan 关闭了讨论 10月13日 10:02
chenglan 重新开启了讨论 10月13日 10:02

@chenglan 抱歉了。有在分享,在 testerhome 比较少。

虽然 uiautomator 检测不到悬浮闹钟提示控件,但是直接用 mDevice.wait(Until.findObject(By.text("Dismiss")),120000).click(); 还是可以在闹钟响的时候点击到取消的,实测 andorid 6.0 的机器上可用

我是通过下拉框监测字符实现

—— 来自 TesterHome 官方 安卓客户端

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