我正在尝试构建一个函数findElementWithLabel(),它可以递归遍历任何给定元素的整个XCUIElement树,并返回具有指定标签或id的子元素。与内置的childrenMatchingType()函数不同,它将搜索超过一级深度的子级(而不仅仅是直接子级)。我已经在XCUIElement上构建了这个函数作为扩展,下面是示例代码:
public extension XCUIElement {
public func findElementWithLabel(label: String) -> XCUIElement? {
return findElementWithName(self, name:label)
}
private func findElementWithName(elementToSearch:XCUIElement?, name: String) -> XCUIElement? {
if let currentElement = elementToSearch {
if currentElement.label == name {
return currentElement
}
} else {
return nil
}
let children = elementToSearch?.childrenMatchingType(.Any)
var loopIndex:UInt = 0
while (loopIndex < children?.count) {
let foundElement = findElementWithName(children?.elementBoundByIndex(loopIndex), name:name)
if let unwrappedFoundElement = foundElement {
return unwrappedFoundElement
}
loopIndex += 1
}
return nil
}
}该函数返回正确的结果,但不幸的是性能很糟糕,几乎需要10-15秒才能返回。有没有xcode ui自动化方面的专家能帮我推断出导致这种情况的原因?最初我认为这是对"XCUIElement.childrenMatchingType(.Any)“的重复调用,但我认为我可以排除这一点。该函数的平均计算时间为0.007秒,我调用它大约30次,这意味着这不可能是罪魁祸首。我仅有的其他理论是:
1)在某些地方应用了一些延迟,极大地影响了运行时间。我用javascript api在仪器中编写了这个函数,并在遍历树之前调用UIATarget.localTarget().pushTimeout(0),之后使用popTimeout(0)完成了这项工作。这实际上导致我的递归函数调用不会延迟和等待任何元素……如果这是罪魁祸首,有没有什么方法可以让我用新的pushTimeout()和popTimeout()实现这种全局的API功能呢?
2)使用新的ui-automation进行的大量xcode控制台日志记录肯定会影响运行时。我知道NSLog是同步和缓慢的,所以这会是罪魁祸首吗?如果是这样,我们如何关闭这些日志?如果内置的xcode xctest调试日志对运行时的影响如此巨大,那么这种扩展又是如何进行的呢?作为开发人员,我们需要这些日志,但我们也不能让它像这样影响运行时。
发布于 2016-08-20 01:33:34
我找到了我问题的答案。似乎我的递归调用是在元素级别工作的,而我应该在ElementQuery级别工作。编写查询的速度要快得多,因为元素只解析一次,然后解析查询链。
似乎在新的API中,解析元素的成本非常高,因为它每次都会与应用程序通信来解析和验证元素。我怀疑Javascript API也在做这件事,但是因为它们没有公开任何ElementQuery结构,所以它们允许您将超时设置为0,告诉框架不要延迟和等待解析每个元素。无论如何,我的问题的答案是在根元素上使用descendantsOfElement()并编写一个label/id查询。
https://stackoverflow.com/questions/39031916
复制相似问题