XCUIElement - 获取图像值

Sal*_*ler 17 ios xctest swift xcode-ui-testing

我有一个类型.Image和类的变量XCUIElement.像这样的东西:

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

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

我试过caling value方法,但它返回一个字符串.将它投射到UIImage总是失败.

Dan*_*all 19

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

作为关于XCUIElement上的"value"属性的提示,至少现在这似乎映射到XCUIElement正在引用的任何视图的"accessibilityValue"属性.因此,如果您设置了您感兴趣的视图的accessibilityValue以包含您有兴趣验证的一些信息,那么这可能有助于测试.但要注意两件事:

1)即使XCUIElement的"value"属性是"id"类型,accessibilityValue属性的类型也是"NSString".我不知道如果你试图强制一些非字符串值(如图像)到accessibilityValue然后尝试从XCUIElement的"value"属性中检索它会发生什么,但我怀疑它不会很好.部分原因是:

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

我还在这里讨论了无法通过XCUIElement访问视图属性的问题:http://www.danielhall.io/exploring-the-new-ui-testing-features-of-xcode-7

  • @Petar是的,限制/不支持的案例似乎比我目前支持的案例多.我认为使用可访问性来揭示信息"从最终用户看起来的方式"的基本方法在很多方面都很好,但是使得访问UIImage非常困难.至于我,我用它来编写一些有价值的测试,但最终,我必须坚持使用KIF或Calabash,因为有太多的测试不能用Xcode UITesting编写,我不确定安装和维护2个不同的UITesting框架是值得的. (2认同)

Vad*_*aev 6

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

我正在使用一种screenshot()方法,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 intended
XCTAssertNotEqual(screenshotBefore.pngRepresentation, screenshotAfter.pngRepresentation)
Run Code Online (Sandbox Code Playgroud)

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

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

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