2016-08-05 50 views
3

Ich versuche, meinen UITest-Code zu vereinfachen. Zu dieser Zeit habe ich Hunderte von Codezeilen, um bis zu acht Tabellenzeilen mit jeweils drei Textfeldern zu prüfen. Dies reduziert nicht nur die Anzahl der Codezeilen, die ich habe, sondern reduziert auch die Fehler, die durch den Kopier-/Einfüge-/Bearbeitungsprozess verursacht werden.Swift 3 - Kann Wert von Nichtfunktionsart 'XCUIElement' nicht aufrufen

Ich bekomme einen "Kann nicht Wert von Nicht-Funktion Typ 'XCUIElement'" Fehler auf den drei Zeilen in der checkRow-Funktion aufrufen.

Wenn ich die "thisRow" Variable in den drei Zeilen durch eine ganze Zahl ersetzen, wird der Code kompilieren.

Hier ist das Vorher und Nachher.

func testAkcCh() { 
    navConfig.tap() 
    pickCD.adjust(toPickerWheelValue: "4") 
    pickCB.adjust(toPickerWheelValue: "5") 
    pickSD.adjust(toPickerWheelValue: "3") 
    pickSB.adjust(toPickerWheelValue: "2") 
    XCTAssert(app.tables.cells.count == 8) 
    XCTAssert(app.tables.cells.element(boundBy: 0).staticTexts["Best of Breed"].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 0).staticTexts[p5].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 0).staticTexts[d13].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 1).staticTexts["Best of Opposite Sex"].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 1).staticTexts[p5].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 1).staticTexts[d06].exists) 
} 

in

func checkRow(thisRow: Int, thisAward: String, thisPoints: String, thisDefeated: String) { 
    XCTAssert(app.tables.cells.element(boundBy: thisRow).staticTexts[thisAward].exists) 
    XCTAssert(app.tables.cells.element(boundBy: thisRow).staticTexts[thisPoints].exists) 
    XCTAssert(app.tables.cells.element(boundBy: thisRow).staticTexts[thisDefeated].exists) 
} 

func testAkcCh() { 
    navConfig.tap() 
    pickCD.adjust(toPickerWheelValue: "4") 
    pickCB.adjust(toPickerWheelValue: "5") 
    pickSD.adjust(toPickerWheelValue: "3") 
    pickSB.adjust(toPickerWheelValue: "2") 
    XCTAssert(app.tables.cells.count == 8) 
    checkRow(0, "Best of Breed", p5, d13) 
    checkRow(1, "Best of Opposite Sex", p5, d06) 
} 

Dies kompiliert, aber die meisten von Nutzen geschlagen ...

func checkRow(thisRow: Int, thisAward: String, thisPoints: String, thisDefeated: String) { 
    XCTAssert(app.tables.cells.element(boundBy: 0).staticTexts[thisAward].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 0).staticTexts[thisPoints].exists) 
    XCTAssert(app.tables.cells.element(boundBy: 0).staticTexts[thisDefeated].exists) 
} 

Antwort

6

Die Funktion Unterschrift der element(... Funktion wie folgt aussieht:

func element(boundBy index: UInt) -> XCUIElement 

Die co mpiler interpretiert Ihr 0 Literal als den entsprechenden Typ für den Kontext, der direkt UInt übergeben wird. Wenn Sie jedoch 0 an checkRow übergeben, interpretiert es dies als Int, da dies der Typ ist, den Sie für thisRow angegeben haben.

Meine Vermutung ist, dass Sie die Art Ihrer thisRow Parameter UInt ändern müssen:

func checkRow(thisRow: UInt, thisAward: String, thisPoints: String, thisDefeated: String) { 


oder alternativ konvertieren thisRow- UInt wie:

XCTAssert(app.tables.cells.element(boundBy: UInt(thisRow)).staticTexts[thisAward].exists) 
+0

, dass die Arbeit geleistet haben, Danke! Ich muss noch viel lernen !! –

+3

Nur auf Swift 4 aktualisiert und den gleichen Fehler erneut angezeigt, ohne dass der Code geändert wurde. Ich musste die Uint (xxx) entfernen. XCTAssertFalse (app.tables.cells.element (boundBy: thisRow) .exists) –

+9

Scheint wie Apple die Signatur von 'UInt' zu 'Int' mit Swift 4.' func Element (boundBy Index: Int) -> XCUIElement ' – d4Rk