无法转换类型' XCUIElement'的值预期的参数类型' SignUpSetUp'

时间:2016-10-24 15:34:33

标签: swift xcode-ui-testing

我创建了一个帮助程序类SignUpSetUp,以便登录我的应用程序而不是重用代码。在这个类中,我有一个私有函数waitForElementToAppear来等待测试套件中的元素出现。但是,使用此功能时会产生错误:

  

无法转换类型' XCUIElement'的值预期参数类型' SignUpSetUp'

为什么会这样,我该如何解决?

我的代码是:

import XCTest

class SignUpSetUp: XCTestCase {

    var systemAlertMonitorToken: NSObjectProtocol? = nil

    static let signUpApp = XCUIApplication()
    static let app = XCUIApplication()

    class func signUpApp() {
        // XCUIApplication().launch()
        //signUpSetUp.launch()

        sleep(2)
        let element = app.buttons["Enable notifications"]
        if element.exists {
            element.tap()
        }
        sleep(3)

        let notifcationsAlert = self.app.alerts.buttons["OK"]
        if notifcationsAlert.exists{
            notifcationsAlert.tap()
            notifcationsAlert.tap()
        }
        sleep(2)
        waitForElementToAppear(self.app.tabBars.buttons["Nearby"])
        let nearbyTab = self.app.tabBars.buttons["Nearby"]
        if nearbyTab.exists {
            nearbyTab.tap()
        }
        sleep(2)
        let enableLocation = self.app.buttons["Enable location"]
        if enableLocation.exists {
            enableLocation.tap()
        }
        let allowLocation = self.app.alerts.buttons["Allow"]
        if allowLocation.exists {
            allowLocation.tap()
            allowLocation.tap()
        }
        sleep(2)
        //waitForElementToAppear(self.app.tabBars.buttons.elementBoundByIndex(4))
        let settingsButton = self.app.tabBars.buttons.elementBoundByIndex(4)
        XCTAssert(settingsButton.exists)
        settingsButton.tap()

        let signUpButton = self.app.tables.staticTexts["Sign Up"]
        if signUpButton.exists {
            signUpButton.tap()
        }

    }

    private func waitForElementToAppear(element: XCUIElement,
                                        file: String = #file, line: UInt = #line) {
        let existsPredicate = NSPredicate(format: "exists == true")
        expectationForPredicate(existsPredicate,
                                evaluatedWithObject: element, handler: nil)

        waitForExpectationsWithTimeout(5) { (error) -> Void in
            if (error != nil) {
                let message = "Failed to find \(element) after 5 seconds."
                self.recordFailureWithDescription(message,
                                                  inFile: file, atLine: line, expected: true)
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

您的问题是您正在从类方法调用实例方法。

waitForElementToAppear是一个实例方法,但signUpApp是一个类方法。为了使代码正常工作,您需要将两者对齐。从class的签名中删除signUpApp,并从您的两个媒体资源中删除static,并将对self.app的引用更改为app

let signUpApp = XCUIApplication()
let app = XCUIApplication()

func signUpApp() { ... }

除非你确实希望方法在类/静态级别上,否则你可以在另一个方向上对齐。

就最佳实践而言,没有必要拥有两个属性来保存XCUIApplication的实例 - 只需拥有一个并使用它,因为它们都将以相同的方式运行。