Windows UIAutomation иногда зависает в других приложениях

Я использую UIAutomation через COM-интерфейс в своем клиентском приложении WPF. Некоторые пользователи иногда зависают в своих конкретных приложениях (например, в панели управления nVidia). Мое приложение получает это исключение:

System.Runtime.InteropServices.COMException (0x80131505): время ожидания операции истекло. (Исключение из HRESULT: 0x80131505) в UIAutomationClient.IUIAutomationElement.FindAll (область TreeScope, условие IUIAutomationCondition).

Я не могу воспроизвести это на своем ПК.

  • У вас есть опыт решения подобных проблем?
  • У вас есть обходные пути для таких случаев?
  • Могу ли я как-то уменьшить время ожидания COM? возможно это решит проблему

person Mikolaytis    schedule 14.12.2017    source источник


Ответы (1)


Я нашел некоторую информацию о проблеме.

  • UIAutomation работает нестабильно только в Windows 10 с Creator's Update (источник)
  • Это ошибка, и она отправлена ​​здесь
  • NickAb нашел решение: используйте TreeWalker (источник).

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

Замена FindAll на

private IEnumerable<WiniumElement> GetChildrens()
{
    var elementNode = TreeWalker.ControlViewWalker.GetFirstChild(this.AutomationElement);

    while (elementNode != null)
    {
        yield return new WiniumElement(elementNode);
        elementNode = TreeWalker.ControlViewWalker.GetNextSibling(elementNode);
    }
}

Решает проблему. Требуется дальнейшее расследование. Скорее всего, нам придется заменить вызовы FindFirst и FindAll пользовательским методом итерации TreeWalker.

Это решит проблему с невозможностью получить исходный код страницы для представлений с WebViews и неспособностью найти элемент в WebView из-за той же ошибки.

person Mikolaytis    schedule 14.12.2017