簡體   English   中英

Android Espresso flaky withId withText test

[英]Android Espresso flaky withId withText test

我有這個測試大約一半的時間。

  @Test
  public void thirdSwipe() {
    onView(withId(R.id.pager)).perform(swipeLeft());
    onView(withId(R.id.pager)).perform(swipeLeft());
    onView(withId(R.id.pager)).perform(swipeLeft());
    onView(allOf(withId(R.id.hint_english_text), withText("dog 0a"))).check(matches(isDisplayed()));
  }

我失敗了:

android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: 'is displayed on the screen to the user' doesn't match the selected view.
Expected: is displayed on the screen to the user
Got: "TextView{id=2131427358, res-name=hint_english_text, visibility=VISIBLE, width=624, height=62, has-focus=false, has-focusable=false, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=20.0, y=20.0, text=dog 0a, input-type=0, ime-target=false, has-links=false}"

因此,看起來它發現TextView帶有"dog 0a" ,但它無法識別它。 我查看了其他問題,並且我使用String設置文本,這只是我班級的幾行:

private String  englishText;
englishTextView.setText(englishText);

另外,我正在使用allOf() 任何幫助,將不勝感激。 這個視圖在ViewPager的視圖中,所以我不確定在ViewPager是idyl之前是否發生了測試,但它確實說它找到了視圖。

對於空轉問題,你肯定是在正確的軌道上。 在執行滑動后,Espresso無法知道ViewPager何時完全穩定。 正如故障所暗示的那樣,您正在尋找的視圖位於視圖層次結構中的某個位置,這意味着它已被渲染,但Espresso正在檢測它尚未顯示在屏幕上。 這是因為ViewPager尚未完全定位到您感興趣的頁面上。

接下來的問題是如何告訴Espresso等待ViewPager結算。 這是一個需要解決的難題。

消除此問題可能性的一種方法是執行Thread.sleep ,這將迫使Espresso等待一段時間,希望ViewPager在等待結束前解決。 雖然這通常可以在足夠大的睡眠持續時間內工作,但這並不理想,因為這會給測試增加不必要的時間。

解決這個問題的最佳方法是讓ViewPager告訴我們什么時候完全解決了。

如果你看一下ViewPager可用的一些監聽器,其中一個是OnPageChangeListener 這個類有幾個回調方法: onPageScrolledonPageScrollStateChangedonPageSelected

onPageSelected聽起來像是一個很好的候選人,但如果你仔細看看這個方法的文檔,你會發現它說

/**
 * This method will be invoked when a new page becomes selected. Animation is not
 * necessarily complete.
 */

所以這不會起作用。

onPageScrollStateChanged是另一個好的候選人。 這會報告ViewPager中的一些狀態更改,即SCROLL_STATE_DRAGGINGSCROLL_STATE_SETTLINGSCROLL_STATE_IDLE 因此,使用此回調,我們可以檢測ViewPager何時進入空閑狀態。

至於如何將此偵聽器的實例掛鈎到ViewPager和Espresso,您可以查看Espresso提供的此實現 ,以便對DrawerLayouts執行操作並類似地等待它們解決。 它的主旨是創建一個自定義ViewAction,用於將其中一個偵聽器附加到ViewPager上,然后執行滑動並等待ViewPager報告它進入SCROLL_STATE_IDLE

注意,此實現使用反射來刪除和包裝一個DrawerListener從DrawerLayout如果一個連接它自己之前存在,但這不是在ViewPager情況下必要的,因為ViewPager可以有多個OnPageChangeListeners重視它。

這對我有用

onView(allOf(
  withId(R.id.pagerimage),
  ChildOf(withId(R.id.viewpager), 0)
      )).check(matches(isDisplayed()))
        .perform(swipeLeft());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM