2012-02-17 59 views
0

我想使用Microsoft UI自動化菜單選擇自動化。UIAutomation - 奇怪的ExpandCollapse行爲

我所針對的應用程序是一個包含嵌入式瀏覽器的Windows應用程序。該應用程序有一個帶有文件,編輯等菜單項的菜單欄。

我運行自動化的機器是Windows XP機器。

下面是我用展開的文件菜單項的代碼:

AutomationElement aeMenuBar = 
      aeFormElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.MenuBar)); 


     AutomationElement aeFileItem = 
      aeMenuBar.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, "File")); 


     ExpandCollapsePattern fileECPattern = aeFileItem.GetCurrentPattern(ExpandCollapsePattern.Pattern) as ExpandCollapsePattern; 
     fileECPattern.Expand(); 

我得到一個InvalidOperationException當我打的展開()方法。

我無法弄清楚是什麼導致異常。 fileECPattern的ExpandCollapseState是Collapsed,我相信它是正確的(換句話說,它不是一個LeafNode)。

我注意到的一件事是當我使用UI Spy查看它時,目標應用程序中的一些異常行爲。特別是,如果在UI Spy中選擇文件菜單項「範圍到元素」,然後運行Expand方法,則文件菜單不會展開。相反,文件(即編輯)的菜單項下一個展開。其他菜單項也會發生相同的行爲。當我更改應用程序時(例如Microsoft Paint),並不會發生這種情況 - 一切看起來都很好。

在某些基本級別上,我的目標應用程序中的菜單項目似乎沒有很好地與UI自動化和UI間諜相配合。

任何建議,爲什麼不會不勝感激。

回答

1

某些應用程序中的菜單欄很棘手;它們通常只是「toolbarwindow32」工具欄的常用控件,應用程序會在按下菜單項時調用TrackPopupMenu來顯示子菜單 - 而除了一行或兩行之外,下拉菜單和菜單欄之間確實沒有實際的關聯的應用程序內的代碼。 UIAutomation在爲其知道的菜單(例如,您在Win7以前的記事本中找到的User32類型)進行Expand/Collapse工作時做了「最佳嘗試」,但並不總是在別處工作。

可以嘗試的回退:查看Invoke是否可用作使子菜單出現的方式;否則,嘗試獲取可點擊的點並在該位置單擊鼠標(使用SendInput)。

+0

感謝您的回覆。我會在Invoke方法上採取一些措施。我有點擔心依靠鼠標位置,因爲我認爲這將受到個人正在使用的特定監視器的影響。 – Steve 2012-02-17 12:26:54