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)
我正在尝试简化我的 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)