2016-10-30 13 views
0

Я пытаюсь сделать простой тест пользовательского интерфейса в приложении iOS. Я хотел бы заполнить textfield текстом, но всегда появляется ошибка.Fill TextField в UI Test Fails

Первая попытка:

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, симулятор Retina iPad, симулятор iPad 2. Пробовал только с Xcode 7 (8 разрывает проект)

Идеи? Заранее спасибо!

ответ

0

У меня нет ответа на вопрос, почему это происходит, но для любого будущего парня, у которого есть такая же проблема, это мой способ обхода, над которым я работаю.

Основная идея состоит в том, чтобы заставить клавиатуру отображаться, а затем ударить каждый отдельный ключ, мне нужно построить свою строку.

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() функция, которую я использую много в моих тестах. Он ждет существования элемента, и он забирает его. Если через десять секунд он не появится, пропустите тест.

testPlayground() краны текстовое поле, в котором я хочу писать, а затем вызывает type()

type() является основным. В принципе, посмотрите на каждый символ в строке и коснитесь его. Проблемы:

  1. Если я ищу символ H на клавиатуре, где сдвиг не активирован, он никогда не найдет заглавную букву. Мое решение состоит в том, чтобы загладить строку, но она работает только в определенных случаях. Это повышается

  2. Он не работает со специальными символами, где вы не можете его точно найти, но для имени ключа («пробел» вместо «»). Ну, здесь нет решения, кроме этого ужасного коммутационного футляра, но хорошо, потому что мне нужно это делать.

Надеюсь, это может помочь кому-то!