在XCUITest中使用条件似乎不起作用

时间:2018-02-12 21:38:57

标签: ios xcuitest

我已经设置了启动参数来清除用户默认值并在测试之间注销,但有一半时间这似乎不起作用。我一直在寻找可能是根本原因的可能错误,但同时我希望进行更少的测试,以便开发人员对它们更有信心。所以我在登录步骤中添加了一个条件,只有在登录按钮存在时才应该执行。运行测试时,它会像if语句完全被忽略一样,测试会查找登录按钮,然后在找不到它时失败。

代码:

   func login() {
    app.buttons["Have an account? Log in"].tap()
    let emailAddressTextField = app.textFields["Email Address"]
    let passwordSecureTextField = app.secureTextFields["Password"]

    emailAddressTextField.tap()
    emailAddressTextField.typeText(EMAIL_ALPHA_USER)
    passwordSecureTextField.tap()
    passwordSecureTextField.typeText(PASSWORD)

    if app.staticTexts["Success!"].waitForExistence(timeout: 5) {
        app.buttons["OK"].tap()
    }
   }

   func testTapControlMode() {
     if app.buttons["Have and Account?"].exists {
        login()
     }
    // ... proceed with test
    }

我没有到这里来的?我尝试过使用.isHittable,但这也无效。我在测试中放置断点并打印app.buttons["name"].exists的结果并返回false,而.isHittable返回一些错误。因此,.exists似乎应该按照我的预期行事。

1 个答案:

答案 0 :(得分:0)

在许多情况下,XCUITest Framework在视图可用于交互之前不会等待足够长的时间。要解决这个问题,你应该编写一些等待逻辑,最好编写def evaluate(classifier): predicted = classifier.predict(testing_text) if isinstance(classifier.steps[2][1], LinearSVC): probabilities = np.array(classifier.decision_function(testing_text)) scores = probabilities else: probabilities = np.array(classifier.predict_proba(testing_text)) scores = probabilities[:, 1] # NEW testing_category_array = np.array(testing_category) # NEW pos_idx = np.where(testing_category_array == 'pos') predicted_true_binary = np.zeros(testing_category_array.shape) predicted_true_binary[pos_idx] = 1 fpr, tpr, thresholds = metrics.roc_curve(predicted_true_binary, scores) auc = metrics.roc_auc_score(predicted_true_binary, scores) mean_acc = np.mean(predicted == testing_category) report = metrics.classification_report(testing_category, predicted) confusion_matrix = metrics.confusion_matrix(testing_category, predicted) return fpr, tpr, auc, mean_acc, report, confusion_matrix 类的扩展名,如下所示:

XCTestCase

然后,你可以在测试中得到类似的东西:

extension XCTestCase {

    enum Condition: String {
        case appear = "exists == true"
        case disappear = "exists == false"
    }

    func waitFor(_ element: XCUIElement, to condition: Condition) -> Bool {
        let predicate = NSPredicate(format: condition.rawValue)
        let expectationConstant = expectation(for: predicate, evaluatedWith: element, handler: nil)

        let result = XCTWaiter().wait(for: [expectationConstant], timeout: 5)
        return result == .completed
    }
}

并使用func testTapControlMode() { let haveAnAccountButton = app.buttons["Have and Account?"] if waitFor(haveAnAccountButton, to: .appear) { login() } // ... proceed with test } 方法:

login