我有一个类型为.Image
和类XCUIElement
的变量。像这样:
var image = app.descendantsMatchingType(.Image).elementAtIndex(0)
有没有办法可以提取实际图像,以便将其与其他图像进行比较?
我尝试过调用value
方法,但它返回一个字符串。将其转换为UIImage
始终会失败。
答案 0 :(得分:18)
我最近与Apple Developer Tools布道者讨论了这个问题。目前无法从图像视图,按钮等访问实际图像。同样,无法访问可能感兴趣的其他视图属性,例如" isHidden"我被告知UI测试团队的工程师对人们想要访问这些属性的用例感兴趣,因此对他们来说非常有帮助。或者" attributionText"等。对于想要此功能的其他人 - 如果您要在https://bugreport.apple.com
提交错误报告/功能请求作为关于"价值的提示" XCUIElement上的属性,至少现在这似乎映射到" accessibilityValue" XCUIElement引用的任何视图的属性。因此,如果您设置了您感兴趣的视图的accessibilityValue以包含您要验证的一些信息,那么这可能有助于测试。但有两点需要注意:
1)即使"值" XCUIElement的属性是" id"类型,accessibilityValue属性的类型是" NSString"。我不知道如果你试图将一些非字符串值(如图像)强制加入accessibilityValue然后尝试从"值"中检索它会发生什么。 XCUIElement的财产,但我怀疑它不会运作良好。部分原因是:
2)视频的accessibilityValue属性实际上由Apple的VoiceOver功能用于视障人士。当设置该值时,当用户点击该元素时,它将被大声读出(这就是为什么它应该是一个字符串)。
我还在这里讨论了无法通过XCUIElement访问视图属性的问题:http://www.danielhall.io/exploring-the-new-ui-testing-features-of-xcode-7
答案 1 :(得分:2)
我知道可能不是您要找的东西,但是我设法编写了一个测试来检查屏幕上UIImage
的视觉表示是否已更改。
我正在使用screenshot()
的{{1}}方法,该方法返回XCUIElement
的实例:
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 intented
XCTAssertNotEqual(screenshotBefore.pngRepresentation, screenshotAfter. pngRepresentation)
属性而不是pngRepresentation
对象来比较PNG表示很重要,因为两个对象在内部始终是不同的。
该技术无法测试屏幕上显示的图像是否确实需要,但至少可以检测到图像中的变化。