在 Xcode(7.2和7.3)中进行用户界面测试时,我的测试有时会因为一般性错误而失败:
断言失败:UI测试失败 - 获取元素
的属性失败
在元素上调用.hittable
或.tap()
时,我倾向于收到此错误,但我无法说明原因。我已经检查过,我处理的所有元素都已正确设置其可访问性设置,并且任何容器视图都没有启用accessibilty。唉,这似乎无法解决问题。
控制台日志显示:
UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x7e68ae50> pid: 89032, context: 4D9272C7-3024-4062-B0FA-E16EF426F17A, payload: {
pid = 89032;
"uid.elementID" = 1432;
"uid.elementOrHash" = 2125772976;
}: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202}
我已经尝试过搜索并设法找到它已经被记录但是似乎没有当前的解决方案(radar link),即使对于 Xcode 7.3也是如此。
似乎有时如果我重新启动模拟器/设备,这个错误并不会发生,但这不是一个很好的解决方案。
答案 0 :(得分:4)
您可以暂时使用XCUICoordinate.tap()
作为替代方案。例如,将button.tap()
替换为button.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap()
。
我遇到了同样的问题,解决方法对我有用。
答案 1 :(得分:3)
我有这个问题。它出现在一次修复后,所以我已经找到了可能导致这种情况的原因。
在我的应用程序中,我有'主'屏幕。它的内容从服务器返回并缓存在设备上。此屏幕将用户引导至不同的“详细”屏幕。每次用户从详细屏幕返回时,都会在主屏幕上调用viewDidAppeare
方法。在该方法中,主屏幕要求内容。要提供内容,“数据管理器”需要从数据库中提取或从服务器2以严格的顺序请求不同的实体,因此它使用dispatch_group
。主屏幕从dispatch_group_notify
调用接收有关新内容的通知,这就是它异步的原因。到了时间,当dispatch_group_notify
被执行时,viewDidAppeare
已经完成,据我所知,应用程序会闲置一段时间。 UI测试引擎可能已经创建了辅助功能元素树。
当出现这种情况并且测试代码在视图出现后立即在主屏幕上的某个元素上调用tap
时,旧的可访问性元素会死亡(因为视图层次结构已更改为该时间),但是{{1}调用具有特定tap
等元素的方法,该方法在当时不存在。结果你崩溃了。
答案 2 :(得分:2)
似乎自动化代码有时太快,虽然可访问性层次结构的快照包含您的元素,但您的查询移动速度太快而不能执行下一条指令,并且框架没有机会按照您要发送的tap()方法执行操作。我已经能够通过使用Joe Masilotti helper functions等待元素首先被击中,然后在点击相关元素之前添加sleep()来最小化此错误。 希望这会有所帮助。
答案 3 :(得分:2)
我也遇到过这个。在我的情况下,服务器快速连续返回多个预先搜索查询结果。目标元素快速弹出,但在最终查询之前不会始终如一。我通过XCTWaiter在最初的第一个查询中等待元素的存在来解决这个问题。然后进入睡眠以包含所有查询结果的时间,然后等待元素被击中。不要在第一个查询结果中使用hittable,因为这会失败,因为hittable还会检查是否可以点击元素,但UI的更改速度太快,无法点击该元素。
如果您只是为了测试目的或通过代码库触发最终查询,那会更好。我还考虑过使用UIPasteboard来避免多次类型查询,但据我所知,XCTest无法使用它。
答案 4 :(得分:0)
我从http://masilotti.com/xctest-helpers/尝试了waitForHittable(),但在我的情况下,我必须在点击之前使用sleep(秒)。
另外,不要认为Joe Masilotti的方法毫无用处。它们很棒,我在扩展XCTest和扩展XCUIElement中添加了它们。只是在我的应用程序的主屏幕加载后,waitForHittable()只是在第一次点击时没有工作。