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

Posted

技术标签:

【中文标题】在 XCUITest 中使用条件似乎不起作用【英文标题】:Using a conditional in XCUITest doesn't seem to work 【发布时间】:2018-02-12 21:38:57 【问题描述】:

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

在许多情况下,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()
    

【讨论】:

以上是关于在 XCUITest 中使用条件似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

iOS:XCUITest 中的模拟器位置不起作用

XCUITest:调用的测试函数中的断言不起作用

执行 XCUITest 时,Tap 方法在今日视图中不起作用

Xcode 11 Export for Localization 不起作用,Include Screenshots 功能被禁用,并且在测试日志中找不到 XCUITest 屏幕截图附件

@font-face 在 Firefox 中不起作用 [重复]

条件编译似乎在 Xamarin Studio 中不起作用