在我的测试中,我有一个带有预先存在的文本的文本字段。我想删除内容并输入新字符串。
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测试。如何解决这个问题才更普遍?
Toggle software keyboard
我写了一个扩展方法来为我做这件事,它非常快:
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")
app.textFields["Email"].clearAndEnterText("newemail@domain.com")