새로운 android-test-kit (Espresso)으로 몇 가지 테스트를 작성하려고합니다 . 그러나 대화 상자가 표시 되는지 확인 하는 방법에 대한 정보를 찾을 수없고 대화 상자에 대해 몇 가지 작업 (예 : 양수 및 음수 버튼 클릭 등)을 수행 할 수 없습니다. 대화 상자는 WebView
응용 프로그램 자체가 아닌에 의해 표시 될 수도 있습니다 .
어떤 도움을 주시면 감사하겠습니다. 기본에 대한 링크 또는 몇 가지 예제 코드가 필요합니다.
- 대화 상자가 나타나는지 확인
- 대화 버튼 클릭 수행
- 대화 상자의 내부보기와 상호 작용 (사용자 정의보기 인 경우)
- 프리폼이 대화 상자 외부를 클릭하고 표시되는지 확인합니다 (예 :
setCancelable(false)
대화 상자 작성기에서 호출되었으며 확인하려는 경우).
조언 감사합니다!
답변
-
대화 상자가 나타나는지 확인하려면 대화 상자 내에있는 텍스트가있는보기가 표시되는지 확인하면됩니다.
onView(withText("dialogText")).check(matches(isDisplayed()));
또는 ID가있는 텍스트를 기반으로
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
-
대화 상자 버튼을 클릭하려면 다음과 같이하십시오 (button1-확인, button2-취소) :
onView(withId(android.R.id.button1)).perform(click());
최신 정보
- Espresso는 다중 창을 지원하기 때문에 가능하다고 생각합니다 .
- 사용자 정의 대화 상자보기 외부를 클릭하는 것은 확실하지 않지만 표시되는지 여부를 확인하려면 사용자 정의 매처를 만들고 내부를 확인해야합니다.
답변
나는 현재 이것을 사용하고 있으며 잘 작동하는 것 같습니다.
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는 앱이 유휴 상태가 될 때까지 계속 대기합니다. 진행률 대화 상자가 표시되는 한 앱은 유휴 상태가 아닙니다.