【问题标题】:Fill TextField in UI Test Fails在 UI 测试中填充 TextField 失败
【发布时间】:2016-10-30 18:32:59
【问题描述】:

我正在尝试在我的 iOS 应用程序中进行简单的 UI 测试。我想用一些文字填写textfield,但总是出现错误。

第一次尝试:

let searchField = app.textFields.elementBoundByIndex(0);
searchField.tap()
searchField.typeText("Holy Grail")

该字段被突出显示,键盘出现,几秒钟后,随机出现以下之一:

- Timed out waiting for IDE barrier message to complete
- failed to get attributes within 15.0s ui test
- failed to get snaphots within 15.0s ui test

第二次尝试:

func setText(text: String, application: XCUIApplication) {
    //Instead of typing the text, it pastes the given text.
    UIPasteboard.generalPasteboard().string = text
    doubleTap()
    application.menuItems["Paste"].tap()
}

...

let searchField = app.textFields.elementBoundByIndex(0);
searchField.tap()
searchField.setText("Holy Grail")

同样的结果。 尝试打开和关闭Connect Hardware Keyboard。 尝试使用 iPhone 6s 模拟器、iPad Retina 模拟器、iPad 2 模拟器。 仅使用 Xcode 7 尝试过(8 会破坏项目)

想法?提前致谢!

【问题讨论】:

    标签: ios xcode xcode7 xcode-ui-testing


    【解决方案1】:

    我不知道为什么会发生这种情况,但对于任何未来遇到我同样问题的人来说,这是我的解决方法,我正在努力解决。

    基本想法是让键盘出现,然后敲击我构建字符串所需的每一个键。

    func testPlayground() {
    
        let app = XCUIApplication()
        waitAndTap(app.textFields["MyTextField"])
        type(app, text: "hej")
    
    }
    
    func waitAndTap(elm: XCUIElement){
        let exists = NSPredicate(format: "exists == true")
        expectationForPredicate(exists, evaluatedWithObject: elm, handler: nil)
        waitForExpectationsWithTimeout(10.0, handler: nil)
        elm.tap()
    }
    
    
    func type(app: XCUIApplication, text : String){
        //Wait for the keyboard to appear.
        let k = app.keyboards;
        waitForContent(k, time: 10.0)
    
        //Capitalize the string.
        var s = text.lowercaseString;
        s.replaceRange(s.startIndex...s.startIndex, with: String(s[s.startIndex]).capitalizedString)
    
        //For each char I type the corrispondant key.
        var key: XCUIElement;
    
        for i in s.characters {
            if "0"..."9" ~= i ||  "a"..."z" ~= i || "A"..."Z" ~= i {
                // Then it's alphanumeric!
                key = app.keys[String(i)];
            }
            else {
                // Then is special character and is necessary re-map them.
                switch i {
                case "\n":
                    key = app.keys["Next:"]; // This is to generalize A LOT.
                default:
                    key = app.keys["space"];
                }
    
            }
    
            waitAndTap(key);
        }
    

    所以:waitAndTap() 是我在测试中经常使用的一个函数。它等待一个元素的存在并点击它。如果 10 秒后仍未出现,则测试失败。

    testPlayground() 点击我想写的文本字段,然后调用type()

    type() 是核心。基本上,查看字符串中的每个字符并点击它。问题:

    1. 如果我在未激活 shift 的键盘中查找字符 H,它将永远找不到大写字母。我的解决方案是将字符串大写,但它仅在特定情况下有效。这是可增强的

    2. 它不适用于特殊字符,您无法准确查找它,而是查找键的名称(“空格”而不是“”)。好吧,除了那个可怕的 switch-case 之外,这里没有解决方案,但是,对于我需要做的事情,它可以工作。

    希望这可以帮助别人!

    【讨论】:

      【解决方案2】:

      此方法允许您输入大写和小写字符串

      func enterUsername(username: String?) {
              guard
                  let input = username,
                  var previousCharaterIsLowerCase = input.first?.isUppercase else {
                      XCTFail("Username is not set")
                      return
              }
      
              for char in input {
                  if char.isUppercase && previousCharaterIsLowerCase {
                      // Switch on capslock
                      app.buttons["shift"].tap()
                      app.buttons["shift"].tap()
                  }
                  if char.isLowercase && previousCharaterIsLowerCase == false {
                      // Switch off capslock
                      app.buttons["shift"].tap()
                      app.buttons["shift"].tap()
                      app.buttons["shift"].tap()
                  }
                  previousCharaterIsLowerCase = char.isLowercase
                  app.keys[String(char)].tap()
              }
          }
      

      【讨论】:

        【解决方案3】:

        首先尝试禁用 I/O -> 硬件键盘,看看会发生什么。 如果还是不行

        而不是

        searchField.tap()
        searchField.typeText("Holy Grail")
        

        试试这个

                    app.keys["H"].tap()
                    app.keys["o"].tap()
                    app.keys["l"].tap()
                    app.keys["y"].tap()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-26
          • 2019-03-09
          • 2014-09-22
          • 1970-01-01
          • 2021-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多