在 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 中使用条件似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章
执行 XCUITest 时,Tap 方法在今日视图中不起作用
Xcode 11 Export for Localization 不起作用,Include Screenshots 功能被禁用,并且在测试日志中找不到 XCUITest 屏幕截图附件