UiAutomator 关于 getChildByText 的 bug,不知道哪位大神有解?

wtucel · 2015年07月28日 · 最后由 Action 回复于 2015年12月16日 · 2403 次阅读

查看了一下 getChildByText 的源码,发现这个函数是先 scrollIntoView 到对应的文本,再匹配 childPattern。

这样如果我的界面上有两个相同文本的按钮但其他属性不同的时候,就没办法通过这个方法来定位界面上位于下面的那个按钮。

各位大神,有没有比较完美的解决办法?

Public UiObject getChildByText(UiSelector childPattern, String text, boolean allowScrollSearch)
            throws UiObjectNotFoundException {
        Tracer.trace(childPattern, text, allowScrollSearch);
        if (text != null) {
            if (allowScrollSearch) {
                scrollIntoView(new UiSelector().text(text));
            }
            return super.getChildByText(childPattern, text);
        }
        throw new UiObjectNotFoundException("for text= \"" + text + "\"");
    }
共收到 6 条回复 时间 点赞

这个不是 bug 啊,设计就是如此啊。根据 text 来定位,当然找到第一个符合的就返回啊。
你这个需求不要用 byText,改用 byDescription 或者找别的定位策略吧。

另外,请遵守论坛排版规范,代码使用代码块:

代码块

#1 楼 @chenhengjie123
这个需求还真只能用 text 来定位,因为一组按钮中只有 text 是不同的。这个函数本身不存在 bug,但是我觉得设计得不够好,很容易让人误解。匹配了 text,但是没有匹配 childPattern,那就应该再找下一个匹配的 text。
先自己重写一下这个方法吧。

4楼 已删除

这个可以这样做,用 instance,指定获取包含这个文字的第几个 view,从 0 开始数。
很方便的,这个也是 Uiautomator 比 monkeyrunner 好的一个地方

属性有重复的情况,可以通过多个属性定位位置,例如:
new UiObject(new UiSelector().resourceId(type1_detail).description(type2_detail)).click();

我也曾经遇到过这个问题,忘了是怎么解决的了。但用 index 来定位应该能解决。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册