1,实际上提到的view就相当于Element,例如onView(withId(R.id.view))
2,有些时候,一个R.id的值被多个views共享,这时会出现:AmbiguousViewMatcher Exception。这里需要找到view的唯一标识属性,例如:
onView(allOf(withId(R.id.view), withTest("Hello!")))
onView(allOf(withId(R.id.view), not(withTest("unwanted"))))
3,对于一个好的Apps,所有的views对于一个用户来说都应该是包含描述性的text或者有一个内容描述。如果你通过withTest / withContent Description找不到这个view,可以报一个accessibility bug。
4,如果满足条件的话,优先选择R.id
5,Perform操作:perform.(click()), perform(typeText("Hello"), click()), perform(scrollTo(), click()), perform(swipeRight())
6,AdapterView 是一种通过Adapter来动态加载数据的界面元素,常用的有ListView, GridView, Spinner 等都属于AdapterView。不同于我们之前提到的静态的控件,AdapterView 在加载数据时,可能只有一部分显示在屏幕上,对于没有显示的那部分数据,通过onView()是没有办法找到的。于是,Espresso提供了如下方法来查找元素:onData()
onData(allOf(is(instanceOf(String.Class)), is("Americano"))).perform(click())
【注】实际上现在可以通过RecyclerView来替换AdapterView,可以查看:http://blog.csdn.net/seaee/article/details/52094255
7,匹配一个View旁边的另一个View
onView(allOf(withTest("7"), hasSibling(withText("item:0")))).perform(click())
8,JUnit4 Rules,有两种Rules当test with AndroidJUnitRunner,第一种是ActivityTestRule,另一种是ServiceTestRule
ActivityTestRule:提供针对一个Activity 的功能测试,这个Activity will be 启动 before each of @Test 以及 Before any method of @Before. 它将在test完成和@after 方法完成之后结束。
9,匹配Map类型的view, 例如 Map<String, Object>
onData(allOf(is(instanceOf(Map.Class)), hasEntry(equal("STR"), is("item:50")))).perform(click())
10,匹配一个指定view的子view
onData(allOf(is(instanceOf(Map.class)), hasEntry(equal("STR"), is("item:50")))).onChildView(withId(R.id.item.size)).perform(click())
11,匹配一个包含在操作栏(ActionBar)的view
有两种不同的action bars, <1> Normal ActionBar <2> Contextual Action Bar 上下文操作栏
上下文操作栏:所有操作按钮都是出现在ActionBar的位置。
(1)匹配可见的icon:
<1> Normal ActionBar : onView(withId(R.id.xxx))
<2> Contextual Action Bar: onView(withId(R.id.xxx))
(2)匹配overflow menu中的view:
<1> Normal ActionBar:openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext())
<2> Contextual Action Bar: openContextualActionModeOverflowMenu()
12,断言一个view is not displayed
import static org.hamcrest.Matchers.not
onView(withId(R.id.bottom_left)).check(matches(not(isDisplayed())));
13,断言一个view is not present
onView(withId(R.id.bottom_left)).check(doesNotExist());
14,Espresso Web用于自动化测试web元素。
15,通过方法onView()可以获取某个控件的对象,即ViewInteraction。
onView() 有两个方法来获取对象,可以通过withText,例如 ViewInteraction vi_text = onView(ViewMatchers.withText("通过该文本"))。
还可以通过withId,例如 ViewInteraction vi_id = onView(ViewMatchers.withId(R.id.id2))。
Reference: https://google.github.io/android-testing-support-library/docs/espresso/index.html