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:

  1. Иметь uiAccess=True в манифесте приложения.
  2. Подпишите заявку через действующий центр подписи кода. (Однако вы можете протестировать самозаверяющий исполняемый файл - мы сделали это успешно.)
  3. Установите исполняемый файл в каталог System32 (или SysWOW64 для 32-разрядных приложений, установленных в 64-разрядных окнах).

Возможно, это проблема безопасности Windows. В Windows есть некоторая защита, которая отключает связь между приложениями, которая называется контролем учетных записей ( UAC).

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

Попытка его на другой машине, скорее всего, не удастся из-за UAC. Или это может произойти на компьютере, на котором отключены некоторые настройки UAC.

На машинах, которые выходят из строя, я бы попытался временно отключить UAC, как упомянуто здесь, и если он теперь работает, то вы знаете, что это проблема. На самом деле вы можете заставить его работать, даже когда UAC включен, добавив манифест в ваше приложение, как упомянуто здесь.

У меня была аналогичная проблема на сервере, где UI Automation один день работал нормально, а на днях - нет.

Кто-то с правами администратора добавил некоторые переменные системной среды и перезапустил сервер. Не знаю, как они что-то напутали на этом этапе, но после этого мое приложение перестало работать.

После того, как я целый день рвал за волосы из-за разочарования, я решил выйти из учетной записи пользователя. Я был авторизован на этом сервере и снова вошел в систему. И я запустил свое приложение, и бац , оно начало работать!

Другие вопросы по тегам