Espresso에 대화 상자가 표시되는지 확인


86

새로운 android-test-kit (Espresso)으로 몇 가지 테스트를 작성하려고합니다 . 그러나 대화 상자가 표시 되는지 확인 하는 방법에 대한 정보를 찾을 수없고 대화 상자에 대해 몇 가지 작업 (예 : 양수 및 음수 버튼 클릭 등)을 수행 할 수 없습니다. 대화 상자는 WebView응용 프로그램 자체가 아닌에 의해 표시 될 수도 있습니다 .

어떤 도움을 주시면 감사하겠습니다. 기본에 대한 링크 또는 몇 가지 예제 코드가 필요합니다.

  1. 대화 상자가 나타나는지 확인
  2. 대화 버튼 클릭 수행
  3. 대화 상자의 내부보기와 상호 작용 (사용자 정의보기 인 경우)
  4. 프리폼이 대화 상자 외부를 클릭하고 표시되는지 확인합니다 (예 : setCancelable(false)대화 상자 작성기에서 호출되었으며 확인하려는 경우).

조언 감사합니다!


아래 내 답변에 대한 의견이 있습니까 ??
데니스

답변:


123
  1. 대화 상자가 나타나는지 확인하려면 대화 상자 내에있는 텍스트가있는보기가 표시되는지 확인하면됩니다.

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    또는 ID가있는 텍스트를 기반으로

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. 대화 상자 버튼을 클릭하려면 다음과 같이하십시오 (button1-확인, button2-취소) :

    onView(withId(android.R.id.button1)).perform(click());
    

    최신 정보

  3. Espresso는 다중 창을 지원하기 때문에 가능하다고 생각합니다 .
  4. 사용자 정의 대화 상자보기 외부를 클릭하는 것은 확실하지 않지만 표시되는지 여부를 확인하려면 사용자 정의 매처를 만들고 내부를 확인해야합니다.

3
ProgressDialog에서 1 단계가 작동하지 않았습니다. 그냥 대화 상자의 제목 및 메시지 확인하려고
팀 볼랜드

1
에스프레소와 정적 수입은 무엇입니까? 이러한 메서드는 어떤 클래스에서 나옵니까? 스택 오버플로 답변에서 정적 가져 오기를 사용하는 이유는 무엇입니까?

2
@jvrodrigues 모든 단일 Espresso 자습서는 정적 가져 오기를 사용합니다. 나는 당신이 그것에 익숙해지기를 제안합니다 (나는 좌절감을 이해하지만). 도움이됩니다. google.github.io/android-testing-support-library/docs
AutonomousApps

4 단계에서는 대화 상자 외부를 클릭하는 대신 "pressBack ();"을 호출 할 수 있습니다. 대화 상자를 닫습니다. 하드웨어 뒤로 버튼을 사용하는 것과 같습니다.
에단

@denys 프로젝트가 이동되었습니다. 링크가 죽은 것 같습니다.
Neon Warge

67

나는 현재 이것을 사용하고 있으며 잘 작동하는 것 같습니다.

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));

27

다음과 같은 AlertDialog가있는 경우 :

여기에 이미지 설명 입력

구성 요소가 표시되는지 확인할 수 있습니다.

int titleId = mActivityTestRule.getActivity().getResources()
        .getIdentifier( "alertTitle", "id", "android" );

onView(withId(titleId))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_title)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.text1))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_message)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button2))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.no)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button3))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.yes)))
        .check(matches(isDisplayed()));

조치를 수행하십시오.

onView(withId(android.R.id.button3)).perform(click());

2
내 경우의 텍스트에는 ID가 android.R.id.message있고 제목에는 숨겨진 ID가 android.R.id.alertTitle있습니다.
Jason Robinson

2
AppCompat 지원 라이브러리에서 제공되는 AlertDialog (또는 DialogFragment)를 사용하는 경우 다음을 사용하십시오.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Mr-IDE

3

수락 된 대답이 아닌 질문 4에 대답하기 위해 다음 코드를 수정했습니다. 여기에 토스트가 표시되는지 여부를 테스트하기 위해 Stack Overflow ( link ) 에서 찾았습니다 .

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

id전달은의 ID입니다 View현재 대화 상자에 표시됩니다. 다음과 같이 메소드를 작성할 수도 있습니다.

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

이제 View특정 텍스트 문자열 이 포함 된를 찾고 있습니다.

다음과 같이 사용하십시오.

getRootView(getActivity(), R.id.text_id).perform(click());

3

버튼 Ids R.id.button1 및 R.id.button2는 장치간에 동일하지 않습니다. ID는 OS 버전에 따라 변경 될 수 있습니다.

이를 달성하는 올바른 방법은 UIAutomator를 사용하는 것입니다. build.gradle에 UIAutomator 종속성 포함

// Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

그리고 사용

// Initialize UiDevice instance
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

// Search for correct button in the dialog.
UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText"));
if (button.exists() && button.isEnabled()) {
    button.click();
}

1
사실 android.R.id.button1, android.R.id.button2android.R.id.button3"양극"은 "중간"및 "음의"전역 상징 수는. 텍스트를 통해 버튼을 선택하는 경우 (완전히 괜찮습니다) UIAutomator가 필요하지 않지만 Espresso의 onView(withText("ButtonTest")).perform(click()).
Thomas Keller

이 솔루션을 Robotium 테스트 프레임 워크와 함께 사용했고 Android OS 대화 상자 버튼을 쉽게 선택할 수있었습니다. 많은 시간을 절약했습니다. 감사합니다 jaydeepw!
Ray

@ThomasKeller 과거에 button1, button2 ID를 사용했는데 다양한 장치에서 실행했을 때 테스트가 깨졌습니다. 표시된 대화 상자는 시스템 제어입니다. 당신의 통제 / UI가 아닙니다. UI 외부의 경우 UIAutomator가 권장됩니다.
JaydeepW

그게 다야. 정말 고마워.
1lb3r

3

누군가가 나처럼이 질문을 우연히 발견하는 경우를 대비하여. 모든 답변은 대화 버튼이있는 대화 상자에서만 작동합니다. 사용자 상호 작용없이 진행률 대화 상자에 이것을 사용하지 마십시오. Espresso는 앱이 유휴 상태가 될 때까지 계속 대기합니다. 진행률 대화 상자가 표시되는 한 앱은 유휴 상태가 아닙니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.