小编典典

UI测试删除文本字段中的文本

swift

在我的测试中,我有一个带有预先存在的文本的文本字段。我想删除内容并输入新字符串。

let textField = app.textFields
textField.tap()
// delete "Old value"
textField.typeText("New value")

用硬件键盘删除字符串时,录音对我来说什么都没有产生。用软件键盘做完同样的事情后,我得到了:

let key = app.keys["Usuń"] // Polish name for the key
key.tap()
key.tap() 
... // x times

要么

app.keys["Usuń"].pressForDuration(1.5)

我担心自己的测试取决于语言,因此我为受支持的语言创建了以下内容:

extension XCUIElementQuery {
    var deleteKey: XCUIElement {
        get {
            // Polish name for the key
            if self["Usuń"].exists {
                return self["Usuń"]
            } else {
                return self["Delete"]
            }
        }
    }
}

在代码中看起来更好:

app.keys.deleteKey.pressForDuration(1.5)

但是非常脆弱。从模拟器退出后,Toggle software keyboard被重置,并且我的测试失败。我的解决方案不适用于CI测试。如何解决这个问题才更普遍?


阅读 313

收藏
2020-07-07

共1个答案

小编典典

我写了一个扩展方法来为我做这件事,它非常快:

extension XCUIElement {
    /**
     Removes any current text in the field before typing in the new value
     - Parameter text: the text to enter into the field
     */
    func clearAndEnterText(text: String) {
        guard let stringValue = self.value as? String else {
            XCTFail("Tried to clear and enter text into a non string value")
            return
        }

        self.tap()

        let deleteString = String(repeating: XCUIKeyboardKey.delete.rawValue, count: stringValue.count)

        self.typeText(deleteString)
        self.typeText(text)
    }
}

然后可以很容易地使用它:
app.textFields["Email"].clearAndEnterText("newemail@domain.com")

2020-07-07