c# - UIAutomation Click button without making window take focus and GetCurrentPattern() returning unsupported pattern -
i have handle of window , want click it's button named "load settings". have 2 problems.
- my first problem when call invoke on invokepattern, brings window focus , undesirable application.
my second problem visible , documented in comments towards end of following code:
automationelement aebot = automationelement.fromhandle(mbotsettinglist.elementat(i).getwindowhandle()); automationelement aebuttonloadsettings = aebot.findfirst(treescope.children, new propertycondition(automationelement.nameproperty, "load settings")); invokepattern ipclickloadsettings = (invokepattern)aebuttonloadsettings.getcurrentpattern(invokepattern.pattern); thread invokeloadsettingsthread = new thread(ipclickloadsettings.invoke); invokepattern ipclickopen = null; automationelement aeopendialogedit = null; automationelement aebuttonopen = null; automationelementcollection aedialogs = null; automationelement aeopendialog = null; valuepattern vpopendialogedit = null; //using thread invoke load settings button click because result of clicking load settings dialog opened , invoke doesnt return nealy 10 seconds invokeloadsettingsthread.start(); //we wont join() thread because goes on far longer expect in function //get collection of dialog windows direct children of main window have handle aedialogs = aebot.findall(treescope.children, new propertycondition(automationelement.classnameproperty, "#32770")); while (aedialogs.count == 0) { //this while loop continue check open file dialog may take little time open aedialogs = aebot.findall(treescope.children, new propertycondition(automationelement.classnameproperty, "#32770")); thread.sleep(250); } (int j = 0; j < aedialogs.count; j++) { //there 1 child dialog window, make sure have correct 1 if (aedialogs[j].current.name == "open") { debug.writeline("found open dialog!"); aeopendialog = aedialogs[j]; break; } } //inside open window, first edit window 1 file name/path should entered aeopendialogedit = aeopendialog.findfirst(treescope.descendants, new propertycondition(automationelement.classnameproperty, "edit")); //set value of file name/path string variable "loadsettingsstring" vpopendialogedit = (valuepattern)aeopendialogedit.getcurrentpattern(valuepattern.pattern); vpopendialogedit.setvalue(loadsettingsstring); //******************************************problem begining below****************************************** //using multiple methods, can successful automationelement "open" button in open file dialog aebuttonopen = aeopendialog.findfirst(treescope.subtree, new propertycondition(automationelement.nameproperty, "open")); //aebuttonopen = aeopendialog.findfirst(treescope.subtree, new propertycondition(automationelement.nameproperty, "cancel")); //something consider: if assigned aebuttonopen automationelement find looking "cancel" rather "open" debug.writeline(aebuttonopen.current.name + " button found!"); //prints "open button found!" //if aebuttonopen assigned "cancel", print "cancel button found!" ipclickopen = (invokepattern)aebuttonopen.getcurrentpattern(invokepattern.pattern); //getcurrentpattern has returned null //if aebuttonopen assigned "cancel", not null ipclickopen.invoke(); //invoke() on null results in "unsupported pattern" exception //if aebuttonopen assigned "cancel", work , open file dialog exited if cancel clicked
use uiaverify @ uia tree of application. looking @ code, suspect you're not retrieving element think are. if 'open' element button, should support invoke pattern.
alternatively, opening dialog , searching sub element of dialog. possible running reliability issue here uia tree still being created dialog. check this, add sleep 1 second , see if resolves issue. if case, uia structure changed events. events let synchronize uia test code against changes in uia tree.
Comments
Post a Comment