XCUIElement - 获取图像值

XCUIElement - Obtain Image value

我有一个类型为 .Image 和 class XCUIElement 的变量。像这样:

var image = app.descendantsMatchingType(.Image).elementAtIndex(0)

有什么方法可以提取实际图像以便与另一幅图像进行比较?

我试过调用 value 方法,但它 returns 是一个字符串。将其转换为 UIImage 总是失败。

我最近与 Apple Developer Tools 传播者就此进行了交谈。目前无法从图像视图、按钮等访问实际图像。同样,也无法访问可能感兴趣的视图的其他属性,如 "isHidden" 或 "attributedText",等等。有人告诉我,UI 测试团队的工程师对人们想要访问这些属性的用例很感兴趣,所以这将非常有帮助——无论是对他们还是对其他人想要此功能 - 如果您要在 https://bugreport.apple.com

提交错误报告/功能请求

关于 XCUI 元素上的 "value" 属性 的提示,至少目前这似乎映射到 "accessibilityValue" 属性 XCUIElement 引用的任何视图。因此,如果您将您感兴趣的视图的 accessibilityValue 设置为包含您有兴趣验证的一些信息,那么这可能有助于测试。不过需要注意两件事:

1) 尽管 XCUI 元素的 "value" 属性 是 "id" 类型,但 accessibilityValue 属性 的类型是 "NSString"。我不知道如果您尝试将一些非字符串值(如图像)强制放入 accessibilityValue 然后尝试从 XCUI 的 "value" 属性 中检索它会发生什么元素,但我怀疑它不会很好地工作。部分原因是:

2) 视图的 accessibilityValue 属性 实际上被 Apple 的 VoiceOver 功能用于视障人士。设置值后,当用户点击该元素时,它会被大声读出(这就是为什么它应该是一个字符串)。

我还在此处详细介绍了无法通过 XCUIElement 访问视图属性的问题:http://www.danielhall.io/exploring-the-new-ui-testing-features-of-xcode-7

我知道这可能不是您要查找的内容,但我设法编写了一个测试来检查 UIImage 在屏幕上的视觉表示是否已更改。

我正在使用 XCUIElementscreenshot() 方法,其中 returns 是 XCUIScreenshot 的一个实例:

let myImage = XCUIApplication().images["myAccessibilityIdentifier"]
let screenshotBefore = myImage.screenshot()
//...
//do some actions that change the image being displayed
//...
let screenshotAfter = myImage.screenshot()

//Validating that the image changed as intended
XCTAssertNotEqual(screenshotBefore.pngRepresentation, screenshotAfter.pngRepresentation)

屏幕截图将是屏幕上呈现的图像大小,当然可能与原始图像不同。

重要的是使用 pngRepresentation 属性 比较 PNG 表示,而不是 XCUIScreenshot 对象,因为这两个对象在内部总是不同的。

此技术无法测试屏幕上显示的图像是否正是所需要的,但至少可以检测图像中的变化。