2016-04-04 2 views
0
AE_ComboBox = uia.GetElementByControlTypeAndAutomationId(globalSettings, ControlType.ComboBox, "1"); 
AE_TargetValue = uia.GetElement(AE_ComboBox, value, true); 
SelectionItemPattern SIP = AE_TargetValue.GetCurrentPattern(SelectionItemPattern.Pattern) as SelectionItemPattern; 
SIP.Select(); 
Thread.Sleep(2000); 
SIP.Current.IsSelected 

Этот код генерирует исключение в последней строке.Элемент цели соответствует UI, который больше не доступен

Элемент назначения соответствует UI, который больше не доступен (например, родительское окно закрыто).
на MS.Internal.AutomationProxies.Misc.ThrowWin32ExceptionsIfError (Int32 ERRORCODE)
в MS.Internal.AutomationProxies.Misc.ProxySendMessage (IntPtr HWND, Int32 MSG, IntPtr, IntPtr wParam'а, LPARAM)
в MS.Internal.AutomationProxies. WindowsListBox.ListboxItem.System.Windows.Automation.Provider.ISelectionItemProvider.get_IsSelected()

Итак, что может быть проблема здесь?

Кроме того, другой вопрос: что означает «текущий» в SelectionItemPattern? (Я уверен, что это не означает текущий выбранный элемент.)

ответ

0

У меня также была та же проблема. Я получал функцию автоматизации в одной строке и получал ее через свойство Current во второй строке. Свойство «Current» снова переходит к процессу целевого приложения, чтобы получить значение при доступе. Поэтому во время этого кросс-процесса вызывается, если ваш элемент ui больше не доступен, это исключение происходит. Даже если у вас есть объект automationElement, он будет недействительным.

Если вы просто хотите получить значение, вы можете попробовать использовать CacheRequet, а затем используя свойство Cached объекта автоматизации.

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