Microsoft UIAutomation НЕ ВСЕГДА работает на некоторых компьютерах. C#
У меня есть код C# для извлечения URL из Chrome. Обычно он работает на Win7/Win 8.1, но на некоторых компьютерах с такой же конфигурацией он не работает. И, вероятно, нет никакой разницы между этими конфигурациями. Почему это происходит?
Process[] procsChrome = Process.GetProcessesByName("chrome");
foreach(Process chrome in procsChrome)
{
if(chrome.MainWindowHandle == IntPtr.Zero)
{
continue;
}
AutomationElement mainWindow = AutomationElement.FromHandle(chrome.MainWindowHandle);
elmUrlBar = mainWindow.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
//elmUrlBar on some computers inited, on some NULL. But versions of Chrome are identical.
...
}
3 ответа
(1) Проверяли ли вы, что в Chrome была включена Accessibility в тех ситуациях, когда ваше приложение не работало? Он должен быть включен из командной строки Chrome или включен для отдельных вкладок.
(2) Возможно, вы столкнулись с проблемой изоляции привилегий пользовательского интерфейса (UIPI). Это не проблема, если вы используете учетную запись администратора, но при стандартной регистрации необходимо обойти UIPI:
- Иметь uiAccess=True в манифесте приложения.
- Подпишите заявку через действующий центр подписи кода. (Однако вы можете протестировать самозаверяющий исполняемый файл - мы сделали это успешно.)
- Установите исполняемый файл в каталог System32 (или SysWOW64 для 32-разрядных приложений, установленных в 64-разрядных окнах).
Возможно, это проблема безопасности Windows. В Windows есть некоторая защита, которая отключает связь между приложениями, которая называется контролем учетных записей ( UAC).
Если вы обычно запускаете Visual Studio с правами администратора, дочерний процесс, который он запускает для запуска вашего приложения, также будет повышен, и ваша автоматизация, скорее всего, будет работать.
Попытка его на другой машине, скорее всего, не удастся из-за UAC. Или это может произойти на компьютере, на котором отключены некоторые настройки UAC.
На машинах, которые выходят из строя, я бы попытался временно отключить UAC, как упомянуто здесь, и если он теперь работает, то вы знаете, что это проблема. На самом деле вы можете заставить его работать, даже когда UAC включен, добавив манифест в ваше приложение, как упомянуто здесь.
У меня была аналогичная проблема на сервере, где
UI Automation
один день работал нормально, а на днях - нет.
Кто-то с правами администратора добавил некоторые переменные системной среды и перезапустил сервер. Не знаю, как они что-то напутали на этом этапе, но после этого мое приложение перестало работать.
После того, как я целый день рвал за волосы из-за разочарования, я решил выйти из учетной записи пользователя. Я был авторизован на этом сервере и снова вошел в систему. И я запустил свое приложение, и бац , оно начало работать!