【问题标题】:Unlock emulator screen using espresso使用 espresso 解锁模拟器屏幕
【发布时间】:2015-11-25 17:11:39
【问题描述】:

我正在开发我的第一个 android 应用程序并且我正在设置 CI 服务器。我的浓缩咖啡测试在我的机器上运行良好,但出现以下错误

java.lang.RuntimeException: 等待视图层次结构的根获得窗口焦点并且超过 10 秒没有请求布局。

在运行测试之前,我似乎需要解锁模拟器屏幕。为此,我必须向 src/debug 添加具有所需权限的清单,然后使用以下命令解锁屏幕:

KeyguardManager mKeyGuardManager = (KeyguardManager) ctx.getSystemService(Context.KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock mLock = mKeyGuardManager.newKeyguardLock(name);
mLock.disableKeyguard();

问题是我不想在 if 块中包含上述代码来乱扔我的活动。有没有办法从 espresso 测试本身解锁屏幕?

我的浓缩咖啡测试:

@RunWith(AndroidJUnit4.class)
public class EspressoSetupTest {

    @Rule
    public final ActivityTestRule<WelcomeActivity> activity =
            new ActivityTestRule<>(WelcomeActivity.class, true, true);

    @Test
    public void launchTest() {
        onView(withId(R.id.welcome_textView_hello))
                .perform(click())
                .check(matches(withText("RetroLambda is working")));
    }
}

【问题讨论】:

    标签: android android-espresso


    【解决方案1】:

    您可以在 Espresso 测试中使用 setUp() 方法,例如:

    @UiThreadTest
    @Before
    public void setUp() throws Exception {
       final Activity activity = mActivityRule.getActivity();
        mActivityRule.runOnUiThread(new Runnable() {
            @Override
            public void run() {
              KeyguardManager mKG = (KeyguardManager) activity.getSystemService(Context.KEYGUARD_SERVICE);
              KeyguardManager.KeyguardLock mLock = mKG.newKeyguardLock(KEYGUARD_SERVICE);
              mLock.disableKeyguard();
    
            //turn the screen on
             activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
                        | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
                        | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        | WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
              }
          });
    }
    

    src/debug/AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android" >
        <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>
        <uses-permission android:name="android.permission.WAKE_LOCK"/>
    </manifest>
    

    【讨论】:

    • 我有不同的浓缩咖啡设置。我无权访问上下文,name 变量应该持有什么?
    • 我已经编辑了我的答案以使其更加清晰。您可以使用该活动来获取系统服务。 name 变量只是一个标签,您可以为此使用静态 KEYGUARD_SERVICE 字符串。
    • 谢谢!我的浓缩咖啡测试课并没有真正继承任何东西。我正在使用 ActivityTestRule.getActivity() 获取活动实例,并将您的代码放入 @Before setUp() 方法中,但这不起作用。
    • 我在自己的浓缩咖啡测试中使用它(但在外部设备上)。您可以尝试将键盘保护部分包裹在mActivityRule.runOnUiThread()中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-13
    • 2016-05-28
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多