【问题标题】:Locating UI objects with same attribute values except bounds定位除边界外具有相同属性值的 UI 对象
【发布时间】:2014-09-11 15:27:04
【问题描述】:

在自动化测试用例时,我遇到了多个对象在 UiAutomator 中显示相同属性值的情况,除了边界(即显示屏上的 x、y 位置)。我不想使用边界来定位对象。

在 AndroidViewClient 中,有一些方法可以找到特定对象及其属性。有没有办法在特定层次结构下定位对象。就像是: findViewByHierarchy(attr1:val1, attr2:val2, attr3:val3 ),其中 Id2 是 UI 树中 Id1 的子级,依此类推。如果没有,是否有任何解决方法可以实现相同的效果?

【问题讨论】:

标签: android monkeyrunner android-uiautomator androidviewclient


【解决方案1】:

所有findView*() 方法都接收一个root 参数,该参数指示进行搜索的树的根。

例如:

def findViewById(self, viewId, root="ROOT", viewFilter=None):
    '''
    Finds the View with the specified viewId.

    @type viewId: str
    @param viewId: the ID of the view to find
    @type root: str
    @type root: View
    @param root: the root node of the tree where the View will be searched
    @type: viewFilter: function
    @param viewFilter: a function that will be invoked providing the candidate View as a parameter
                       and depending on the return value (C{True} or C{False}) the View will be
                       selected and returned as the result of C{findViewById()} or ignored.
                       This can be C{None} and no extra filtering is applied.

    @return: the C{View} found or C{None}
    '''

此外,您可以使用自己遍历视图树

def traverse(self, root="ROOT", indent="", transform=View.__str__, stream=sys.stdout):
    '''
    Traverses the C{View} tree and prints its nodes.

    The nodes are printed converting them to string but other transformations can be specified
    by providing a method name as the C{transform} parameter.

    @type root: L{View}
    @param root: the root node from where the traverse starts
    @type indent: str
    @param indent: the indentation string to use to print the nodes
    @type transform: method
    @param transform: a method to use to transform the node before is printed
    '''

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2021-03-22
    • 1970-01-01
    • 2022-07-03
    • 2013-10-14
    相关资源
    最近更新 更多