Espresso常見問題總結

Espresso從開始到…


本文針對筆者遇到的一些對於筆者(小白)來時解決起來比較困難的問題進行總結,沒有常規的 NoMatchingViewException 問題。因爲工作問題,可能會逐漸的不進行Espresso方面的工作了,這裏也算是給自己這段時間畫一個句號。
PS:很多問題一時想不起來了,最近幾天還會補充。


1.click()問題

(1) at least 90 percent of the view’s area is displayed to the user.

問題分析:
對於佈局有問題的界面,這個問題非常常見,在GeneralClickAction中設置有Constraint,用來過濾錯誤的佈局

public Matcher<View> getConstraints() {
    Matcher<View> standardConstraint = isDisplayingAtLeast(90);
    if (rollbackAction.isPresent()) {
      return allOf(standardConstraint, rollbackAction.get().getConstraints());
    } else {
      return standardConstraint;
    }
  }

isDisplayingAtLeast(90)這裏是進行了至少顯示90%的設置,但是至少在我遇到的測試中,有的界面因爲確實需要覆蓋實現或者修改成本大,存在這種問題。
解決方案:
設置自定義ViewAction,繞過isDisplayingAtLeast(90)限制:

onView(ViewMatcher)
                .perform(new ViewAction() {
                    @Override
                    public Matcher<View> getConstraints() {
                        return isDisplayed();
                    }
                    @Override
                    public String getDescription() {
                        return null;
                    }
                    @Override
                    public void perform(UiController uiController, View view) {
                        view.performClick();
                    }
                });

(2)單擊 雙擊 長按 操作混淆

問題分析:
這種問題在大批量運行自動換測試用例的情況下經常出現(也可能是由於我的使用問題),在多個操作連續進行時容易出現。
解決方案
1.對於單擊和長按,系統本身有提供方案(不過這種混淆沒有遇到過):
使用click(ViewAction)替換click(),參數爲如果出現長按操作後的補償操作。
2.對於單擊和雙擊的混淆:
沒有找到很好的官方方案,有興趣的可以參考本文最後一個問題

2.Toast 無法捕捉問題

問題分析:
捕捉Toast,相信大家都知道,下面這個方法:

onView(withText(String))
    .inRoot(withDecorView(not(is(getActivity().getWindow().getDecorView()))))
    .perform(click());

這個方法也確實沒問題,但是請注意,在官方文檔中,本方法是 用來檢測多窗口的,所以如果在Dialog中彈出Toast,本方法就會有侷限性,因爲當前有多個窗口存在。
解決方案:
這裏只提供Dialog的彈出Toast的捕捉方法,可根據使用的場景,使用RootMatchers自定義修改:

onView(withText(R.string.toolsError))
                .inRoot(allOf(
                        not(isDialog()),
                        withDecorView(not(mActivityTestRule.getActivity().getWindow().getDecorView()))))
                .check(matches(isDisplayed()));

3.無法對onData()進行doesNotExist()檢查

問題分析:
doesNotExist()功能的關鍵是濟對NoMatchingViewException進行捕捉和檢查,onData() 查詢不到之後拋出的異常爲PerformException()
解決方案:
解決方式比較粗暴:直接對onData進行PerformException異常捕捉,進行正常處理,在正常處理流暢上進行報錯處理

try{
    onData(ViewMatcher)
        .perform();
    Assert.assertTrue("報錯",false);
}catch{
    //進行正常操作
}

PS:這裏的檢查必須和常規操作分開

4.操作未響應問題

問題分析:
這個問題出現在幾百個自動化測試用例測試時,原因不明。
解決方案:
因爲這種問題的出現會直接導致一條測試用例崩潰,且這種情況下手動操作並不存在任何問題,這裏採用了多次操作嘗試的方式。

for (int i = 0; ; i++) {
    //此處爲正常點擊操作
    onView(withId(R.id.ibtnSurvey))
	.perform(click());
    try {
    //這裏進行對應click()產生的效果進行檢查
	onView(withText(R.string.ok))
	    .check(matches(isDisplay()));
    //成功將推出循環繼續進行測試
	break;
    //捕捉覈查項的錯誤
    } catch (NoMatchingViewException e) {
    //覈查錯誤將重複進行,最多進行5次
  	if (i >= 5) {
	    Assert.assertTrue("連續五次失敗", false);
  	}
	//循環直到檢查到彈窗爲止
    }
}

PS:同理 這種形式可以用來解決 誤觸和點擊混淆的問題,在 try 中設置相應的操作檢查,catch 中進行相應的 補償操作(返回操作開始的狀態)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章