2015-08-25 4 views
2

Мне нужно автоматизировать нажав File-> Info -> «Поиск проблем» в офисе 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

Я посмотрел на Word, 2013 UI с помощью осматривайте SDK, и это показывает, что некоторые из них связаны UI можно программно вызвать с помощью шаблона МАУ Invoke, но некоторые из них не может. Вместо этого нужно выбрать или расширить другой пользовательский интерфейс. Поэтому я просто написал тестовый код ниже, чтобы сделать следующее ...

  1. Вызовите вкладку «Файл».
  2. Выберите пункт Информация.
  3. Расширьте интерфейс для проверки проблем.
  4. Вызовите кнопку «Проверить доступность».

Хотя код делает несколько предположений (и будет работать только на английских сборках Word), он, казалось, смог вызвать пользовательский интерфейс проверки доступности.

Для моего теста я использовал неуправляемый API UIA, который поставляется с Windows, а не с управляемым API UIA .NET. Я вызываю API UIA Windows из кода C#, используя оболочку, которую я сгенерировал с помощью инструмента tlbimp.exe.

Это то, что я сделал для создания этой оберткой ...

«C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v10.0A \ Bin \ NETFX 4.6 Tools \ x64 \ tlbimp.exe «c: \ windows \ System32 \ UIAutomationCore.dll /out:Interop.UIAutomationCore.dll

Если шаги, подобные приведенным ниже, не работают для вас, дайте мне знать, и я могу изучить его.

Спасибо,

Guy

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(); 

 Смежные вопросы

  • Нет связанных вопросов^_^