【问题标题】: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
'''