【问题标题】:How to get a view from within Espresso to pass into an IdlingResource?如何从 Espresso 中获取视图以传递到 IdlingResource?
【发布时间】:2016-04-13 13:03:03
【问题描述】:

我基本上有一个自定义的IdlingResource,它接受一个View 一个构造函数参数。我找不到任何真正谈论如何实现它的地方。

我正在尝试使用这个答案:https://stackoverflow.com/a/32763454/1193321

如您所见,它需要一个ViewPager,但是当我在我的测试类中注册IdlingResource 时,我不确定如何才能获得我的观点。

我尝试过findViewById(),并尝试获取当前正在运行的活动,然后在上面调用findViewById(),但没有成功。

有人知道在这种情况下该怎么做吗?

【问题讨论】:

    标签: java android android-studio android-espresso


    【解决方案1】:

    我还没有在Espresso中使用过IdilingResources,但是你有没有看到这些文章:

    另外请查看Android官方文档:Idling Resources (reference)

    回答你的问题,

    这是从上面的链接中摘取的一个例子:

    从上下文开始,根视图 相关活动可以通过

    View rootView = ((Activity)_context).Window.DecorView.FindViewById(Android.Resource.Id.Content);
    

    在 Raw Android 中,它看起来像:

    View rootView = ((Activity)mContext).getWindow().getDecorView().findViewById(android.R.id.content)
    

    然后简单地在这个上调用 findViewById

    View v = rootView.findViewById(R.id.your_view_id);
    

    这可能也有用:How to call getResources() from a class which has no context?

    希望对你有帮助

    【讨论】:

    • 感谢链接和代码 sn-ps。在发布问题之前,我已经阅读了这些链接。 Chiukis 的博客文章很棒。但你的回答对我来说似乎非常“hacky”。必须有一种方法可以直接从 espresso 测试中获取视图对象吗?
    【解决方案2】:

    想通了。要将视图传递给空闲资源,您所要做的就是获取 ActivityTestRule 的成员变量

    例如:

    @Rule
    public ActivityTestRule<MainActivity> activityTestRule = new ActivityTestRule<>(
            MainActivity.class);
    

    然后拨打getActivity().findViewById(R.id.viewId)

    所以最终结果是:

    activityTestRule.getActivity().findViewById(R.id.viewId);
    

    【讨论】:

      【解决方案3】:

      只要在同一活动中运行测试,接受的答案就有效。但是,如果测试导航到另一个活动 activityTestRule.getActivity() 将返回错误的活动(第一个)。为了解决这个问题,可以创建一个返回实际活动的辅助方法:

      public Activity getCurrentActivity() {
          final Activity[] currentActivity = new Activity[1];
          InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() {
              @Override
              public void run() {
                  Collection<Activity> allActivities = ActivityLifecycleMonitorRegistry.getInstance()
                          .getActivitiesInStage(Stage.RESUMED);
                  if (!allActivities.isEmpty()) {
                      currentActivity[0] = allActivities.iterator().next();
                  }
              }
          });
          return currentActivity[0];
      }
      

      然后它可以像下面这样使用:

      Activity currentActivity = getCurrentActivity();
      if (currentActivity != null) {
          currentActivity.findViewById(R.id.viewId);
      }
      

      【讨论】:

        【解决方案4】:

        如果您使用来自androidx.test.ext.junit.rulesActivityScenarioRule(因为ActivityTestRule“将来会被弃用并最终从库中删除”),您可以获取您的Activity 实例并调用findViewById 方法:

        import androidx.test.ext.junit.rules.activityScenarioRule
        import androidx.test.ext.junit.runners.AndroidJUnit4
        
        @RunWith(AndroidJUnit4::class) {
        
            @get: Rule
            var testRule = activityScenarioRule<MainActivity>()
        
            @Test
            fun mainTestCase() {
                testRule.scenario.onActivity { activity ->
                    val view = activity.findViewById<YourView>(R.id.view)
                }
            }
        }
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多