19

.Image我有一个 type和 class的变量XCUIElement。像这样的东西:

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

有没有办法可以提取实际图像,以便将其与另一张图像进行比较?

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

4

2 回答 2

21

我最近与 Apple Developer Tools 的布道者就此进行了交谈。目前无法从图像视图、按钮等访问实际图像。同样,也无法访问可能感兴趣的视图的其他属性,例如“isHidden”或“attributedText”等。我是告诉 UI 测试团队的工程师对人们想要访问这些属性的用例感兴趣,所以这对他们和其他想要这个功能的人来说都是非常有帮助的——如果你愿意的话在https://bugreport.apple.com提交错误报告/功能请求

作为关于 XCUIElement 上的“value”属性的提示,至少现在这似乎映射到 XCUIElement 引用的任何视图的“accessibilityValue”属性。因此,如果您将感兴趣的视图的可访问性值设置为包含一些您有兴趣验证的信息,那么这可能有助于测试。不过要注意两点:

1) 即使 XCUIElement 的“value”属性是“id”类型,accessibilityValue 属性的类型也是“NSString”。我不知道如果您尝试将一些非字符串值(如图像)强制转换为可访问性值,然后尝试从 XCUIElement 的“值”属性中检索它会发生什么,但我怀疑它不会很好地工作。部分原因是:

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

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

于 2015-07-06T16:48:53.917 回答
8

我知道它可能不是您正在寻找的东西,但我设法编写了一个测试来检查UIImage屏幕上 a 的视觉表示是否发生了变化。

我正在使用一种返回以下实例的screenshot()方法:XCUIElementXCUIScreenshot

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)

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

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

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

于 2019-04-02T21:00:41.867 回答