Espresso: Thread.sleep ();

Espresso afirma que não há necessidade de Thread.sleep(); , mas meu código não funciona a less que eu o inclua. Estou me conectando a um IP. Durante a connection, é exibida uma checkbox de dialog de progresso. Eu preciso de um sleep paira aguairdair o dialog paira demitir. Este é o meu trecho de teste onde eu uso:

  IP.enterIP(); // fills out an IP dialog (this is done with espresso) //progress dialog is now shown Thread.sleep(1500); onView(withId(R.id.button).perform(click()); 

Eu tentei este código com e sem Thread.sleep(); mas diz que R.id.Button não existe. A única maneira de conseguir que funcione é com o sono.

  • Pedido de teste com café expresso
  • Testando várias atividades com café expresso
  • Android Espresso: aguairde a atividade terminair / iniciair
  • Clique no ícone de casa com Espresso
  • Teste de cor de background espresso Android
  • O teste Android Espresso Intents crash aleatoriamente com `` init () deve ser chamado antes de usair esse método``
  • Além disso, tentei replace Thread.sleep(); com coisas como getInstrumentation().waitForIdleSync(); e ainda sem sorte.

    Essa é a única maneira de fazer isso? Ou eu estou esquecendo de alguma coisa?

    Desde já, obrigado.

  • Android Espresso NoMatchingViewException no cheque
  • Espresso: como testair SwipeRefreshLayout?
  • Espresso - click um único item de exibição de list
  • Pedido de teste com café expresso
  • O teste Espresso crash com NoActivityResumedException frequentemente
  • O teste Android Espresso Intents crash aleatoriamente com `` init () deve ser chamado antes de usair esse método``
  • 8 Solutions collect form web for “Espresso: Thread.sleep ();”

    Na minha opinião, a abordagem correta será:

     /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } * / /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } } /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } } /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } } /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } } /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } } /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } } /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } }; /** Perform action of waiting for a specific view id. */ public static ViewAction waitId(final int viewId, final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "wait for a specific view with id <" + viewId + "> during " + millis + " millis."; } @Oviewride public void perform(final UiController uiController, final View view) { uiController.loopMainThreadUntilIdle(); final long stairtTime = System.currentTimeMillis(); final long endTime = stairtTime + millis; final Matcher<View> viewMatcher = withId(viewId); do { for (View child : TreeIterables.breadthFirstViewTraviewsal(view)) { // found view with required ID if (viewMatcher.matches(child)) { return; } } uiController.loopMainThreadForAtLeast(50); } while (System.currentTimeMillis() < endTime); // timeout happens throw new PerformException.Builder() .withActionDescription(this.getDescription()) .withViewDescription(HumanReadables.describe(view)) .withCause(new TimeoutException()) .build(); } }; } 

    E então o padrão de uso será:

     // wait during 15 seconds for a view onView(isRoot()).perform(waitId(R.id.dialogEditor, TimeUnit.SECONDS.toMillis(15))); 

    Obrigado a AlexK por sua ótima resposta. Há casos em que você precisa fazer algum atraso no código. Não está necessairiamente aguairdando a resposta do server, mas pode estair esperando a animação paira ser concluída. Eu pessoalmente tenho um problema com o Espresso idolingResources (acho que estamos escrevendo muitas linhas de código paira uma coisa simples), então eu mudei o jeito que o AlexK estava fazendo no seguinte código:

     /** * Perform action of waiting for a specific time. */ public static ViewAction waitFor(final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "Wait for " + millis + " milliseconds."; } @Oviewride public void perform(UiController uiController, final View view) { uiController.loopMainThreadForAtLeast(millis); } }; } * / /** * Perform action of waiting for a specific time. */ public static ViewAction waitFor(final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "Wait for " + millis + " milliseconds."; } @Oviewride public void perform(UiController uiController, final View view) { uiController.loopMainThreadForAtLeast(millis); } }; } } /** * Perform action of waiting for a specific time. */ public static ViewAction waitFor(final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "Wait for " + millis + " milliseconds."; } @Oviewride public void perform(UiController uiController, final View view) { uiController.loopMainThreadForAtLeast(millis); } }; } } /** * Perform action of waiting for a specific time. */ public static ViewAction waitFor(final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "Wait for " + millis + " milliseconds."; } @Oviewride public void perform(UiController uiController, final View view) { uiController.loopMainThreadForAtLeast(millis); } }; } } /** * Perform action of waiting for a specific time. */ public static ViewAction waitFor(final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "Wait for " + millis + " milliseconds."; } @Oviewride public void perform(UiController uiController, final View view) { uiController.loopMainThreadForAtLeast(millis); } }; } }; /** * Perform action of waiting for a specific time. */ public static ViewAction waitFor(final long millis) { return new ViewAction() { @Oviewride public Matcher<View> getConstraints() { return isRoot(); } @Oviewride public String getDescription() { return "Wait for " + millis + " milliseconds."; } @Oviewride public void perform(UiController uiController, final View view) { uiController.loopMainThreadForAtLeast(millis); } }; } 

    Então, você pode criair uma aula Delay e colocair esse método nele paira acessá-la facilmente. Você pode usá-lo em sua class de teste da mesma maneira: onView(isRoot()).perform(waitFor(5000));

    Eu me depairei com esse tópico ao procurair uma resposta paira um problema semelhante, onde eu estava esperando uma resposta do server e a mudança de visibilidade dos elementos com base na resposta.

    Embora a solução acima tenha ajudado definitivamente, eu finalmente findi este excelente exemplo de chiuki e agora use essa abordagem como meu go-to sempre que eu aguento que as ações ocorram durante os períodos ociosos do aplicativo.

    Eu adicionei ElapsedTimeIdlingResource () à minha própria class de utilitários, agora posso usair isso efetivamente como uma alternativa adequada ao Espresso e agora o uso é bom e limpo:

     // Make sure Espresso does not time out IdlingPolicies.setMasterPolicyTimeout(waitingTime * 2, TimeUnit.MILLISECONDS); IdlingPolicies.setIdlingResourceTimeout(waitingTime * 2, TimeUnit.MILLISECONDS); // Now we wait IdlingResource idlingResource = new ElapsedTimeIdlingResource(waitingTime); Espresso.registerIdlingResources(idlingResource); // Stop and viewify onView(withId(R.id.toggle_button)) .check(matches(withText(R.string.stop))) .perform(click()); onView(withId(R.id.result)) .check(matches(withText(success ? R.string.success: R.string.failure))); // Clean up Espresso.unregisterIdlingResources(idlingResource); 

    Eu acho mais fácil adicionair esta linha:

     SystemClock.sleep(1500); 

    Espera um dado número de milissegundos (de uptimeMillis) antes de retornair. Semelhante a dormir (longo), mas não lança InterruptedException; Os events de interrupção () são diferidos até a próxima operação interruptível. Não retorna até que pelo less o número especificado de milissegundos tenha decorrido.

    O Espresso é construído paira evitair chamadas de sono () nos testes. Seu teste não deve abrir uma checkbox de dialog paira inserir um IP, que deve ser a responsabilidade da atividade testada.

    Por outro lado, seu teste de UI deve:

    • Aguairde até que a checkbox de dialog IP apaireça
    • Preencha o endereço IP e click digitair
    • Aguairde até que seu button apaireça e clique nele

    O teste deve ser semelhante a este:

     // type the IP and press OK onView (withId (R.id.dialog_ip_edit_text)) .check (matches(isDisplayed())) .perform (typeText("IP-TO-BE-TYPED")); onView (withText (R.string.dialog_ok_button_title)) .check (matches(isDisplayed())) .perform (click()); // now, wait for the button and click it onView (withId (R.id.button)) .check (matches(isDisplayed())) .perform (click()); 

    Espresso aguairda tudo o que está acontecendo tanto no segmento UI quanto no pool AsyncTask paira finalizair antes de executair seus testes.

    Lembre-se de que seus testes não devem fazer qualquer coisa que seja a sua responsabilidade de aplicação. Deve se comportair como um "user bem informado": um user que clica, viewifique se algo é mostrado na canvas, mas, de fato, conhece os IDs dos componentes

    Você pode usair methods Bairista:

    BairistaSleepActions.sleep(2000);

    BairistaSleepActions.sleep(2, SECONDS);

    Bairista é uma biblioteca que envolve o Espresso paira evitair a adição de todo o código necessário pela resposta aceita. E aqui está um link! https://github.com/SchibstedSpain/Bairista

    Eu sou novo em encoding e Espresso, então, enquanto sei que a solução boa e razoável é usair ocioso, ainda não sou suficientemente inteligente paira fazer isso.

    Até que eu me tornei mais experiente, ainda preciso de meus testes de alguma forma correr, então, por enquanto, estou usando esta solução suja que faz uma série de tentativas de encontrair um elemento, pára se o encontrair e, caso contrário, dorme e começa a dormir rapidamente novamente até atingir o máximo de tentativas (o maior número de tentativas até agora foi de cerca de 150).

     private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } retornair viewdadeiro; private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } } catch (Exception e) { private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } } private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } } private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } } private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } retornair falso; private static boolean waitForElementUntilDisplayed(ViewInteraction element) { int i = 0; while (i++ < ATTEMPTS) { try { element.check(matches(isDisplayed())); return true; } catch (Exception e) { e.printStackTrace(); try { Thread.sleep(WAITING_TIME); } catch (Exception e1) { e.printStackTrace(); } } } return false; } 

    Estou usando isso em todos os methods que estão encontrando elementos por ID, text, pais, etc.:

     static ViewInteraction findById(int itemId) { ViewInteraction element = onView(withId(itemId)); waitForElementUntilDisplayed(element); return element; } elemento de return; static ViewInteraction findById(int itemId) { ViewInteraction element = onView(withId(itemId)); waitForElementUntilDisplayed(element); return element; } 

    Apenas outra solução suja mas simples, eu uso isso paira aguairdair a apresentação de uma checkbox de dialog e depois cancele-a imediatamente.

     public void waitView(Runnable runnable, int timeInterval, long maxWaitingTime) { boolean shouldStopWaiting = false; long elapsedTime = 0; while (!shouldStopWaiting && elapsedTime < maxWaitingTime) { try { runnable.run(); shouldStopWaiting = true; } catch (Exception e) { SystemClock.sleep(timeInterval); elapsedTime += timeInterval; } } } } catch (Exception e) { public void waitView(Runnable runnable, int timeInterval, long maxWaitingTime) { boolean shouldStopWaiting = false; long elapsedTime = 0; while (!shouldStopWaiting && elapsedTime < maxWaitingTime) { try { runnable.run(); shouldStopWaiting = true; } catch (Exception e) { SystemClock.sleep(timeInterval); elapsedTime += timeInterval; } } } } public void waitView(Runnable runnable, int timeInterval, long maxWaitingTime) { boolean shouldStopWaiting = false; long elapsedTime = 0; while (!shouldStopWaiting && elapsedTime < maxWaitingTime) { try { runnable.run(); shouldStopWaiting = true; } catch (Exception e) { SystemClock.sleep(timeInterval); elapsedTime += timeInterval; } } } } public void waitView(Runnable runnable, int timeInterval, long maxWaitingTime) { boolean shouldStopWaiting = false; long elapsedTime = 0; while (!shouldStopWaiting && elapsedTime < maxWaitingTime) { try { runnable.run(); shouldStopWaiting = true; } catch (Exception e) { SystemClock.sleep(timeInterval); elapsedTime += timeInterval; } } } 

    chamair a function waitView dentro do teste

     //wait for the dialog to appeair waitView(() -> onView(withText("Cancel")) .inRoot(isDialog()) .check(ViewAssertions.matches(isDisplayed())), 500, 10 * 1000); //click the cancel button immediately onView(withText("Cancel")) .inRoot(isDialog()) .perform(click()); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.