繁体   English   中英

Android Espresso等待查看,R.id值不断变化

[英]Android Espresso waiting for view, R.id value keeps changing

在我们应用程序的许多部分,我们都有一些视频。 在我的测试中,我正在等待视频完成:

onView(isRoot()).perform(waitId(R.id.activity_generic_video_video_control_next, 80000));

waitId() 是一个 function 我从 StackOverflow 上的一篇帖子中找到了它,它在很长一段时间内都运行良好。 现在由于某种原因它不起作用,我不确定它何时坏了或为什么坏了。

/** Perform action of waiting for a specific view id. */
    public static ViewAction waitId(final int viewId, final long millis) {
        return new ViewAction() {
            @Override
            public Matcher<View> getConstraints() {
                return isRoot();
            }

            @Override
            public String getDescription() {
                return "wait for a specific view with id <" + viewId + "> during " + millis + " millis.";
            }

            @Override
            public void perform(final UiController uiController, final View view) {
                uiController.loopMainThreadUntilIdle();
                final long startTime = System.currentTimeMillis();
                final long endTime = startTime + millis;
                final Matcher<View> viewMatcher = withId(viewId);

                do {
                    for (View child : TreeIterables.breadthFirstViewTraversal(view)) {
                        if (child.getId() != -1) {
                            Log.d(TAG, "child id " + child.getId() + " vs " + viewId + " vs " + R.id.activity_generic_video_video_control);
                        }

                        // found view with required ID and it's visible
                        if (viewMatcher.matches(child) && child.getVisibility() == View.VISIBLE) {
                            return;
                        }
                    }

                    uiController.loopMainThreadForAtLeast(50);
                }
                while (System.currentTimeMillis() < endTime);

                // timeout happens
                throw new PerformException.Builder()
                        .withActionDescription(this.getDescription())
                        .withViewDescription(HumanReadables.describe(view))
                        .withCause(new TimeoutException())
                        .build();
            }
        };
    }

如您所见,代码会循环一段时间,直到相关视图可见为止。 有趣的是,我从 for 循环中的日志语句中获取了这个 output:

child id 2131363297 vs 2131362267 vs 2131362265

第一个 # 是给出遍历显示树的原因的视图的 ID。 第二个# 是传递给function 的ID。第三个# 是直接引用R.id 时同一视图的ID。

我可以说至少第二个和第三个数字应该相同,但事实并非如此。 这是怎么回事? 为什么id值会改变?

什么是资源activity_generic_video_video_control_next 如果它是 animation,它可以更改 res id。

你应该得到一个错误解释:

也许主线程在合理的时间内没有空闲? 可能有一个 animation 或不断重绘屏幕的东西。 或者活动正在做。网络调用创建? 请参阅线程转储日志。

由于您正在播放视频,如果重绘 canvas(连同按钮),则由以下原因引起:

...一个 animation 或不断重绘屏幕的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM