Swift 3 - 无法调用非函数类型的值 'XCUIElement'

Swift 3 - Cannot call value of non-function type 'XCUIElement'

我正在尝试简化我的 UITest 代码。目前,我有数百行代码用于检查多达八 table 行,每行包含三个文本字段。这不仅会减少我的代码行数,还会减少由 copy/paste/edit 过程引起的错误。

我在 checkRow 函数的三行中收到 "Cannot call value of non-function type 'XCUIElement'" 错误。

如果我用整数替换三行中的 'thisRow' 变量,代码将编译。

这是之前和之后。

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

进入

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

这个编译通过了,但是打败了大部分的好处...

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

element(... 函数的函数签名如下所示:

func element(boundBy index: UInt) -> XCUIElement

编译器将您的 0 文字解释为适合上下文的类型,直接传递时是 UInt。但是,当将 0 传递给 checkRow 时,它会将其解释为 Int,因为这是您为 thisRow 指定的类型。

我的猜测是您需要将 thisRow 参数的类型更改为 UInt:

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


或者,将 thisRow 转换为 UInt,例如:

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