XCUIElement - 获取图像值

问题描述 投票:13回答:2

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

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

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

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

ios swift xctest xcode-ui-testing
2个回答
18
投票

我最近与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


2
投票

我知道这可能不是你想要的,但我设法编写了一个测试,检查屏幕上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 intented
XCTAssertNotEqual(screenshotBefore.pngRepresentation, screenshotAfter. pngRepresentation)

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

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

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

热门问题
推荐问题
最新问题