gpt4 book ai didi

ios - 如何递归搜索具有良好性能的XCUIElement树?

转载 作者:可可西里 更新时间:2023-11-01 02:15:28 24 4
gpt4 key购买 nike

我正在尝试构建一个 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) 完成了这个技巧。这实质上导致我的递归函数调用不延迟并等待任何元素...如果这是罪魁祸首,是否有某种方法可以使用新 API 实现此全局 pushTimeout() 和 popTimeout() 功能?

2) 使用新的 ui-automation 的大量 xcode 控制台日志记录一定会影响运行时。我知道 NSLog 是同步的而且很慢,所以这可能是罪魁祸首吗?如果是这样,我们如何关闭这些日志?如果内置的 xcode xctest 调试日志对运行时的影响如此巨大,这怎么可能向前扩展。作为开发人员,我们需要这些日志,但我们也不能让它像这样影响运行时间。

最佳答案

我找到了问题的答案。看来我的递归调用在 Element 级别工作,我应该在 ElementQuery 级别工作。编写查询运行得更快,因为元素被解析一次且仅一次,然后解析查询链。

在新的 API 中解析元素的成本似乎非常高,因为它每次都与应用程序通信以解析和验证元素。我怀疑 Javascript API 也在这样做,但由于它们没有公开任何 ElementQuery 结构,它们允许您将超时设置为 0,告诉框架不要延迟并等待解析每个元素。无论如何,我的问题的答案只是在根元素上使用 descendantsOfElement() 并编写标签/id 查询。

关于ios - 如何递归搜索具有良好性能的XCUIElement树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39031916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com