使用Espresso Framework,点击tabText或在viewPager上执行滑动操作会返回NoMatchingViewException

时间:2019-08-07 07:05:05

标签: android android-viewpager android-espresso android-tablayout android-instrumentation

我的目标是能够导航到我的标签;可能是通过滑动或点击操作;

我的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。

1 个答案:

答案 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))
}