我的目标是能够导航到我的标签;可能是通过滑动或点击操作;
我的RelativeLayout内部是:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/mainLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
...>
<com.google.android.material.tabs.TabItem
android:id="@+id/tabItem1"
android:text="Tab1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<com.google.android.material.tabs.TabItem
android:id="@+id/tabItem2"
android:text="Tab2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</com.google.android.material.tabs.TabLayout>
</com.google.android.material.appbar.AppBarLayout>
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_below="@id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
我已经尝试过Selecting Native Tabs while Espresso testing,还有很多建议,例如指定tabText或tabItem ID onView(withText("Tab2")).perform(click());
;修改我的xml布局,如答案Android ViewPager displaying views on top of TabLayout所示,但这些仍然导致生成NoMatchingViewException
。
我尝试将viewPager的高度从wrap_content
设置为0dp
,现在它可以看到我的tabText。但我不希望这样,因为我的viewPager现在在屏幕上不可见。
已经看过一个可能与我的问题有关的问题,但是还没有答案。也请检查Perform click to tabtext under TabLayout always gives NoMatchingViewException
以防万一。
此tabbedActivity显示在btn.perform(click())
之后。触发事件的事件来自我的MainActivity-在我的ActivityRule ActivityTestRule(MainActivity.class);
我的布局有问题吗? 如何成功切换到我的两个标签?
Espresso是否有可能无法阅读SecondActivity? 我尝试逐行调试它;单击导致下一个活动的按钮后,不读取下一行代码(在这种情况下,这是来自secondActivity的文本/ ID)。当我尝试从模拟器回击(返回MainActivity)时,由于我正在验证的文本/ ID不属于该代码,所以我现在可以进入下一行代码(在这种情况下,结果为NoMatchingViewException)。 MainActivity,应该来自SecondActivity。
答案 0 :(得分:0)
尝试一下:
将此类添加到您的测试目录:
TabsMatcher.java
public class TabsMatcher implements ViewAction {
int position;
TabsMatcher(int position) {
this.position = position;
}
@Override
public Matcher<View> getConstraints() {
return isDisplayed();
}
@Override
public String getDescription() {
return "Click on tab";
}
@Override
public void perform(UiController uiController, View view) {
if (view instanceof TabLayout) {
TabLayout tabLayout = (TabLayout) view;
TabLayout.Tab tab = tabLayout.getTabAt(position);
if (tab != null) {
tab.select();
}
}
}
}
在测试中像这样使用它:
@Test
public void myTest(){
onView(withId(R.id.tab)).perform(new TabsMatcher(position))
}