Estou tentando escrever alguns testes com o novo kit android-test (Espresso) . Mas não consigo encontrar nenhuma informação sobre como verificar se uma caixa de diálogo é exibida e realizar algumas ações nela (como clicar nos botões positivo e negativo, etc). Observe que uma caixa de diálogo também pode ser exibida por um WebView
, não pelo próprio aplicativo.
Qualquer ajuda seria apreciada. Eu só preciso de um link ou algum código de exemplo para o básico:
- Verifique se uma caixa de diálogo aparece
- Executar cliques nos botões de diálogo
- Interaja com a visão interna da caixa de diálogo (se for uma visão personalizada)
- A pré-forma clica fora da caixa de diálogo e verifique se ela está sendo exibida ou não (por exemplo, se
setCancelable(false)
foi chamada no criador da caixa de diálogo e queremos verificar isso)
Obrigado em conselhos!
android
android-espresso
Serj Lotutovici
fonte
fonte
Respostas:
Para verificar se a caixa de diálogo aparece, você pode simplesmente verificar se Exibir com um texto presente dentro da caixa de diálogo é mostrado:
onView(withText("dialogText")).check(matches(isDisplayed()));
ou, com base em texto com id
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
Para clicar no botão das caixas de diálogo, faça o seguinte (botão1 - OK, botão2 - Cancelar):
onView(withId(android.R.id.button1)).perform(click());
ATUALIZAR
fonte
Atualmente, eu uso isso e parece funcionar bem.
onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed()));
fonte
Se você tiver um AlertDialog como esse:
Você pode verificar se os componentes são exibidos:
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()));
e realizar uma ação:
onView(withId(android.R.id.button3)).perform(click());
fonte
android.R.id.message
e o título tinha um id oculto deandroid.R.id.alertTitle
.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Para responder à pergunta 4, que a resposta aceita não, modifiquei o código a seguir, que encontrei aqui no Stack Overflow ( link ) para testar se um Toast foi exibido.
@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) { return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
O
id
passado é o id de umView
atualmente exibido em sua caixa de diálogo. Você também pode escrever o método assim:@NonNull public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) { return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView())))); }
E agora ele está procurando por um
View
contendo uma string de texto específica.Use-o assim:
getRootView(getActivity(), R.id.text_id).perform(click());
fonte
Os IDs de botão R.id.button1 e R.id.button2 não serão iguais em todos os dispositivos. Os Ids podem mudar com as versões do sistema operacional.
A maneira correta de fazer isso é usar o UIAutomator. Inclua a dependência UIAutomator em seu build.gradle
// Set this dependency to build and run UI Automator tests androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
E use
// 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(); }
fonte
android.R.id.button1
,android.R.id.button2
eandroid.R.id.button3
para "positivo", "neutro" e "negativo", são símbolos globais que podem ser usados. Se você escolher selecionar os botões por meio de seu texto - o que é totalmente correto - você não precisa do UIAutomator, mas pode fazer o mesmo com o EspressoonView(withText("ButtonTest")).perform(click())
.Apenas no caso de alguém tropeçar nesta questão como eu. Todas as respostas funcionarão apenas para caixas de diálogo COM botões de diálogo. Não tente usar isso para caixas de diálogo de progresso sem interação do usuário. O Espresso fica esperando que o aplicativo entre no estado ocioso. Enquanto a caixa de diálogo de progresso estiver visível, o aplicativo não estará inativo.
fonte