2016-10-24 2 views
0

Я создал вспомогательный класс SignUpSetUp для входа в приложение вместо повторного использования кода. В этом классе у меня есть частная функция waitForElementToAppear, чтобы дождаться появления элементов в наборе тестирования. Однако при использовании этой функции генерирует ошибку:Невозможно преобразовать значение типа «XCUIElement» в ожидаемый тип аргумента «SignUpSetUp»

Cannot convert value of type 'XCUIElement' to expected argument type '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) 
      } 
     } 
    } 
+0

Почему вы пытаетесь назвать переменную ('SignUpSetUp') такой же, как имя вашего класса? – rmaddy

+0

Извините, это правильно, было сделано изменение. –

+0

Не забывайте мой комментарий в своем последнем вопросе - имена методов и переменных должны начинаться с строчных букв. И обновите свой вопрос сейчас, когда вы переименовали переменную. – rmaddy

ответ

2

Ваша проблема заключается в том, что вы вызываете метод экземпляра из метода класса.

waitForElementToAppear - метод экземпляра, но signUpApp - метод класса. Чтобы ваш код работал, вам необходимо выровнять два. Удалите class с подписи signUpApp, а также удалите static из двух ваших свойств и измените ссылки на self.app на номер app.

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

func signUpApp() { ... } 

Если вы не хотите методы, чтобы быть на/статический уровень класса, в этом случае вы можете выравнивать в другом направлении.

С точки зрения лучших практик, нет необходимости иметь два свойства, содержащих экземпляр XCUIApplication - просто имейте это и используйте это, поскольку они будут работать одинаково.

+0

Спасибо за ваше объяснение, действительно помогли! –

Смежные вопросы

 Смежные вопросы