2015-08-25 142 views
2

UI自動化我需要自動按文件 - >信息 - >在辦公室2013年 「檢查問題」我設法按與代碼文件按鈕:辦公室2013

AutomationElement window = AutomationElement.FromHandle(Window.Handle); 
AutomationElementCollection buttons = window.FindAll(TreeScope.Descendants, new PropertyCondition(
AutomationElement.ControlTypeProperty, ControlType.Button)); 
AutomationElement file=buttons.Cast<AutomationElement>().FirstOrDefault(x => x.Current.Name == "File Tab"); 
InvokePattern ipClickLoadSettings = (InvokePattern)file.GetCurrentPattern(InvokePattern.Pattern); 
ipClickLoadSettings.Invoke(); 

我怎麼能按下「檢查問題」按鈕或信息窗口中的任何其他按鈕?

感謝

回答

2

我看了看道2013 UI使用檢查SDK工具,這表明一些相關的UI可以通過UIA調用模式進行編程調用,但有些卻不能。相反,需要選擇或擴展其他用戶界面。所以我只寫了下面的測試代碼來做下面的事情......

  1. 調用文件選項卡。
  2. 選擇信息項目。
  3. 展開檢查問題UI。
  4. 調用檢查輔助功能按鈕。

雖然代碼做了一些假設(並且只能在Word的英文版本中工作),但似乎可以調用Check輔助功能UI。

對於我的測試,我使用了Windows自帶的非託管UIA API,而不是託管的.NET UIA API。我使用由tlbimp.exe工具生成的包裝器從C#代碼調用Windows UIA API。

這是我做了什麼,以生成包裝...

「C:\ Program Files文件(x86)的\微軟的SDK \的Windows \ v10.0A \ BIN \ NETFX 4.6工具\ 64 \ tlbimp.exe是「c:\ windows \ system32 \ UIAutomationCore.dll /out:Interop.UIAutomationCore.dll

如果以下步驟不適用於您,請告訴我,我可以查看它。

感謝,

蓋伊

IUIAutomation uiAutomation = new CUIAutomation8(); 

IUIAutomationElement rootElement = uiAutomation.GetRootElement(); 

// Assume the first child of the root element with a ClassName of 
// "OpusApp" is the Word window we're interested in. 
int propertyIdClassName = 30012; // UIA_ClassNamePropertyId 

IUIAutomationCondition conditionWordApp = 
    uiAutomation.CreatePropertyCondition(
     propertyIdClassName, "OpusApp"); 

IUIAutomationElement wordElement = 
    rootElement.FindFirst(
     TreeScope.TreeScope_Children, 
     conditionWordApp); 

// Find the File Tab beneath the Word element. Use the AutomationId 
// to find the button rather than the Name, because AutomationId will 
// not be localized. 
int propertyAutomationId = 30011; // UIA_AutomationIdPropertyId 

IUIAutomationCondition conditionFileTab = 
    uiAutomation.CreatePropertyCondition(
     propertyAutomationId, 
     "FileTabButton"); 

// Cache the Invoke pattern when we get the FileTab element, so 
// that we don't have to make another cross-process call later to 
// get the pattern. 
int patternIdInvoke = 10000; // UIA_InvokePatternId 
IUIAutomationCacheRequest cacheRequestInvokePattern = 
    uiAutomation.CreateCacheRequest(); 
cacheRequestInvokePattern.AddPattern(patternIdInvoke); 

IUIAutomationElement fileTabElement = 
    wordElement.FindFirstBuildCache(
     TreeScope.TreeScope_Descendants, 
     conditionFileTab, 
     cacheRequestInvokePattern); 

// Now invoke the tab. 
IUIAutomationInvokePattern invokePatternFileTab = 
    fileTabElement.GetCachedPattern(patternIdInvoke); 
invokePatternFileTab.Invoke(); 

// Note that sometimes when making calls like this, it may be necessary to 
// Thread.Sleep() for a short time here, to give the target app a chance to 
// create and show the UI being invoked. 

// Find the Info item. Unfortunately the item has no AutomationId, 
// so use other properties to find it. For this test, just use the 
// localizable Name and ControlType. (So this means this code won't 
// work for non-English builds of Word.) 

int propertyIdName = 30005; // UIA_NamePropertyId 

IUIAutomationCondition conditionInfoItemName = 
    uiAutomation.CreatePropertyCondition(
     propertyIdName, "Info"); 

IUIAutomationCondition conditionInfoItemClassName = 
    uiAutomation.CreatePropertyCondition(
     propertyIdClassName, "NetUIRibbonTab"); 

IUIAutomationCondition conditionInfoItem = uiAutomation.CreateAndCondition(
    conditionInfoItemName, conditionInfoItemClassName); 

int patternIdSelectionItem = 10010; // UIA_SelectionItemPatternId 

IUIAutomationCacheRequest cacheRequestSelectionItemPattern = 
    uiAutomation.CreateCacheRequest(); 
cacheRequestSelectionItemPattern.AddPattern(patternIdSelectionItem); 

IUIAutomationElement infoItemElement = 
    wordElement.FindFirstBuildCache(
     TreeScope.TreeScope_Descendants, 
     conditionInfoItem, 
     cacheRequestSelectionItemPattern); 

// Now select the Info item, to show the "Check for issues" UI. 
IUIAutomationSelectionItemPattern selectionItemPatternInfoItem = 
    infoItemElement.GetCachedPattern(patternIdSelectionItem); 
selectionItemPatternInfoItem.Select(); 

// Now find the "Check for issues" element. This element also has no 
// AutomationId, so just search for the Name and ClassName again. 
IUIAutomationCondition conditionInfoCheckForIssuesName = 
    uiAutomation.CreatePropertyCondition(
     propertyIdName, "Check for Issues"); 

IUIAutomationCondition conditionCheckForIssuesClassName = 
    uiAutomation.CreatePropertyCondition(
     propertyIdClassName, "NetUIAnchor"); 

IUIAutomationCondition conditionCheckForIssues = 
    uiAutomation.CreateAndCondition(
     conditionInfoCheckForIssuesName, conditionCheckForIssuesClassName); 

int patternIdExpandCollapse = 10005; // UIA_ExpandCollapsePatternId 

// Expand the "Check for issues" UI, to show the "Check Accessibility" 
// button. 
IUIAutomationCacheRequest cacheRequestExpandCollapsePattern = 
    uiAutomation.CreateCacheRequest(); 
cacheRequestExpandCollapsePattern.AddPattern(patternIdExpandCollapse); 

IUIAutomationElement checkForIssuesElement = 
    wordElement.FindFirstBuildCache(
     TreeScope.TreeScope_Descendants, 
     conditionCheckForIssues, 
     cacheRequestExpandCollapsePattern); 

IUIAutomationExpandCollapsePattern expandCollapsePatternCheckForIssues = 
    checkForIssuesElement.GetCachedPattern(patternIdExpandCollapse); 
expandCollapsePatternCheckForIssues.Expand(); 

// Finally find the "Check Accessibility" element. This element also has no 
// AutomationId, so once again, just search for the Name and ClassName. 
IUIAutomationCondition conditionInfoCheckAccessibilityName = 
    uiAutomation.CreatePropertyCondition(
     propertyIdName, "Check Accessibility"); 

IUIAutomationCondition conditionCheckAccessibiltyClassName = 
    uiAutomation.CreatePropertyCondition(
     propertyIdClassName, "NetUITWBtnMenuItem"); 

IUIAutomationCondition conditionCheckAccessibility = 
    uiAutomation.CreateAndCondition(
     conditionInfoCheckAccessibilityName, 
     conditionCheckAccessibiltyClassName); 

IUIAutomationElement checkAccessibilityElement = 
    wordElement.FindFirstBuildCache(
     TreeScope.TreeScope_Descendants, 
     conditionCheckAccessibility, 
     cacheRequestInvokePattern); 

// Invoke this element to check the document's accessibility. 
IUIAutomationInvokePattern invokePatternCheckAccessibility = 
    checkAccessibilityElement.GetCachedPattern(patternIdInvoke); 
invokePatternCheckAccessibility.Invoke();