[英]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
。 這個類有幾個回調方法: onPageScrolled
, onPageScrollStateChanged
和onPageSelected
。
onPageSelected
聽起來像是一個很好的候選人,但如果你仔細看看這個方法的文檔,你會發現它說
/**
* This method will be invoked when a new page becomes selected. Animation is not
* necessarily complete.
*/
所以這不會起作用。
onPageScrollStateChanged
是另一個好的候選人。 這會報告ViewPager中的一些狀態更改,即SCROLL_STATE_DRAGGING
, SCROLL_STATE_SETTLING
和SCROLL_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.