本文針對筆者遇到的一些對於筆者(小白)來時解決起來比較困難的問題進行總結,沒有常規的 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 中進行相應的 補償操作(返回操作開始的狀態)