UI Automation Ngate Client Win QT
От: Разраб  
Дата: 31.08.23 03:53
Оценка: 1 (1)
Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.
Вот решил попробовать автоматизировать.
UI Automation кнопку находит, но invoke никакого действия не производит(требуется нажатие).
т.е. вот так(F# .Net FX) кнопка только выделяется но нажатия не происходит.


#r "UIAutomationClient.dll"
#r "UIAutomationTypes.dll"

open System.Diagnostics
open System.Windows.Automation

let ng = Process.GetProcesses() |> Array.tryFind(fun p -> p.ProcessName = "ngateclient")

let root = AutomationElement.FromHandle ng.Value.MainWindowHandle

let button_id =  "MainWindow.centralWidget.tabWidget.qt_tabwidget_stackedwidget.statusTab.connectPushButton"

let btn = root.FindFirst ( TreeScope.Subtree, PropertyCondition( AutomationElement.AutomationIdProperty, button_id))

let inv = btn.TryGetCurrentPattern(InvokePattern.Pattern)

let ip = inv |> snd :?> InvokePattern

btn.SetFocus(); ip.Invoke()


Есть идеи? Еще вопрос. SendKeys работает в терминальном режиме (например в сессии тимвьюера)? У меня подозрение что как то это мониторится и не работает по хорошему.

Пока думаю так сделать. Но нужно будет как-то определять состояние кнопки, визуально что-то нет желания. Возможно по логу службы или по доступности хоста.
UI текст не дает.

#r "UIAutomationClient.dll"
#r "UIAutomationTypes.dll"

open System.Windows.Forms
open System.Diagnostics
open System.Windows.Automation
open System.Threading

Process.Start @"c:\Program Files\Crypto Pro\NGate\ngateclient.exe" |> ignore
Thread.Sleep 5_000

let ng = Process.GetProcesses() |> Array.tryFind(fun p -> p.ProcessName = "ngateclient")

let root = AutomationElement.FromHandle ng.Value.MainWindowHandle

let button_id =  "MainWindow.centralWidget.tabWidget.qt_tabwidget_stackedwidget.statusTab.connectPushButton"
let btn = root.FindFirst ( TreeScope.Subtree, PropertyCondition( AutomationElement.AutomationIdProperty, button_id))


btn.SetFocus(); SendKeys.SendWait("{ENTER}")


System.Windows.Automation.AutomationElement+AutomationElementInformation
    {AcceleratorKey = "";
     AccessKey = "";
     AutomationId = "MainWindow.centralWidget.tabWidget.qt_tabwidget_stackedwidget.statusTab.connectPushButton";
     BoundingRectangle = 154;102;205;50;
     ClassName = "QPushButton";
     ControlType = System.Windows.Automation.ControlType;
     FrameworkId = "Qt";
     HasKeyboardFocus = false;
     HelpText = "";
     IsContentElement = true;
     IsControlElement = true;
     IsEnabled = true;
     IsKeyboardFocusable = true;
     IsOffscreen = false;
     IsPassword = false;
     IsRequiredForForm = false;
     ItemStatus = "";
     ItemType = "";
     LabeledBy = null;
     LocalizedControlType = "особый";
     Name = "";
     NativeWindowHandle = 0;
     Orientation = None;
     ProcessId = 7140;}
☭ ✊ В мире нет ничего, кроме движущейся материи.
Отредактировано 31.08.2023 4:14 Разраб . Предыдущая версия .
Re: UI Automation Ngate Client Win QT
От: Михаил Романов Удмуртия https://mihailromanov.wordpress.com/
Дата: 31.08.23 09:02
Оценка: 2 (1)
Здравствуйте, Разраб, Вы писали:

Р>Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.

Р>Вот решил попробовать автоматизировать.
Р>UI Automation кнопку находит, но invoke никакого действия не производит(требуется нажатие).
Р>т.е. вот так(F# .Net FX) кнопка только выделяется но нажатия не происходит.
А точно должна?
Я поискал хоть какое-то упоминание, что QT поддерживает UI Automation, но ничего не нашел.
То, что вы смогли найти некий элемент — скорее всего заслуга того, что разработчики QT все же проецируют частично свои элементы на Win32 GUI, а вот дальше — как повезет.

Скорее всего, контрол, который вы нашли, даже не реализует InvokePattern, поэтому вызывать для него Invoke бесполезно (т.е. UI Automation не считает эту "кнопку" кнопкой).
Можно, в теории попробовать кликать по области, но по моему это в UI Automation сделать не так и просто (с ходу я нашел варианты только через хардкорный вариант с Win32).

Имхо, самое разумное — поискать другой инструмент.
Можете специализированный для QT (это наилучший вариант), но если нужно только щелкать по кнопкам, может подойти и что-то попроще, типа https://www.autoitscript.com/
Re: UI Automation Ngate Client Win QT
От: karbofos42 Россия  
Дата: 31.08.23 10:46
Оценка: 3 (1)
Здравствуйте, Разраб, Вы писали:

Р>Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.

Р>Вот решил попробовать автоматизировать.

Может попробовать разобраться с консольным клиентом, а не GUI?
https://cpdn.cryptopro.ru/content/ngate/client-user-guide/source/client-ngate-user-guide/user-windows/concept-client-console-windows.html
Re: UI Automation Ngate Client Win QT
От: zubactik  
Дата: 31.08.23 12:16
Оценка:
для автоматизации (стабильной) работы Qt приложений нужны свои средства, иногда можно по картинкам, но проще делать какой-то вариант с отслыкой команд в приложение (пусть клиент на сокете каком-то слушает соединение и выполняет команды)
Re[2]: UI Automation Ngate Client Win QT
От: Разраб  
Дата: 31.08.23 13:41
Оценка:
Здравствуйте, karbofos42, Вы писали:

K>Здравствуйте, Разраб, Вы писали:


Р>>Ngate Client под windows от крипто про не имеет насколько я понял возможностей мониторинга и автоподключения.

Р>>Вот решил попробовать автоматизировать.

K>Может попробовать разобраться с консольным клиентом, а не GUI?

K>https://cpdn.cryptopro.ru/content/ngate/client-user-guide/source/client-ngate-user-guide/user-windows/concept-client-console-windows.html

спасибо. завтра проверю, но вроде в моем установщике консольной не было. и на форуме народ спрашивал. там ответили что в бете переподключение реализовано при коротких разрывах.
☭ ✊ В мире нет ничего, кроме движущейся материи.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.