在新模拟器上 运行 时关闭 iOS 13 键盘教程

Dismiss iOS 13 keyboard tutorial when running on a fresh simulator

我正在使用 Xcode 11 & iOS 13 作为 UI 测试工作流程的一部分,但是当我第一次使用键盘时,会出现以下内容并通过阻止键盘来中断测试:

UI 测试中的调用代码:

app.textFields.element(boundBy: 0).tap()

模拟器显示的内容:

因为这会挡住按键,所以我的测试会失败。不过,下次我运行在同一个模拟器上测试,就可以正常工作了。

我找到了一个解决方案,既适用于遇到上述情况,也适用于不存在的后续运行。

let continueButton = app.buttons["Continue"]
if continueButton.exists {
    continueButton.tap()
}

第一行尝试定位标题为"Continue"的按钮,然后在第二行继续验证该按钮是否存在。如果它确实存在,它将 tap() 关闭提示。

CodeBender 的回答很好,引导了正确的路径,但无法编译,因为 continue 是 Swift 中的保留关键字。另外,最好等待一小段时间让键盘出现。

    // Sometimes the Apple Keyboard shows some sort of "Swipe" tutorial. Dismiss it!
    private func begoneSwipeTutorial(app: XCUIApplication) {
        let continueButton = app.buttons["Continue"]
        if continueButton.waitForExistence(timeout: 2.0) {
            continueButton.tap()
        }
    }

    // Then use like this
    func inputTextWhatever(app: XCUIApplication, element: XCUIElement) {
        element.tap()
        begoneSwipeTutorial(app: app)
        // Do whatever you need to do
    }

为了避免可能有多个带有 Continue 标签的按钮时发生冲突,我使用了这种方法:

func dismissKeyboardTutorialIfNeeded() {
    let predicate = NSPredicate { (evaluatedObject, _) in
        return (evaluatedObject as? XCUIElementAttributes)?.identifier == "UIContinuousPathIntroductionView"
    }
    let keyboardTutorialView = app.windows.otherElements.element(matching: predicate)
    if keyboardTutorialView.exists {
        keyboardTutorialView.buttons["Continue"].tap()
    }
}

当我在 iOS 13-15 上进行测试时,它运行良好,无需额外等待 tuturial 视图存在,但旧设备可能需要它。