【问题标题】:How do I assert that a text field is empty?如何断言文本字段为空?
【发布时间】:2022-01-26 17:38:28
【问题描述】:

我的 UI 上有一个空文本字段,尽管它在情节提要中设置了占位符文本(其值为 foo)。在我的 UI 测试中,我试图检查它的文本值是否开始为空,但是当我查询它的值时,它似乎给了我占位符值:

func testTextFieldInitiallyEmpty {
  let input = XCUIApplication().textFields["My Text Field"]
  XCTAssertEqual(input.value as! String, "")
}

因为测试失败并显示此消息:

XCTAssertEqual 失败:("foo") 不等于 ("")

当然,foo 是占位符值,但不是该文本字段的文本值。如果我写的话,我会预料到该错误消息:

XCTAssertEqual(input.placeholderValue as! String, "")

input 是一个XCUIElement,它实现了XCUIElementAttributes,所以我看不出还有什么可以解决这个问题的。

如何检查(断言)文本字段是否为空?

编辑

在做了一些进一步的研究并尝试了以下关于使用accessibilityValuelabeltitleinput 属性的建议后,我还没有找到任何可以为我提供文本字段的解决方案有文本时为文本值,只有占位符可见时为空字符串。

这似乎是 (a) 一个错误,或者 (b) 来自测试框架的有问题的设计决定,即不提供该功能。至少,XCUIElementAttributes#value 的文档对我来说似乎不够,因为唯一的细节是:

值的确切类型因元素类型而异。

仍在寻找更好的解决方案...

【问题讨论】:

    标签: ios swift xcuitest


    【解决方案1】:

    除了检查空白字符串之外,您还可以与 XCUIElementAttributes 的 placeholderValue 变量进行比较

    extension XCUIElement {
        func noTextEntered() -> Bool {
            return self.value as? String != "" && self.value as? String != placeholderValue
        }
    }
    

    然后你可以运行XCAssert(input.noTextEntered(), "Unexpected text entered into field")

    只需确保您的占位符不是用户输入的内容。这样您就不必硬编码占位符值来检查

    【讨论】:

    • 是的,这是有道理的,但是“只要确保您的占位符不是用户会输入的内容”是一个不幸的要求,我希望可以避免
    • 我完全同意你的看法。我自己也有这个问题,并考虑为 .value 提交 Apple 雷达票以忽略占位符文本
    【解决方案2】:

    有点荒谬的是,这实际上是有效的,它需要一个解决方法。 无论如何,我的解决方案是根据@Jason 的回答获得没有占位符干扰的值。

    extension XCUIElement {
        var valueWithoutPlaceholder: String {
            if let v = value as? String, v != placeholderValue {
                return v
            }
            return ""
        }
    }
    

    请注意,如果输入实际上是占位符,则会中断!

    【讨论】:

      【解决方案3】:

      尝试使用inputaccessibilityValue 属性。

      func testTextFieldInitiallyEmpty {
        let input = XCUIApplication().textFields["My Text Field"]
        XCTAssertEqual(input.accessibilityValue, "")
      }
      

      如果你命令+单击属性,你可以看到以下..

          /*
           Returns a localized string that represents the value of the element, such as the value 
           of a slider or the text in a text field. Use only when the label of the element
           differs from a value. For example: A volume slider has a label of "Volume", but a value of "60%".
           default == nil
           default on UIKit controls == values for appropriate controls 
           Setting the property will change the value that is returned to the accessibility client.  
           */
          public var accessibilityValue: String?
      

      【讨论】:

      • 这真的有效吗?我一直无法验证这一点。 accessibilityValue 即将回归 nil
      • @akivajgordon 为什么不尝试在文本字段中输入一些默认值并检查?请让我知道它是否有效..
      • 我确实在文本字段中设置了一个默认值,但accessibilityValue 仍然出现nil
      • @akivajgordon 你能检查input 对象或titlelabel 属性吗?
      • 这就是我最终要做的,但我不喜欢它。这对我的口味来说太hacky了。无论如何,感谢您对此的帮助。
      猜你喜欢
      • 2011-02-18
      • 2017-10-20
      • 2016-06-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2020-07-21
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多