首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何递归查找性能良好的XCUIElement树?

如何递归查找性能良好的XCUIElement树?
EN

Stack Overflow用户
提问于 2016-08-19 13:48:57
回答 1查看 586关注 0票数 2

我正在尝试构建一个函数findElementWithLabel(),它可以递归遍历任何给定元素的整个XCUIElement树,并返回具有指定标签或id的子元素。与内置的childrenMatchingType()函数不同,它将搜索超过一级深度的子级(而不仅仅是直接子级)。我已经在XCUIElement上构建了这个函数作为扩展,下面是示例代码:

代码语言:javascript
复制
    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调试日志对运行时的影响如此巨大,那么这种扩展又是如何进行的呢?作为开发人员,我们需要这些日志,但我们也不能让它像这样影响运行时。

EN

回答 1

Stack Overflow用户

发布于 2016-08-20 01:33:34

我找到了我问题的答案。似乎我的递归调用是在元素级别工作的,而我应该在ElementQuery级别工作。编写查询的速度要快得多,因为元素只解析一次,然后解析查询链。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39031916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档