2017-02-27 95 views
1

在我的iOS中,我正在使用XCUITest實現UITests。從我有Swift 2.3開始,它工作得很好,但是在將應用程序更新到Swift之後,像tap()這樣的基本操作不再起作用。iOS UITests無法在Swift 3更新後執行基本操作

只是一個簡單的代碼,不工作了:

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}} 

按鈕的名稱是正確的:如果我記錄測試,然後點擊按鈕線以上正是我所得到的。

的按鈕在視圖中,因爲我(這個手動倆都試圖通過一個斷點,並以編程方式:

let exists = NSPredicate(format: "exists == 1") 
expectation(for: exists, evaluatedWith: XCUIApplication().buttons["orgMenu"], handler: nil 
waitForExpectations(timeout: time, handler: nil) 

)等待它的存在

。不管怎麼樣,在Swift 3之前工作。 任何想法?提前致謝!

+0

你能上的按鈕在模擬器手動相同的生成挖掘,而不應用程序崩潰? – Oletha

+0

@Oletha,是的,我可以 –

回答

0

我只是回答我自己的問題,因爲我找到了解決方法。

由於Swift3,由於某些原因,UI測試無法使用loadMore模式管理視圖。如果我認爲TableView和代碼中的某處是手動管理loadMore模式,並且在測試中點擊一個按鈕,則loadMore將以某種無限循環方式調用,並且會耗費應用程序的資源,從而使測試失敗。

解決方法:只要停用任何loadMore如果UI測試正在運行。

在測試中設置:

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. 
} 

和我的utils的

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

對不起,斯威夫特和Objective-C的組合,希望這對某人有幫助。

+0

NSProcessInfo的環境屬性是隻讀的。這對我不起作用。 – delta2flat

0

你可以嘗試這樣做:

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