如何在UI测试期间在Swift应用程序中隐藏键盘

lei*_*zeQ 20 testing user-interface ios swift xcode-ui-testing

我刚开始在XCode 7中进行UI测试并遇到了这个问题:

我需要在文本字段中输入文本然后单击按钮.不幸的是,这个按钮隐藏在键盘后面,在将文本输入文本字段时出现.XCode正在尝试滚动以使其可见但我的视图不可滚动因此失败.

我目前的解决方案是:

let textField = app.textFields["placeholder"]
textField.tap()
textField.typeText("my text")
app.childrenMatchingType(.Window).elementBoundByIndex(0).tap() // hide keyboard
app.buttons["hidden button"].tap()
Run Code Online (Sandbox Code Playgroud)

我可以这样做,因为我的ViewController正在拦截触摸:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    view.endEditing(false)
    super.touchesBegan(touches, withEvent: event)
}
Run Code Online (Sandbox Code Playgroud)

我对我的解决方案并不满意,在UI测试期间有没有其他方法可以隐藏键盘?

bbj*_*jay 20

如果您已设置文本字段以在委托方法中重新签名FirstResponder(通过textField.resignFirstResponder()self.view.endEditing(true))textFieldShouldReturn(),那么

textField.typeText("\n")
Run Code Online (Sandbox Code Playgroud)

会做的.

  • 我只是在发送到文本字段的字符串末尾添加了“\n”,它就像魔术一样工作。谢谢。 (2认同)

Cod*_*der 6

使用 Swift 4.2,您现在可以使用以下代码片段来完成此任务:

let app = XCUIApplication()
if app.keys.element(boundBy: 0).exists {
    app.typeText("\n")
}
Run Code Online (Sandbox Code Playgroud)


小智 5

基于对Joe的博客提出的问题,我遇到了一个问题,即在模拟器上运行几次后,键盘无法使用这段代码隐藏:

XCUIApplication().keyboard.buttons["Hide keyboard"]
Run Code Online (Sandbox Code Playgroud)

所以,我改成了:(谢谢乔)

XCUIApplication().keyboard.buttons["Hide keyboard"]
let firstKey = XCUIApplication().keys.elementBoundByIndex(0)
if firstKey.exists {
   app.typeText("\n")
}
Run Code Online (Sandbox Code Playgroud)

我在这里尝试做的是在点击隐藏按钮后检测键盘是否仍然打开,如果它已经打开,我键入一个"\n",在我的情况下也会关闭键盘.

这也很棘手,因为有时模拟器失去了键盘输入的焦点,这可能会使测试失败,但根据我的经验,失败率低于我采取的其他方法.

我希望这可以提供帮助.


Cha*_*man 5

我总是使用它来以编程方式在Swift UITesting中隐藏键盘:

XCUIApplication().keyboards.buttons["Hide keyboard"].tap()
Run Code Online (Sandbox Code Playgroud)


reu*_*sey 5

XCUIApplication().toolbars.buttons["Done"].tap()
Run Code Online (Sandbox Code Playgroud)

  • 不适用于所有模拟器。我的测试适用于 iPhone 6 和 7,但不适用于 iPhoneX。 (2认同)
  • 如果键盘没有“完成”,即小键盘,也不起作用。 (2认同)

tri*_*ode 5

Swift 5 辅助函数

func dismissKeyboardIfPresent() {
    if app.keyboards.element(boundBy: 0).exists {
        if UIDevice.current.userInterfaceIdiom == .pad {
            app.keyboards.buttons["Hide keyboard"].tap()
        } else {
            app.toolbars.buttons["Done"].tap()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 无法获取匹配快照:未从输入中找到后代匹配类型工具栏的匹配项 {( (7认同)

Aar*_*aer 3

您问题的答案不在于您的测试代码,而在于您的应用程序代码。如果用户无法使用屏幕上的软件键盘输入文本,然后点击按钮,您应该让测试关闭键盘(用户必须这样做,才能点击按钮)或使视图可滚动。