2015-08-25 144 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();