【问题标题】:XCUIElement - Obtain Image valueXCUIElement - 获取图像值
【发布时间】:2015-09-23 21:36:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ios swift xctest xcode-ui-testing


    【解决方案1】:

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

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

    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

    【讨论】:

    • 这几乎概括了 UI 测试框架目前的局限性?您是否在现实世界中使用它来实际提供任何价值?
    • @Petar 是的,目前对我来说,限制/不支持的案例似乎超过了支持的案例。我认为使用可访问性来“以最终用户显示的方式”公开信息的基本方法在很多方面都很好,但使得访问 UIImage 之类的事情变得非常困难。至于我,我用它写了一些有价值的测试,但最终还是要坚持使用 KIF 或 Calabash,因为有太多的测试无法用 Xcode UITesting 编写,我不确定安装和维护 2 个不同的 UITesting 框架是值得的。
    • 没错。我试图做一个非常简单的测试来检查 UIButton 是否有selected == YES ...很快我意识到我做不到。然后我想做一个测试,看看我的 ViewController 是否显示了相关的视图(因为我可以在几个视图之间切换)——同样不可能。希望 Apple 解决这个问题,因为您在文章中提到的框架似乎很有希望。请问您究竟是如何使用 Calabash 进行 UI 测试的?谢谢
    • 当前未使用,但我从事的最后一个项目进行了 Calabash 测试以验证 1) 导航到每个屏幕 2) 根据用户是否登录是否存在各种 UI 元素 3) 颜色以及基于某些数据的存在或由于用户操作而对 UI 元素进行的其他视觉更改。
    • 澄清:NSObject 属性accessibilityValue 映射到XCUIElement 属性value,如NSString。令人误解的是,更符合逻辑的XCUIElement 属性accessibilityValue 始终是nil。此外,为了使UIImageView 可以访问,isAccessibilityElement 属性需要设置为YES。要使UIImage(非UIView)可以访问,需要通过UIAccessibilityContainer协议上报。
    【解决方案2】:

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

    我正在使用XCUIElementscreenshot() 方法,它返回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 对象,因为这两个对象在内部总是不同的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多