【问题标题】:How to handle(close) Interstitial Ad during Espresso Tests如何在 Espresso 测试期间处理(关闭)插页式广告
【发布时间】:2016-06-15 18:24:26
【问题描述】:

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

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

有什么方法可以在 Espresso 测试期间关闭插页式广告以继续测试第二个 Activity?

可以使用 Espresso-Intents 来完成吗?

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

【问题讨论】:

  • 这个运气好吗?我也卡在这里了。
  • 我想没有直接的方法可以在活动之间运行涉及库 UI(在本例中为 google admob)的 Espresso 测试。在我的情况下,它是免费和付费的味道。我曾经在两个活动之间以“免费”风格显示广告,而不是在“付费”活动中显示广告..所以在免费风格的情况下,我曾经测试下一个屏幕上的 UI 元素是否在我点击第一个屏幕中的某个元素时可见,这需要用户到第二个屏幕..如果它们可见,则测试应该失败,反之亦然测试“付费”版本案例..有意义吗?有什么改进的建议吗?
  • 也许您可以使用 UI automator,然后使用它按下系统后退按钮,然后以这种方式关闭插页式广告。无论如何,由于时间紧迫,我放弃了,而具有讽刺意味的是,Espresso 对我来说比 Robotium 更易碎,所以我改用它和一些自定义等待逻辑,它马上就奏效了。
  • 你找到解决办法了吗?
  • @DamiaFuentess 我不记得我当时做了什么。大多数情况下,我实现了我在上面的评论中写的内容。我会检查源代码并回复你。

标签: android admob android-espresso interstitial


【解决方案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 运行(这是 UIAutomator 所需的 API 级别):

<?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>

【讨论】:

  • 似乎对我不起作用。即使手动按下后退按钮也不会关闭它。
【解决方案2】:

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

    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'

【讨论】:

    【解决方案3】:

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

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

    有什么方法可以在 Espresso 测试期间关闭插页式广告以继续测试第二个 Activity?

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

    测试应该集中和隔离。您不需要跨越活动来断言行为,因为在转换点存在逻辑分离。因此,不要编写一个测试说“在 Activity A 中执行 x 应该在状态 y 中打开 Activity B,并且在 Activity B 中执行 z 应该这样做或那样”,而是编写多个测试:

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

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

    3)“在状态 y 开始时在 Activity B 中执行 z 应该执行此操作或执行此操作”,您可以通过如 (2) 中的启动 Activity 轻松验证。

    希望对您有所帮助。

    【讨论】:

      【解决方案4】:

      就我而言,建议的答案不起作用。 所以这是我的解决方案。

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

      检查广告是否存在,如果存在 - 点击返回按钮。

      【讨论】:

        【解决方案5】:

        创建您自己的没有视图可见性限制的 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());
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多