<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>In the past, there had been issues with UIAutomation as
mentioned in <a
href="http://blogs.msdn.com/shrib/archive/2008/03/24/ironpython-cannot-call-automationelement-fromhandle.aspx">http://blogs.msdn.com/shrib/archive/2008/03/24/ironpython-cannot-call-automationelement-fromhandle.aspx</a>.
This could be related. You could try it on Win7 to see if its fixed.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>You can also try the techniques mentioned in <a
href="http://blogs.msdn.com/shrib/archive/2008/03/24/what-if-a-c-snippet-does-not-work-when-transliterated-to-ironpython.aspx">http://blogs.msdn.com/shrib/archive/2008/03/24/what-if-a-c-snippet-does-not-work-when-transliterated-to-ironpython.aspx</a>
to narrow down the problem.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
users-bounces@lists.ironpython.com [mailto:users-bounces@lists.ironpython.com] <b>On
Behalf Of </b>Jozef<br>
<b>Sent:</b> Friday, November 06, 2009 6:20 AM<br>
<b>To:</b> users@lists.ironpython.com<br>
<b>Subject:</b> [IronPython] What's wrong with IronPython (UIAutomation)<o:p></o:p></span></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal>Hi,<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>I'm using UIAutomation framework with IronPython to test our
application.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>For WPF dialogs it works perfectly. But I run into trouble
when try to use it for some older dialogs.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>The problem:&nbsp; With IronPython I'm not able to get
proper control type. Any controls appears as ControlType.Pane&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Simple example: (with windows calculator)<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>--------------------------------------- IP Code
------------------------------------------------------<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>import clr<o:p></o:p></p>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>clr.AddReference('UIAutomationClient')<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>clr.AddReference('UIAutomationTypes')<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>from System.Windows.Automation import *<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>_rootElement = AutomationElement.RootElement<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>if __name__ == '__main__':<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>nameCondition =
PropertyCondition(AutomationElement.NameProperty, &quot;Calculator&quot;)<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>typeCondition =
PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window)<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>calcCondition = AndCondition(nameCondition, typeCondition)<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>appCalc = _rootElement.FindFirst(TreeScope.Children,
calcCondition)<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>if appCalc is not None:<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>&nbsp; &nbsp;<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>isFocusable =
appCalc.GetCurrentPropertyValue(AutomationElement.IsKeyboardFocusableProperty,
True)<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>if isFocusable:<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>#appCalc.SetFocus() &nbsp; #calling this raise:
System.InvalidOperationException<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>pass<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>contList = appCalc.FindAll(TreeScope.Subtree,
Condition.TrueCondition)<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>&nbsp; &nbsp;<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>for elm in contList:<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>progName = elm.Current.ControlType.ProgrammaticName<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>print progName<o:p></o:p></p>

</div>

</div>

<div>

<p class=MsoNormal>-----------------------------------------------------------------------------------------------------------<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>above code produce following output:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>ControlType.Window<br>
ControlType.Pane<br>
ControlType.Pane<br>
ControlType.Pane<br>
ControlType.Pane<br>
ControlType.Pane<br>
.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>.<br>
&nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&nbsp; &nbsp;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>similar C# code works as expected<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>------------------------------------------ C# Code
---------------------------------------------------<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>using System;<o:p></o:p></p>

<div>

<p class=MsoNormal>using System.Collections.Generic;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>using System.Linq;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>using System.Text;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>using System.Windows.Automation;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>using Automation = System.Windows.Automation;<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>namespace UIAutTest<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>{<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>class Program<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>{<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>static void Main(string[] args)<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>{<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>AutomationElement rootElement =
AutomationElement.RootElement;<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>Automation.Condition nameCondition = new
PropertyCondition(AutomationElement.NameProperty, &quot;Calculator&quot;);<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>Automation.Condition controlCondition = new
PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window);<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>Automation.Condition calcCondition = new
AndCondition(nameCondition, controlCondition);<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>AutomationElement appCalc =
rootElement.FindFirst(TreeScope.Children, calcCondition);<o:p></o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>if (appCalc != null)<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>{<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>appCalc.SetFocus();<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>AutomationElementCollection allCont =
appCalc.FindAll(TreeScope.Subtree, Condition.TrueCondition);<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>foreach (AutomationElement elm in allCont)<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>{<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>string contProgNam =
elm.Current.ControlType.ProgrammaticName;<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>Console.WriteLine(contProgNam);<o:p></o:p></p>

</div>

<div style='margin-left:1.25in'>

<p class=MsoNormal>}<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal>}<o:p></o:p></p>

</div>

<div style='margin-left:60.0pt'>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div style='margin-left:30.0pt'>

<p class=MsoNormal>}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>}<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>---------------------------------------------------------------------------------------------<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>C# code produce this output:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>ControlType.Window<br>
ControlType.Edit<br>
ControlType.CheckBox<br>
ControlType.CheckBox<br>
ControlType.Group<br>
ControlType.Button<br>
ControlType.RadioButton<br>
ControlType.RadioButton<br>
ControlType.RadioButton<br>
ControlType.RadioButton<br>
ControlType.Group<br>
ControlType.Group<br>
ControlType.RadioButton<br>
ControlType.RadioButton<br>
ControlType.RadioButton<br>
ControlType.Button<br>
.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Does anybody know why ControlType property retrieved by IP
code is different then ControlType retrieved by C# ?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Others element properties retrieved by IP code seems to by
OK.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Info:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Windows Vista Business, SP2<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>IronPython 2.6 (2.6.10920.0) on .NET 2.0.50727.4200<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Thanks,<br>
Jozef<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</div>

<div>

<p class=MsoNormal>PS: &nbsp;Duane Kaufman, send similar question : &nbsp;<a
href="http://lists.ironpython.com/htdig.cgi/users-ironpython.com/2009-June/010693.html"
target="_blank">http://lists.ironpython.com/htdig.cgi/users-ironpython.com/2009-June/010693.html</a>.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>But, no one answer him. &nbsp;<o:p></o:p></p>

</div>

</div>

</body>

</html>