Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to monitor event loop AND Wait for app to idle

I am writing UITest cases for my app using XCTest. The app makes several server calls on the home screen. I could not navigate to the next screen. Automation often stays idle for 1 min or even more than that with the message

Wait for the app to idle

or

Unable to monitor event loop

Is there a way to make the app execute my test cases breaking this ???

like image 820
Manoj Avatar asked Oct 20 '16 13:10

Manoj


2 Answers

I have set argument in UI test class

let app = XCUIApplication()
app.launchArguments = ["NoAnimations"]
app.launch()

In my Appdelegate's didFinishLaunchingWithOptions method I made a check

 NSArray *args = [NSProcessInfo processInfo].arguments;
    
    for (NSString *arg in args){
        if ([arg isEqualToString:@"NoAnimations"]){
            [UIView setAnimationsEnabled:false];
        }
    }

So now all over my app, there won't be any animation and my app is no more blocked. This reduced my automation time from 25mins to 2mins.

like image 129
Manoj Avatar answered Nov 15 '22 09:11

Manoj


My suggestion would be to help you use one of these two methods below. The first awaits an element appears on the screen. The second element is awaiting hittable. But in any case these methods help you, maybe you can use the method sleep(param). Like sleep(5). Waits for 5 seconds

import XCTest

class BaseTestCase: XCTestCase {

    func waitForElementToAppear(element: XCUIElement, timeout: NSTimeInterval = 60,  file: String = #file, line: UInt = #line) {
        let existsPredicate = NSPredicate(format: "exists == true")
        expectationForPredicate(existsPredicate,
                                evaluatedWithObject: element, handler: nil)
        waitForExpectationsWithTimeout(timeout) { (error) -> Void in
            if (error != nil) {
                let message = "Failed to find \(element) after \(timeout) seconds."
                self.recordFailureWithDescription(message, inFile: file, atLine: line, expected: true)
            }
        }
    }

    func waitForHittable(element: XCUIElement, timeout: NSTimeInterval = 70, file: String = #file, line: UInt = #line) {
        let existsPredicate = NSPredicate(format: "hittable == 1")
        expectationForPredicate(existsPredicate, evaluatedWithObject: element, handler: nil)

        waitForExpectationsWithTimeout(timeout) { (error) -> Void in
            if (error != nil) {
                let message = "Failed to find \(element) after \(timeout) seconds."
                self.recordFailureWithDescription(message,
                                                  inFile: file, atLine: line, expected: true)
            }
        }
    }
}

I hope to have helped in some way

like image 43
Leonardo Costa Avatar answered Nov 15 '22 11:11

Leonardo Costa