Я пытаюсь автоматизировать навигацию по пользовательскому интерфейсу для приложения, которое само звонит в coms.
Когда я автоматизирую щелчок (который запускает поиск, чтобы увидеть, какие устройства подключены к сети), я получаю следующую всплывающую ошибку:
Исходящий вызов не может быть выполнен, так как приложение отправляет вызов, синхронный с вводом.
Строка кода, которая не работает, выглядит следующим образом:
Get-UiaButton -AutomationId '136' -Class 'Button' -Name 'Search Now' -Win32 | Invoke-UIAButtonClick
Проведенное мной исследование предполагает, что это проблема многопоточной квартиры. Powershell 2 изначально работает в MTA. В то время как powershell 3/4 изначально работает в STA. Я попытался запустить команду в обеих средах, и она не работает одинаково.
Дальнейшие исследования показывают, что кто-то пытается отправить сообщение из потока неверного типа. Единственные сообщения, которые я могу контролировать, это те, которые генерируются вызовом Get-UIAButton
. Я попытался отключить сообщения объекта, используя
[UIAutomation.Preferences]::UseElementsPatternObjectModel = $false
[UIAutomation.Preferences]::UseElementsSearchObjectModel = $false
Однако две линии все еще проходят
Current : UIAutomation.UiElementInformation
__interceptors : {UIAutomation.MethodSelectorAspect, UIAutomation.ErrorHandlingAspect}
Я не смог найти никаких других настроек, которые выглядели бы так, будто бы они отключили остальные.
Я попытался перенаправить вывод на | Out-Null
... и все равно выдает ту же ошибку.
Я также попытался запустить команду во втором экземпляре powershell.
powershell.exe -mta -nologo -noprofile -executionpolicy bypass -command "ipmo C:\Users\Admin\Downloads\UIAutomation.0.8.7B3.NET35b\UIAutomation.dll; Get-UiaButton -AutomationId '136' -Class 'Button' -Name 'Search Now' -Win32 | Invoke-UIAButtonClick"
Я не совсем уверен, что попробовать дальше. Честно говоря, я могу просто попытаться автоматизировать этот клик с помощью Autoit.
Get-UiaButton
. Есть соответствующий вопрос здесь - по сути, вы не можете вызывать UIA (или любой межпроцессный COM) из кода, который вызывается через SendMessage. - person Eric Brown   schedule 16.03.2015Get-UiaButton
. Также возможно проблема в тестируемом приложении. Если он проводит много времени в обработчике, вызываемом sendmessage (возможно, при выполнении вложенного цикла сообщений), то обратный вызов UIA (необходимый для отправки данных автоматизации обратно из целевого приложения в ваш скрипт powershell) может нарушать ограничение исходящих вызовов. . Опять же, нам нужно больше информации, чтобы рассказать. - person Eric Brown   schedule 17.03.2015Invoke-UIAControlClick
для отправки кликов мыши вместо прямого вызова кнопки. Или кнопка недоступна до сбояGet-UiaButton
? - person Eric Brown   schedule 19.03.2015