使用UIAutomation单击键盘'Next'键

时间:2012-01-05 20:25:38

标签: iphone ios instruments ui-automation ios-ui-automation

我的应用中有一个搜索字段,我已将此字段的键盘返回键类型设置为UIReturnKeyNext。我正在尝试编写一个UIAutomation测试,点击键盘上的 Next 按钮,使用以下行:

UIATarget.localTarget().frontMostApp().mainWindow().keyboard().keys().firstWithName("next");

此调用失败,因为找不到名为“next”的键。我使用以下方法对我的应用中的所有元素进行了转储:

UIATarget.localTarget().frontMostApp().logElementTree();

这表明键盘上确实有一个名为“next”的键,但不知怎的,我上面显示的检索它的尝试仍然失败。然而,我可以使用此方法检索其他键(如字母'u'的键)。这里有一个已知的问题,或者我做错了什么?

我尝试了其他变种而没有运气:

UIATarget.localTarget().frontMostApp().mainWindow().keyboard().elements()["next"];

以下是我的UIAKeyboard中元素的截屏:

return key dump

5 个答案:

答案 0 :(得分:4)

如果您只想点击它,并且您知道键盘的“下一个”为“返回键”(在您的笔尖中定义),那么您可以使用它:

app.keyboard().typeString("\n");

答案 1 :(得分:2)

我没有测试的例子,但由于“下一步”按钮是UIAButton,而不是UIAKey,你可以试试:

UIATarget.localTarget().frontMostApp().mainWindow().keyboard().buttons()["next"];

如果它不起作用,您也可以尝试

UIATarget.localTarget().frontMostApp().mainWindow().keyboard().buttons()[4];

答案 2 :(得分:1)

以下适用于我:

UIATarget.localTarget().frontMostApp().mainWindow().keyboard().buttons().firstWi‌​thPredicate("name contains[c] 'next'"); 

答案 3 :(得分:1)

Jelle的方法对我有用。但是,如果有人需要,我也找到了另一种方法。

XCUIApplication().keyboards.buttons["return"].tap()

您可以在其中在每个UI测试会话上将XCUIApplication()创建为单例。关于这种方法的问题是,您现在可以区分returndone以及其他变体,甚至检查它们的存在。

您可以多做一些事情,如下所示:

extension UIReturnKeyType {
    public var title: String {
        switch self {
        case .next:
            return "Next"
        case .default:
            return "return"
        case .continue:
            return "Continue"
        case .done:
            return "Done"
        case .emergencyCall:
            return "Emergency call"
        case .go:
            return "Go"
        case .join:
            return "Join"
        case .route:
            return "Route"
        case .yahoo, .google, .search:
            return "Search"
        case .send:
            return "Send"
        }
    }
}

extension XCUIElement {
    func tap(button: UIReturnKeyType) {
        XCUIApplication().keyboards.buttons[button.title].tap()
    }
}

您可以像这样使用它:

let usernameTextField = XCUIApplication().textFields["username"]
usernameTextField.typeText("username")
usernameTextField.tap(button: .next)

答案 4 :(得分:0)

对我来说,键盘不属于View Hierarchy中的mainWindow()。当您从顶级logElementTree()时,它与mainWindow()处于同一级别。所以,你想要做的是:

UIATarget.localTarget().frontMostApp().keyboard().buttons()["next"];

当我试图按下"搜索"键盘上的按钮。