iOS UITests可以';在Swift 3更新后不执行基本操作

iOS UITests可以';在Swift 3更新后不执行基本操作,ios,swift3,xcode-ui-testing,Ios,Swift3,Xcode Ui Testing,在我的iOS中,我使用xguitest实现UITest。自从我使用Swift 2.3以来,它工作得很好,但在将应用程序更新为Swift 3之后,基本操作(如tap()不再工作) 只是一个不再有效的简单代码: XCUIApplication().buttons["orgMenu"].tap() 投掷 Assertion Failure: <unknown>:0: UI Testing Failure - Failure getting snapshot Error Domain=XC

在我的iOS中,我使用
xguitest
实现UITest。自从我使用Swift 2.3以来,它工作得很好,但在将应用程序更新为Swift 3之后,基本操作(如
tap()
不再工作)

只是一个不再有效的简单代码:

XCUIApplication().buttons["orgMenu"].tap()
投掷

Assertion Failure: <unknown>:0: UI Testing Failure - Failure getting snapshot Error Domain=XCTestManagerErrorDomain Code=9 "Error -25204 getting snapshot for element <AXUIElement 0x7f8297d15a50> {pid=32375}" UserInfo={NSLocalizedDescription=Error -25204 getting snapshot for element <AXUIElement 0x7f8297d15a50> {pid=32375}}
)

不管怎么说,它在Swift 3之前就开始工作了。
有什么想法吗?提前谢谢

我只回答我自己的问题,因为我找到了解决办法

自Swift3以来,由于某些原因,UI测试无法使用
loadMore
模式管理视图。如果在我的视图中有一个
TableView
,在代码中的某个地方手动管理
loadMore
模式,并且在测试中我点击一个按钮,loadMore会以一种无限循环的方式被调用,这会消耗应用程序的资源,导致测试失败

解决方法:如果UI测试正在运行,只需停用任何
loadMore

在测试设置中:

override func setUp() {
    super.setUp()
    let app = XCUIApplication()

    continueAfterFailure = false
    app.launchEnvironment = ["isUITest":"YES"]
    app.launch()
}
在具有loadData的视图中:

-(void)loadMore
{
    if ([Utils isRunningUITest]) {
        return;
    }
    // My actual function.
}
还有我的头发

+(BOOL)isRunningUITest {
    NSDictionary *environment = [[NSProcessInfo processInfo] environment];
    return environment[@"isUITest"];
}

很抱歉使用了快速客观的C组合,希望这对其他人有所帮助。

我只回答我自己的问题,因为我找到了解决方法

自Swift3以来,由于某些原因,UI测试无法使用
loadMore
模式管理视图。如果在我的视图中有一个
TableView
,在代码中的某个地方手动管理
loadMore
模式,并且在测试中我点击一个按钮,loadMore会以一种无限循环的方式被调用,这会消耗应用程序的资源,导致测试失败

解决方法:如果UI测试正在运行,只需停用任何
loadMore

在测试设置中:

override func setUp() {
    super.setUp()
    let app = XCUIApplication()

    continueAfterFailure = false
    app.launchEnvironment = ["isUITest":"YES"]
    app.launch()
}
在具有loadData的视图中:

-(void)loadMore
{
    if ([Utils isRunningUITest]) {
        return;
    }
    // My actual function.
}
还有我的头发

+(BOOL)isRunningUITest {
    NSDictionary *environment = [[NSProcessInfo processInfo] environment];
    return environment[@"isUITest"];
}

很抱歉使用了快速客观的C组合,希望这对其他人有所帮助。

您可以尝试执行以下操作:

let app = XCUIApplication()
XCTAssert(app.buttons["orgMenu"].waitForExistence(timeout: 10))
app.buttons["orgMenu"].tap()

您可以尝试执行以下操作:

let app = XCUIApplication()
XCTAssert(app.buttons["orgMenu"].waitForExistence(timeout: 10))
app.buttons["orgMenu"].tap()

你能用相同的版本手动点击模拟器中的按钮而不使应用程序崩溃吗?@Oletha,是的,我能用相同的版本手动点击模拟器中的按钮而不使应用程序崩溃吗?@Oletha,是的,我能处理信息的环境属性是只读的。这对我无效。NSProcessInfo的环境属性为只读。这对我不起作用。