Uitextfield Xcode UI测试-使用typeText()方法和自动更正键入文本

Uitextfield Xcode UI测试-使用typeText()方法和自动更正键入文本,uitextfield,ios9,xctest,xcode-ui-testing,Uitextfield,Ios9,Xctest,Xcode Ui Testing,我有一个如下的测试: let navnTextField = app.textFields["First Name"] let name = "Henrik" navnTextField.tap() navnTextField.typeText("Henrik") XCTAssertEqual(navnTextField.value as? String, name) 问题是,由于系统设置,默认情况下,我的iPhone模拟器具有波兰键盘,并且“Henrik”通过自动更正自动更改为“ha” 简单

我有一个如下的测试:

let navnTextField = app.textFields["First Name"]
let name = "Henrik"
navnTextField.tap()
navnTextField.typeText("Henrik")
XCTAssertEqual(navnTextField.value as? String, name)
问题是,由于系统设置,默认情况下,我的
iPhone模拟器
具有波兰键盘,并且“Henrik”通过自动更正自动更改为“ha”

简单的解决方案是从iOS设置中删除波兰键盘。然而,这个解决方案并不能解决问题,因为
iphonesimulator
可以重置,然后测试将再次失败


是否有任何方法可以在测试用例之前设置自动更正,或者以其他方式将文本输入到文本字段

使用UIPasteboard提供输入文本有一个变通方法:

let navnTextField = app.textFields["First name"]
navnTextField.tap()
UIPasteboard.generalPasteboard().string = "Henrik"
navnTextField.doubleTap()
app.menuItems.elementBoundByIndex(0).tap()
XCTAssertEqual(navnTextField.value as? String, name)
你可以查一下

编辑

为了更好的可读性,请改为
app.menuItems.elementBoundByIndex(0).tap()

您可以执行
app.menuItems[“粘贴”].tap()

下面是XUIElement上的一个小扩展来完成此操作

extension XCUIElement {
    // The following is a workaround for inputting text in the 
    //simulator when the keyboard is hidden
    func setText(text: String, application: XCUIApplication) {
        UIPasteboard.generalPasteboard().string = text
        doubleTap()
        application.menuItems["Paste"].tap()
    }
}
它可以这样使用

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText("John Doe", app)
  • @Apan的实施功不可没

对于swift v3,需要使用新的sintax(由@mike回答):

并使用它:

let app = XCUIApplication()
let enterNameTextField =  app.otherElements.textFields["Enter Name"]
enterNameTextField.tap()
enterNameTextField.setText(text: "John Doe", application: app)
调整:

  • 所以扩展是在应用上的,这对我来说更有意义
  • 现有字段内容将被清空
  • 代码:

    运行时使用:

    self.app?.setText("Lo", on: self.app?.textFields.firstMatch)
    

    目前在Xcode 10上使用Swift 4 您现在可以像这样使用
    typeText(String)
    
    让app=xguiapplication()
    让usernameTextField=app.textFields[“Username”]
    usernameTextField.typeText(“Caseyp”)
    

    doubleTap()如果文本已在此文本字段中,则可能会出现问题,因为ti将选择部分文本只有在点击、doubleTap和粘贴之间插入任意延迟时,此功能才对我有效。我想这可能是一种表演?我的模拟器运行得太慢,跟不上所有的点击?考虑到从Xcode 11开始IDE的状态,这是一个更合适的答案。。。。。
    extension XCUIApplication {
          // The following is a workaround for inputting text in the
          //simulator when the keyboard is hidden
          func setText(_ text: String, on element: XCUIElement?) {
            if let element = element {
            UIPasteboard.general.string = text
            element.doubleTap()
            self.menuItems["Select All"].tap()
            self.menuItems["Paste"].tap()
            }
          }
        }
    
    self.app?.setText("Lo", on: self.app?.textFields.firstMatch)