Search code examples
ui-automationmicrosoft-ui-automation

Issue with setting AutomationElement value


I have an issue with setting value of AutomationElement by using method ValuePattern.SetValue().

Everything works just fine until some dialog appears. When the dialog appears the code execution got stuck. No exception is thrown. After the dialog is confirmed, the code exection continues. Bellow is a sample of the code:

            BasePattern basePattern = null;
            ValuePattern valuePattern = null;

            AutomationElement elementA = Window.GetElement(SearchCriteria.ByText(propertyName));

            object patternObjectA = null;          
            elementA.TryGetCurrentPattern(ValuePattern.Pattern, out patternObjectA);               

            basePattern = (BasePattern)patternObjectA;
            valuePattern = (ValuePattern)patternObjectA;     

            valuePattern.SetValue(optionToSet);

// Window.GetElement() is a method from TestStack.White framework

// The code execution got stuck on the last line until the dialog is confirmed

Is there any other way to set AutomationElement value?

Is somehow possible to avoid of getting stuck by dialog?

I'll by grateful for any help. Thanks advance.


Solution

  • It could be that this dialog is not supporting UI Automation correctly or that you simply target the wrong element.

    To verify that you may use Inspect.exe from Microsoft or similiar tools.inspect.exe example


    If it works, check if you really target the correct component with your code again.

    If it does not work and:

    • if you are able to change the application

      1. you can change the so called AutomationPeer of the UI component - here is a link for more infos
      2. Or simply use another UI component that supports UI Automation correctly.
    • if you are not able to change the application, and also do not need to run in background, parallel, etc.. you might just focus the component (call setFocus() onto the AutomationElement, or expand it (via IsExpandCollapsePatternAvailable or simulated MouseClick onto the components coordinates)) and then use the SendKeys.SendWait("test") method.


    EDIT: There is one more thing you should have a look at, and I wonder why I didn't mentioned it in the first place: Register to UI Automation Events For example you could register a callback for the Structure change event type, and check if the dialog you talk about appeared. If so --> click the confirmed button of the dialog.

    Probably you will have to synchronize your execution, so that every further action in the UI Automation script waits until the registered callback got executed and the confirmed button got clicked.