Как обрабатывать (закрывать) межстраничное объявление во время тестов эспрессо

Каков правильный механизм работы с межстраничной рекламой во время тестов эспрессо?

Между двумя действиями есть межстраничная реклама, и я хочу написать тест эспрессо, охватывающий оба действия.

Есть ли способ закрыть межстраничное объявление во время теста эспрессо, чтобы продолжить тестирование второго действия?

Можно ли это сделать с помощью Espresso-Intents?

ИЛИ

Является ли смесь тестов UIAutomator и Espresso единственным решением этой проблемы?

введите здесь описание изображения


person PunitD    schedule 15.06.2016    source источник
comment
Удачи с этим? Я тоже застрял здесь.   -  person Matej    schedule 31.08.2016
comment
Я предполагаю, что нет простого способа запустить тесты Espresso с использованием пользовательского интерфейса библиотеки (в данном случае Google Admob) между действиями. В моем случае это была бесплатная и платная вещь. между двумя действиями, а не в «платном»... поэтому в случае бесплатного варианта я проверял, видны ли элементы пользовательского интерфейса на следующем экране, когда я нажимаю на какой-либо элемент на первом экране, который переводит пользователя на второй экран.. Если они видны, тогда тест должен завершиться неудачно, и наоборот, тесты для «платной» версии.. имеет смысл? Любые предложения по улучшению этого?   -  person PunitD    schedule 31.08.2016
comment
Может быть, вы могли бы использовать автоматизатор пользовательского интерфейса, нажать с его помощью системную кнопку «Назад» и таким образом закрыть межстраничное объявление. В любом случае, я сдался, так как у меня было мало времени, и по иронии судьбы эспрессо оказался для меня более странным, чем Robotium, поэтому вместо этого я использовал его с небольшой пользовательской логикой ожидания, и это сработало сразу.   -  person Matej    schedule 31.08.2016
comment
Вы нашли решение этой проблемы?   -  person Damia Fuentes    schedule 28.09.2017
comment
@DamiaFuentess Я не помню, что я делал тогда. В основном я реализовал то, что написал в комментарии выше. Я проверю исходный код и вернусь к вам.   -  person PunitD    schedule 02.10.2017


Ответы (5)


Добавьте эту библиотеку в свой градиент:

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

Затем в вашем тесте эспрессо после показа рекламы:

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();

Если ваше приложение работает на уровне SDK ниже 18, создайте еще один файл AndroidManifest.xml в вашем тестовом каталоге src/androidTest/ с этим кодом, чтобы ваши тесты выполнялись с 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>
person Damia Fuentes    schedule 02.10.2017
comment
Кажется, это не работает для меня. Даже ручное нажатие кнопки назад не закрывает его. - person Adrian Elder; 25.08.2020

Недавно у меня тоже была проблема, поэтому я просто использовал 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'
person Andrew Lam    schedule 07.10.2017

Каков правильный механизм работы с межстраничной рекламой во время тестов эспрессо?

Между двумя действиями есть межстраничная реклама, и я хочу написать тест эспрессо, охватывающий оба действия.

Есть ли способ закрыть межстраничное объявление во время теста эспрессо, чтобы продолжить тестирование второго действия?

IMO, правильное решение - настроить тесты так, чтобы им не нужно было охватывать несколько действий.

Тесты должны быть целенаправленными и изолированными. Вам не нужно объединять действия, чтобы утверждать поведение, потому что в точке перехода существует логическое разделение. Таким образом, вместо написания теста, в котором говорится, что «выполнение x в действии A должно открыть действие B в состоянии y, а выполнение z в действии B должно сделать то или иное», вы пишете несколько тестов:

1) «выполнение x в действии A должно вызвать намерение открыть действие B» (вас не волнует состояние пользовательского интерфейса или ваше объявление), что вы можете легко проверить с помощью Intents API.

2) «запуск действия B с заданным намерением (это то, что вы ожидаете от перехода от A к B) должен инициализировать его до состояния y», что вы можете легко настроить, передав намерение своему правилу действия и используя сопоставители на пользовательский интерфейс.

3) «выполнение z в действии B при запуске с состоянием y должно делать то или иное», что вы можете легко проверить, запустив действие, как в (2).

Надеюсь, это поможет.

person dominicoder    schedule 07.10.2017

В моем случае предложенные ответы не сработали. Так что это мое решение.

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

Проверяем, существует ли объявление, и если да — нажимаем кнопку «Назад».

person Idan Magled    schedule 26.02.2019

Создайте свой собственный класс 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());

Таким образом, объявление будет закрыто автоматически. Также анимацию приходится отключать в настройках для разработчиков.

person MarcinBLN    schedule 30.12.2020