2015-10-01 11 views
6

W ramach moich testów interfejsu użytkownika generuję losowy ciąg znaków jako tytuły dla moich obiektów. Problem polega na tym, że kiedy ten tytuł jest wprowadzany za pomocą klawiatury (używając XCUIElement.typeText()), iOS czasami akceptuje automatycznie sugerowaną wartość.Jak wyłączyć autouzupełnianie podczas uruchamiania testów Xcode UI?

Na przykład, mogę chcieć, aby wpisał automatycznie wygenerowany ciąg "calg", ale auto poprawny wybierze zamiast tego "cielę". Kiedy próbuję później szukać tej wartości za pomocą asercji, nie istnieje i nie powiedzie się niepoprawnie.

Czy istnieje sposób, aby powiedzieć testom interfejsu użytkownika, że ​​nie powinny używać automatycznej poprawności lub czy istnieje obejście, którego można użyć?

Odpowiedz

4

Jeśli nie potrzebujesz autosugestii do jakichkolwiek scenariuszy testowych, czy próbowałeś wyłączyć automatyczną korektę w ustawieniach urządzenia/symulatora.

Ustawienia-> Ogólne -> Klawiatura -> Automatyczna korekcja

+1

To jest miłe dla miejscowego testu. Jednak nie działa w przypadku CI. –

+0

Po prostu próbowałem znaleźć obejście tego problemu, ale nie mogłem znaleźć żadnego. Sądzę, że rozsądnym rozwiązaniem jest to, że wszyscy dostawcy CI powinni skonfigurować swoje symulatory z automatycznym wyłączeniem domyślnie na krótki okres, więc zachęcamy do kontaktu z nimi, jestem pewien, że ci pomogą. Firma Apple oferuje jednak rozwiązanie tego problemu (np. Opcję w Xcode w ramach schematu), dlatego warto opublikować zapytanie o funkcję za pośrednictwem zgłaszania błędów. Im więcej osób, tym bardziej prawdopodobne, że zostanie wdrożony. – Dschee

5

nie wierzę można wyłączyć automatyczną korektę poprzez kod z tarczy UI Testing.

Można jednak wyłączyć dla indywidualnego widoku tekstu z kodu produkcyjnego. Aby upewnić się, że automatyczna korekta jest nadal włączona podczas uruchamiania i wysyłania aplikacji, jednym rozwiązaniem byłaby podklasa UITextField i włączenie zmiennej środowiskowej.

Najpierw skonfiguruj swój test interfejsu użytkownika, aby ustawić właściwość launchEnvironment na .

class UITests: XCTestCase { 
    let app = XCUIApplication() 

    override func setUp() { 
     super.setUp() 
     continueAfterFailure = false 
     app.launchEnvironment = ["AutoCorrection": "Disabled"] 
     app.launch() 
    } 

    func testAutoCorrection() { 
     app.textFields.element.tap() 
     // type your text 
    } 
} 

Następnie podklasa (i wykorzystanie) UITextField szukać tej wartości w słowniku środowiska procesu wywołującego tę funkcję. Jeśli jest ustawiony, wyłącz automatyczną korektę. Jeśli nie, po prostu zadzwoń do super.

class TestableTextField: UITextField { 
    override var autocorrectionType: UITextAutocorrectionType { 
     get { 
      if NSProcessInfo.processInfo().environment["AutoCorrection"] == "Disabled" { 
       return UITextAutocorrectionType.No 
      } else { 
       return super.autocorrectionType 
      } 
     } 
     set { 
      super.autocorrectionType = newValue 
     } 
    } 
} 
+0

To ciekawy pomysł. Jednak wadą oczywiście jest to, że masz podklasę WSZYSTKIE pola tekstowe w aplikacji. Może być sens zawracania metod klasy UITextField w celu zaimplementowania go. –

+0

Oto kilka wskazówek dotyczących swizzling it: http://stackoverflow.com/questions/9670321/turn-off-autocorrect-globally-in-an-app –

+0

thats idealna odpowiedź myślę. – noor

0

Oto jak wyłączyć go w moim UI test

app.textFields.element(boundBy: 0).tap() 

    let keyboards = app.keyboards.count 
    XCTAssert(keyboards > 0, "You need enable the keyboard in the simulator.") 

    app.buttons["Next keyboard"].press(forDuration: 2.1) 

    let predictiveOn = app.switches["Predictive"].value as! String == "1" 

    if predictiveOn { 
     app.switches["Predictive"].tap() 
    } else { 
     app.buttons["Next keyboard"].tap() 
    } 

    app.buttons["Next keyboard"].press(forDuration: 2.1) 

    let predictiveOff = app.switches["Predictive"].value as! String == "0" 
    XCTAssert(predictiveOff, "Predictive mode is not disabled") 

    app.buttons["Next keyboard"].tap() 
Powiązane problemy