Ios UI测试中的填充文本字段失败

Ios UI测试中的填充文本字段失败,ios,xcode,xcode7,xcode-ui-testing,Ios,Xcode,Xcode7,Xcode Ui Testing,我正在尝试在我的iOS应用程序中进行一个简单的UI测试。我想用一些文本填充文本字段,但总是出现错误 第一次尝试: let searchField = app.textFields.elementBoundByIndex(0); searchField.tap() searchField.typeText("Holy Grail") 该字段高亮显示,键盘出现,几秒钟后,随机选择其中一个: - Timed out waiting for IDE barrier message to complet

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

第一次尝试:

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")
同样的结果。 尝试打开和关闭
连接硬件键盘。
用iphone6s模拟器、ipadretina模拟器、ipad2模拟器试用。
仅使用Xcode 7尝试(8将破坏项目)


想法?提前谢谢

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

基本的想法是让键盘出现,然后点击我需要的每个键来构建我的字符串

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()
是我在测试中经常使用的函数。它等待一个元素的存在并点击它。如果在十秒钟内没有显示,则测试失败

testplayway()
点击要写入的文本字段,然后调用
type()

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

  • 如果我在未激活shift的键盘中查找字符H,它将永远找不到大写字母。我的解决方案是将字符串大写,但它只适用于特定情况。这是可以增强的

  • 它不适用于特殊字符,您无法准确地查找它,而是查找键的名称(“空格”而不是“”)。好吧,这里没有解决办法,除了那个可怕的开关情况,但好吧,对于我需要做的事情,它是有效的


  • 希望这能帮助别人

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

    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()
            }
        }
    

    首先尝试禁用I/O->硬件键盘,看看会发生什么。 如果仍然不工作

    而不是

    searchField.tap()
    searchField.typeText("Holy Grail")
    
    试试这个

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