如何在Espresso测试期间处理(关闭)插页式广告

时间:2016-06-15 18:24:27

标签: android admob android-espresso interstitial

在Espresso测试期间处理插页式广告的正确机制是什么?

两个活动之间有插页式广告,我想写两个活动的Espresso测试。

有没有办法在Espresso测试期间关闭插页式广告以继续测试第二个活动?

可以使用Espresso-Intents吗?

UIAutomator混合测试和Espresso是解决这个问题的唯一方法吗?

enter image description here

5 个答案:

答案 0 :(得分:1)

将此库添加到您的gradle:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'

然后在展示广告后的Espresso测试中:

Thread.sleep(5000); // Necessary time you needed to show your ads, for example 5 seconds

// After that, press back button to go back
UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
        mDevice.pressBack();

如果您的应用在低于18的SDK级别上运行,请使用此代码在您的测试目录src/androidTest/中创建另一个AndroidManifest.xml文件,以便您的测试将使用minSdkVersion=18运行(这是所需的API级别) UIAutomator):

<?xml version="1.0" encoding="utf-8"?>
<manifest
    package="com.monkingme.monkingme"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-sdk
        android:minSdkVersion="18"
        tools:overrideLibrary="android.support.test.uiautomator.v18" />
</manifest>

答案 1 :(得分:1)

我最近也遇到了这个问题,所以我只是使用Espresso Test Recorder记录我的近距离广告以查看测试记录的作用,它只使用以下内容:

    ViewInteraction imageButton = onView(
            allOf(withContentDescription("Interstitial close button"), isDisplayed()));
    imageButton.perform(click());

现在可以使用,但我不知道这是否适用于未来的adMob库,并且在更改内容描述后肯定无法工作。

为了将来参考,我使用的是版本11.0.4广告库:

freeCompile 'com.google.android.gms:play-services-ads:11.0.4'

答案 2 :(得分:0)

  

在Espresso测试期间处理插页式广告的正确机制是什么?

     

两个活动之间有插页式广告,我想写两个活动的Espresso测试。

     

有没有办法在Espresso测试期间关闭插页式广告以继续测试第二个活动?

IMO,正确的解决方案是设置您的测试,这样他们就不需要跨越多个活动。

测试应该集中和孤立。您不需要跨越活动来断言行为,因为转换点处存在逻辑分隔。因此,不要写一个测试,说“在活动A中执行x应该在状态y中打开活动B,而在活动B中执行z应该执行此操作”,而不是编写多个测试:

1)“在活动A中执行x应启动打开活动B的意图”(您不关心UI状态或广告),您可以使用Intents API轻松验证。

2)“启动具有给定Intent的活动B(这是您从A到B的转换期望),应该将其初始化为状态y”,您可以通过将Intent传递给您的活动规则来轻松设置在UI上使用匹配器。

3)“在使用状态y启动时在活动B中执行z应执行此操作或”,您可以通过启动活动轻松验证,如(2)所示。

希望有所帮助。

答案 3 :(得分:0)

对于我来说,建议的答案不起作用。 所以这是我的解决方案。

try {
     onView(withContentDescription("Interstitial close button")).check(matches(isEnabled()))
     onView(isRoot()).perform(ViewActions.pressBack())
    } catch (e: NoMatchingViewException) {
    }

检查广告是否存在,如果存在,请单击后退按钮。

答案 4 :(得分:0)

创建您自己的没有视图可见性约束的 ViewAction 类:

public static ViewAction myClick() {

return new ViewAction() {
    @Override
    public Matcher<View> getConstraints() {
        return ViewMatchers.isEnabled(); // no constraints, they are checked above
    }

    @Override
    public String getDescription() {
        return null;
    }

    @Override
    public void perform(UiController uiController, View view) {
        view.performClick();
    }
};

}

然后使用它:

onView(withContentDescription("Interstitial close button")).perform(myClick());

这样广告会自动关闭。此外,必须在开发者设置中禁用动画。