zoukankan      html  css  js  c++  java
  • iOS Automated Tests with UIAutomation

    参照:http://blog.manbolo.com/2012/04/08/ios-automated-tests-with-uiautomation#1

    UI Automation JavaScript Reference

    https://developer.apple.com/library/ios/documentation/DeveloperTools/Reference/UIAutomationRef/_index.html

    Another framework to be mention is OCUnit, which is included in Xcode, and can be used to add unit tests to your app.

      1. Your first UIAutomation script
      2. Dealing with UIAElement and Accessibility
      3. Tips to simplify your life
      4. Advanced interactions
      5. The end
    var target = UIATarget.localTarget();
    var app = target.frontMostApp();
    var window = app.mainWindow();
    target.logElementTree();




    Now, let’s put this in practice:

    1. Stop (⌘R) Instruments
    2. In the Scripts window, remove the current script
    3. Click on ’Add > Import’ and select TestAutomation/TestUI/Test-1.js
    4. Click on Record (⌘R) and watch what’s happens…

    The script is:

    var testName = "Test 1";
    var target = UIATarget.localTarget();
    var app = target.frontMostApp();
    var window = app.mainWindow();
    
    UIALogger.logStart( testName );
    app.logElementTree();
    
    //-- select the elements
    UIALogger.logMessage( "Select the first tab" );
    var tabBar = app.tabBar();
    var selectedTabName = tabBar.selectedButton().name();
    if (selectedTabName != "First") {
        tabBar.buttons()["First"].tap();
    }
    
    //-- tap on the text fiels
    UIALogger.logMessage( "Tap on the text field now" );
    var recipeName = "Unusually Long Name for a Recipe";
    window.textFields()[0].setValue(recipeName);
    
    target.delay( 2 );
    
    //-- tap on the text fiels
    UIALogger.logMessage( "Dismiss the keyboard" );
    app.logElementTree();
    app.keyboard().buttons()["return"].tap();
    
    var textValue = window.staticTexts()["RecipeName"].value();
    if (textValue === recipeName){
        UIALogger.logPass( testName ); 
    }
    else{
        UIALogger.logFail( testName ); 
    }

    By the power of the command line

    If you want to automate your scripts, you can launch them from the command line. In fact, I recommend to use this option, instead of using the Instruments graphical user interface. Instruments’s UI is slow, and tests keep running even when you’ve reached the end of them. Launching UIAutomation tests on command line is fast, and your scripts will stop at the end of the test.

    Depending on you version of Xcode, the command line is slighty different.

    In any version, to launch a script, you will need your UDID.

    On Xcode >= 4.3 and < 4.5, type on a terminal:

    instruments 
    -w your_ios_udid 
    -t "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate" 
    name_of_your_app 
    -e UIASCRIPT absolute_path_to_the_test_file 
    

      On Xcode >= 4.5, type on a terminal:

    instruments 
    -w your_ios_udid 
    -t "/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate" 
    name_of_your_app 
    -e UIASCRIPT absolute_path_to_the_test_file 
    

      

    For instance, in my case (Xcode 4.3), the line looks like:

    instruments -w a2de620d4fc33e91f1f2f8a8cb0841d2xxxxxxxx -t /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate TestAutomation -e UIASCRIPT /Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js 

    If you are using a version of Xcode < 4.3, you will need to type:

    instruments 
    -w your_ios_device_udid 
    -t "/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate"
    TestAutomation 
    -e UIASCRIPT /Users/jc/Documents/Dev/TestAutomation/TestAutomation/TestUI/Test-2.js 

    Interactively record interaction

    Instead of typing your script, you can record the interaction directly on the device or in the simulator, to replay them later. Do to this:

    1. Launch Instruments (⌘I)
    2. Create a new script
    3. Select the Script editorRecord interactions
    4. In the bottom of the script editor, see that red button ?Record interactionsPress-it!
    5. Now, you can play with your app; you will see the captured interactions appearing in the script window (even rotation event). Press the square button to stop recording.Record interactions

    “When things don’t work, add UIATarget.delay(1);”

    While writing your script, you will play with timing, animations and so on. UIAutomation has various functions to get elements and wait for them even if they’re not displayed but the best advice is from this extra presentation:

    4. Advanced interactions

    Handling unexpected and expected alerts

    Handling alert in automated tests has always been difficult: you’ve carefully written your scripts, launch your test suite just before going to bed, and, in the morning, you discover that all your tests has been ruined because your iPhone has received an unexpected text message that has blocked the tests. Well, UIAutomation helps you to deal with that.

    By adding this code in your script,

    UIATarget.onAlert = function onAlert(alert){
        var title = alert.name();
        UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");
        return false; // use default handler
    }
    

    and returning false, you ask UIAutomation to automatically dismiss any UIAlertView, so alerts won’t interfere with your tests. Your scripts will run as if there has never been any alert. But alerts can be part of your app and tested workflow so, in some case, you don’t wan’t to automatically dismiss it. To do so, you can test against the title of the alert, tap some buttons and return true. By returning true, you indicate UIAutomation that this alert must be considered as a part of your test and treated accordantly.

    For instance, if you want to test the ’Add Something’ alert view by taping on an ’Add’ button, you could write:

    UIATarget.onAlert = function onAlert(alert) {
        var title = alert.name();
        UIALogger.logWarning("Alert with title ’" + title + "’ encountered!");
        if (title == "Add Something") {
            alert.buttons()["Add"].tap();
            return true; // bypass default handler
        }
        return false; // use default handler
     }
    

    Easy Baby!

    Multitasking

    Testing multitasking in your app is also very simple: let’s say you want to test that crazy background process you launch each time the app resumes from background and enter in - (void)applicationWillEnterForeground:(UIApplication *)applicationselector, you can send the app in background, wait for for 10 seconds, and resume it by calling:

    UIATarget.localTarget().deactivateAppForDuration(10);
    

    deactivateAppForDuration(duration) will pause the script, simulate the user taps the home button, (and send the app in background), wait, resume the app and resume the test script for you, in one line of code!.

    Orientation

    You can simulate the rotation of your iPhone. Again, pretty straightforward and easy:

    var target = UIATarget.localTarget();
    var app = target.frontMostApp();
    
    // set landscape left
    target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPELEFT);
    UIALogger.logMessage("Current orientation is " + app.interfaceOrientation());
    
    // portrait
    target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT);
    UIALogger.logMessage("Current orientation is " + app.interfaceOrientation()); 
    

    Taking screenshot

    You can easily take screenshot of the current state of your app. It can be useful to compare this to some reference image.

    var target = UIATarget.localTarget();
    target.captureScreenWithName( "screenshot1.png" ); 
    

    The location of the screenshot will be inferred by the path you add in option -e UIARESULTSPATH results_path

    Launching local script

    Finally, you can launch any scripts (not only Javascript) that is on your local host. Combined with the capacity to take screenshots, you can imagine powerful automatic tests. You can use performTaskWithPathArgumentsTimeout(path, args, timeout)with pathcontaining the full path of your script, args an array of arguments to pass to your script, and timeout a … timeout!

    var target = UIATarget.localTarget();
    var host = target.host();
    
    var result = host.performTaskWithPathArgumentsTimeout("/usr/bin/echo", ["Hello World"], 5);

    When things don’t work, add UIATarget.delay(1);!

  • 相关阅读:
    HDU 2883 kebab
    CSUOJ 1635 Restaurant Ratings
    CSUOJ 1638 Continued Fraction
    POJ 1852 Ants
    ZOJ 3471 Most Powerful
    CSUOJ 1637 Yet Satisfiability Again!
    如何生成CA证书
    Keepalived实现双机热备
    Nginx负载均衡的优缺点
    负载均衡之 nginx
  • 原文地址:https://www.cnblogs.com/ccxniit2004/p/3688242.html
Copyright © 2011-2022 走看看