Как конфигурация Coded UI "всегда искать" работает с родительскими / дочерними объектами?

В качестве примера я буду использовать очень простой интерфейс: окно (которое я назову W) с помощью одной кнопки (B). В UIMap кодированного пользовательского интерфейса, B это ребенок W, то есть в спецификации XML карты, B появляется в W"потомки".

Теперь скажем, у нас есть два случая W открыть одновременно. Существует свойство поиска, которое будет отличать W1 от W2 (например, у них разные Name собственность), но нет возможности отличить B1 от B2 кроме их родителей W,

Я выполняю тест со следующей процедурой:

  1. Откройте два экземпляра окна, W1 а также W2
  2. Установить Name собственность на UIMap WUITestControl соответствовать W1имя
  3. Выполнить Mouse.Click() на UIMap BUITestControl,
  4. Установить Name собственность на UIMap WUITestControl соответствовать W2имя
  5. Выполнить Mouse.Click() на UIMap BUITestControl,

Я понимаю, что если ни то, ни другое W ни B иметь конфигурацию "Поиск всегда", то это приведет к B1 щелчок на обеих стадиях 3 и 5. Поэтому мой вопрос заключается в том, что происходит в следующих сценариях:

  • B имеет "Поиск всегда", но W не.
  • W имеет "Поиск всегда", но B не.

1 ответ

Решение

Без конфигурации Search Always механизм будет кэшировать элемент пользовательского интерфейса после его нахождения (под кэшем я имею в виду сохранение ссылки на COM-объект MSAA, полученный из этого элемента). Как всегда, функция Always Search всегда выполняет поиск элемента, как вы сказали. Также UITestControl.Find() делает то же самое, так что вы можете использовать это явно, если не хотите устанавливать конфигурацию Always Search.

Когда вы изменяете свойства поиска элемента управления, движок будет искать элемент при следующем использовании этого элемента управления (поэтому после изменения свойств поиска элемент управления удалит ссылку на элемент пользовательского интерфейса). Однако, если дочерний элемент (кнопка в вашем случае) уже кэширован, и вы изменяете свойства поиска его родителя, вам придется вызывать Find для кнопки (или устанавливать постоянный поиск), иначе движок будет использовать кэшированный элемент пользовательского интерфейса.

Если вы хотите использовать несколько UITestControls одного и того же класса, вы должны забыть UIMap и просто создать несколько экземпляров этого класса, а затем изменить их свойства поиска отдельно. UIMap не отвечает за иерархию элементов, это просто способ доступа к элементам.

Итак, в вашем случае:

var W1 = new MyWindowClass();
var W2 = new MyWindowClass();
W1.SearchProperties.Add( ... );
W2.SearchProperties.Add( ... );

Тогда, если все настроено правильно, W1->B будет кнопкой в ​​окне W1, а W2->B будет кнопкой в ​​окне W2.

Если W не является элементом верхнего уровня, вы можете установить для него родительский элемент из UIMap:

var W1 = new MyWindowClass(UIMap.UITopWindow);

Эти вопросы могут также помочь вам:

Взаимодействие с несколькими экземплярами приложения в кодированном интерфейсе

Метод SwitchTo для закодированного пользовательского интерфейса

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