我的应用中有一个搜索字段,我已将此字段的键盘返回键类型设置为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中元素的截屏:
答案 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().firstWithPredicate("name contains[c] 'next'");
答案 3 :(得分:1)
Jelle的方法对我有用。但是,如果有人需要,我也找到了另一种方法。
XCUIApplication().keyboards.buttons["return"].tap()
您可以在其中在每个UI测试会话上将XCUIApplication()创建为单例。关于这种方法的问题是,您现在可以区分return
和done
以及其他变体,甚至检查它们的存在。
您可以多做一些事情,如下所示:
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"];
当我试图按下"搜索"键盘上的按钮。