0

我设置了启动参数以清除用户默认值并在测试之间注销,但是,有一半的时间这似乎不起作用。我一直在寻找可能是根本原因的错误,但同时我希望减少不稳定的测试,以便开发人员对它们更有信心。因此,我在登录步骤周围添加了一个条件,该条件仅应在登录按钮存在时执行。运行测试时,就像 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这里应该做我所期望的。

4

1 回答 1

0

在许多情况下,XCUITest 框架在视图可用于交互之前等待的时间不够长。要解决这个问题,您应该编写一些等待逻辑,最好为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方法中:

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

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

    if waitFor(successLabel, to: .appear) {
        app.buttons["OK"].tap()
    }
}
于 2018-02-14T11:36:03.977 回答