【问题标题】:Xcode UI Testing - typing text with typeText() method and autocorrectionXcode UI 测试 - 使用 typeText() 方法和自动更正输入文本
【发布时间】:2015-12-19 03:29:51
【问题描述】:

我有一个如下测试:

let navnTextField = app.textFields["First Name"]
let name = "Henrik"
navnTextField.tap()
navnTextField.typeText("Henrik")
XCTAssertEqual(navnTextField.value as? String, name)

问题是默认情况下我的iPhone Simulator 有波兰语键盘,因为系统设置和“Henrik”通过自动更正自动更改为“ha”。

简单的解决方案是从iOS Settings 中删除波兰语键盘。然而,这个解决方案并没有解决问题,因为iPhone Simulator 可以被重置,然后测试将再次失败。

有没有办法在测试用例之前设置自动更正或以其他方式将文本输入到文本字段。

【问题讨论】:

    标签: uitextfield ios9 xctest xcode-ui-testing


    【解决方案1】:

    有一种解决方法可以使用 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)
    

    您可以查看link with description as a workaround for secure input in GM

    编辑

    为了更好的可读性而不是app.menuItems.elementBoundByIndex(0).tap() 你可以做app.menuItems["Paste"].tap()

    【讨论】:

      【解决方案2】:

      这是 XCUIElement 上的一个小扩展来完成此操作

      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 的实施

      【讨论】:

      • doubleTap() 如果文本已经在此文本字段中,可能会出现问题,因为 ti 会选择部分文本
      • 这仅适用于我在点击、双击和粘贴之间插入任意延迟的情况。我想这可能是一个性能问题?我的模拟器运行速度太慢,跟不上所有的水龙头?
      【解决方案3】:

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

      extension XCUIElement {
          func setText(text: String?, application: XCUIApplication) {
              tap()
              UIPasteboard.general.string = text
              doubleTap()
              application.menuItems.element(boundBy: 0).tap()
          }
      }
      

      并使用它:

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

      【讨论】:

        【解决方案4】:

        调整:

        1. 所以扩展正在申请中,这对我来说更有意义
        2. 现有字段内容被清空

        代码:

        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)
        

        【讨论】:

          【解决方案5】:

          目前在 Xcode 10 上使用 Swift 4 你现在可以像这样使用typeText(String) let app = XCUIApplication() let usernameTextField = app.textFields["Username"] usernameTextField.typeText("Caseyp")

          【讨论】:

          • 考虑到 Xcode 11 的 IDE 状态,这是一个更合适的答案.....
          猜你喜欢
          • 2016-06-14
          • 2021-02-09
          • 1970-01-01
          • 2016-01-28
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          • 2015-12-13
          • 2011-01-12
          相关资源
          最近更新 更多