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

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

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

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

조언 감사합니다!



답변

  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. 사용자 정의 대화 상자보기 외부를 클릭하는 것은 확실하지 않지만 표시되는지 여부를 확인하려면 사용자 정의 매처를 만들고 내부를 확인해야합니다.


답변

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

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


답변

다음과 같은 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());


답변

수락 된 대답이 아닌 질문 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());


답변

버튼 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();
}


답변

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


답변