Я внедряю провайдеров автоматизации для некоторых сторонних элементов управления, поэтому я могу протестировать пользовательский интерфейс моего приложения с помощью VS-кодированных тестов пользовательского интерфейса. Я использую подход автоматизации пользовательского интерфейса для этого. В стандартных инструментах проверки они выглядели нормально, но когда я использовал построитель тестов пользовательского интерфейса с кодированием VS, все мои элементы управления рассматриваются как MSAA в названии технологии (вместо UIA), поэтому большинство моих свойств пропущено. Что мне делать, чтобы VS Coded UI рассматривал это как UIA?
Вот мой код для возврата провайдера автоматизации:
LRESULT CALLBACK ControlWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_GETOBJECT:
{
// If the lParam matches the RootObjectId, send back the RawElementProvider
if (static_cast<long>(lParam) == static_cast<long>(UiaRootObjectId))
{
CustomButton* pControl = reinterpret_cast<CustomButton*>(GetWindowLongPtr(hwnd, GWLP_USERDATA));
IRawElementProviderSimple* pRootProvider = pControl->GetUIAutomationProvider();
return UiaReturnRawElementProvider(hwnd, wParam, lParam, pRootProvider);
}
return 0;
}
...
}
Этот код вызывается, когда я использовал сложный инструмент автоматизации, такой как Ranorex или просто Inspect.exe в режиме UIA. Но с VS не было никакого запроса UiaRootObjectId.
Вместо этого это называется lParam == OBJID_CLIENT
пары. Поэтому он возвращает поставщика MSAA по умолчанию.
В случае, если кто-то застрял с той же проблемой, вот решение, которое я нашел. Вы должны создать свой собственный серверный поставщик, который будет использоваться для имени класса вашего элемента управления (это должен быть VS plugin .dll или что-то вроде этого).
Ваш пользовательский провайдер .dll должен быть помещен в каталог Visual Studio, после чего все ваши элементы управления в плагине VS cded ui будут иметь название технологии, поля и роли, которые вы описали сами. Пример для нестандартного провайдера можно найти на MSDN и других ресурсах.
Других решений пока нет …