- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试构建一个 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/
我正在使用 Xcode 7.2.1,并且我已经为我的代码编写了一些单元测试用例。我的代码编译并成功运行,但当我开始测试时,它失败了。 代码如下: if let params = item["param
也许我误解了查询和 xcuielements 的工作原理,但我想遍历查询的结果。 在我的应用程序中,我在应用程序的屏幕上发送了两次短信号码/收到了短信号码。我想检查两个数字是否相同。例如,以下文本显示
我有一个类型为 .Image 和类 XCUIElement 的变量。像这样: var image = app.descendantsMatchingType(.Image).elementAtInde
在我的 UI 测试中,我有这个 XCUIElement : XCUIApplication().staticTexts["提交订单"] 当我打印 debugDescription 时: po prin
在我的 UI 测试中,我使用(缩短)以编程方式创建 UIView let topMarker = UIView.init(frame: CGRect.init()) … topMarker.acces
我在 Xcode 11.1 上观察到 XCUITest 的奇怪行为。我只有一个带有两个 UITextField 的 Storyboard,两个 UITextField 都带有可访问性标识符集。我想在两
在 Swift 中使用 UITextfield 类,您可以执行如下功能: private func signIn() { if emailTextField.text?.charact
在 iOS UITests 上工作时,我发现了 XCUIElement有一个属性,identifier , 这是面对 XCUIElementAttributes .当我调试时,我发现这是一个真正的属性
iOS UITesting时,如何区分两个不同的XCUIElement? 例如,我有两个不同的 UIButton 具有相同的标签字符串“Button”。如何检查它们是否不同? XCUIElement
我的一个屏幕有多个文本字段,我可以从不同的其他屏幕登陆到这个屏幕。在每种情况下,我都会将一个或另一个文本字段作为第一响应者。我无法编写测试来确定所需的文本字段是否具有焦点。 当我在控制台中打印文本字段
背景: 我正在使用 XCode GM 在 iOS 9.0 中进行用户界面级别测试。 问题: XCode GM 中是否有一个命令可以让您看到可访问元素及其关系的“树”?类似于 Appium 中的“页面”
我有一个非常简单的 XCTestCase 实现,它测试按钮上的点击并期望出现 Alert Controller 。问题是 tap() 方法不起作用。在关联按钮的 IBAction 中放置一个断点,我意
在我的 UI 测试中,一些 XCUIElement 的 frame 属性被发现,但不是其他人。 下面使用的可访问性标识符在 Storyboard中设置,app在 setUp() 中初始化如XCUIAp
我正在尝试为我的 iOS 应用程序编写 UI 测试。出于某种原因,我无法点击我的自定义表格 View 单元格。我正在尝试这样做: let app = XCUIApplication() let sta
在 iOS、UITest 上工作时,我如何检测特定的 XCUIElement 是否已被点击? 例如, let app = XCUIApplication() let button1 = app.tab
我创建了一个辅助类 SignUpSetUp 以便登录我的应用程序而不是重复使用代码。在这个类中,我有一个私有(private)函数 waitForElementToAppear 来等待测试套件中的元素
在尝试在 Swift 中实现新的 UI 测试时,我尝试通过以下方式设置文本字段的值: app.textFields["field_name"].setValue(value, forKey: "any
这是我尝试在终端窗口中输入 po print(XCUIApplication().debugDescription) 时打印应用程序的元素结构时的示例 tables, (address code li
我一直在使用这种方法定位 XCUIElements: app.staticTexts["Full Label Text"] 但是如果我只知道标签文本的一部分怎么办?部分标签文本是动态生成的(例如“It
我想找到一个 UIView XCUIElement,但我似乎找不到它。这个 UIView 用于向用户显示某些信息,我需要能够测试它在某些情况下是否在屏幕上。我将 view.userInteractio
我是一名优秀的程序员,十分优秀!