Handling Alert with UIAutomation

前端 未结 7 1514
日久生厌
日久生厌 2020-12-31 07:14

I\'m trying to test the presence of an UIAlertView with UIAutomation but my handler never gets called.

At the beginning of my javascript i write :

UI         


        
相关标签:
7条回答
  • 2020-12-31 07:15

    Make sure the UI Automation script is still running when the UIAlertView shows.

    For example, adding the following line to the end of your script will keep it running until an alert becomes accessible or the grace period for object resolution expires.

    // Wait for UIAlert to appear so that UIATarget.onAlert gets called.
    target.frontMostApp().alert();
    

    I figured this out by thoroughly reading & understanding Instruments User Guide: Automating UI Testing, which I highly recommend doing as an introduction to UI Automation.

    It may also be helpful to review the UIATarget Class Reference, specifically the methods popTimeout, pushTimeout, setTimeout, timeout, and delay.

    0 讨论(0)
  • 2020-12-31 07:15

    @vdaubry the solution is simple.

    According to Apple documentation, if you want to handle alerts manually then you should return true instead of false in onAlert(alert)

     UIATarget.onAlert = function onAlert(alert) {
        UIALogger.logMessage("alertShown");
        return true;
    }
    

    @Drew Crawford the delays will not work because by default can button is clicked by UI Automation. The documentation is not wrong but it is not clearly explained.

    0 讨论(0)
  • 2020-12-31 07:29

    The documentation seems to be wrong. It turns out that alerts are handled on the same thread your script tries to run. So if you want the alert handler to be called, you need to sleep, e.g.,

    UIATarget.onAlert = { ... }
    window.buttons().triggerAlertButton.tap();
    UIATarget.localTarget().delay(4);
    

    Also, it appears that the alert's name and value are always set to null. I was, however, able to access the first static text which contained the alert's title.

    0 讨论(0)
  • 2020-12-31 07:31

    Following snippet works for me on XCode 6.3.1 & Instruments(6.3.1 (6D1002)) :

        var target = UIATarget.localTarget();
    
        // Following line shows an internal alert with 'Cancel' & 'Continue' buttons
        target.frontMostApp().mainWindow().buttons()["ShowAlert"].tap();
    
        // Handle an internal alert
        UIATarget.onAlert = function onAlert(alert) {
                return true;
         }
    
        // Perform Tap on alert.
        target.frontMostApp().alert().buttons()["Continue"].tap();
    
    0 讨论(0)
  • 2020-12-31 07:38

    e.g. - onAlert is not called

    var target = UIATarget.localTarget(); 
    target.buttons()["ShowAlert"].tap()
    UIAtarget.onAlert = function onAlert(alert)
    {...}
    

    -

    e.g. - onAlert is called

    var target = UIATarget.localTarget(); 
    UIAtarget.onAlert = function onAlert(alert)
    {......}
    target.buttons()["ShowAlert"].tap()
    

    or

    #import "onAlert.js"
    var target = UIATarget.localTarget(); 
    target.buttons()["ShowAlert"].tap()
    

    Try it out.

    0 讨论(0)
  • 2020-12-31 07:39

    The below code works for me. The function is handling the alert and "alert Shown" is printed on the logs.

    var target = UIATarget.localTarget();
    var application = target.frontMostApp();
    var window = application.mainWindow();
    
    UIATarget.onAlert = function onAlert(alert){
        UIALogger.logMessage("alert Shown");    
    }
    
    target.frontMostApp().mainWindow().tableViews()[0]
        .cells()["Fhgui"].buttons()["Images"].tap();
    // Alert detected. Expressions for handling alerts 
    // should be moved into the UIATarget.onAlert function definition.
    target.frontMostApp().alert().defaultButton().tap();
    
    0 讨论(0)
提交回复
热议问题