[英]C# to automate Java application with Java Access Bridge
我有一個 Java 應用程序,我想對其進行自動化測試。 不幸的是,應用程序 window 僅注冊為 SunAWTFrame,這意味着沒有任何控件暴露給典型的 window 分析和自動化工具。
我的搜索引導我找到 C# 並在 C# 程序中使用 Java Access Bridge DLLS 來自動化它。
有沒有人有這方面的經驗?
Oracle 提供了帶有一些 DLLS 的 JavaAccessBridge (JAB) 來幫助解決這個問題,因為我在閱讀了一些關於 inte.net 的文章后理解了它。 有一些代碼示例,但我現在真的不是在摸索它。 通過分解,我認為這是需要實現的:
我不知道 C#,也不知道 Java,但這不會阻止我。
如果有人可以提供幫助、指導、指示或任何幫助我入門的東西,那真是太棒了。
基於 Stackia 關於使用 Google 的 AccessBridgeExplorer 的重要提示,以下是一些幫助您前進的提示:
在您自己的(WinForms 而不是控制台)項目中使用 WindowsAccessBridgeInterop.dll(添加 > 項目參考 > Select DLL)
新建訪問網橋 object
AccessBridge Java = new AccessBridge();
初始化接入網橋 object
Java.初始化();
Call Application.DoEvents() - 等待 Java.Initialize 完成的 hack(我的簡單理解是 Java Access Bridge Uses a hidden window or similar)
應用程序.DoEvents(); //這等待 Java 橋初始化;)
獲取 Java Window 的句柄(網上有很多關於如何在 C# 中獲取 Window 句柄的示例)
獲取代表 window 的 Java Object:
Java.Functions.GetAccessibleContextFromHWND(句柄,出 int vmid,出 JavaObjectHandle javaObjectHandle);
為 Window 獲取 AccessibleWindow Object(這樣你就可以找到它的孩子)
AccessibleWindow win = Java.CreateAccessibleWindow(handle);
想出你自己的方式來循環遍歷孩子,以及孩子的孩子,直到找到你想要的 object:
//類似於:foreach(var child in win.GetChildren()) JavaObjectHandle? javaObject = Java.Functions.GetAccessibleChildFromContext(node.JvmId, parentJavaObject, child.GetIndexInParent());
//獲取 label 或 object 的標題:
孩子.GetTitle();
要與 object 交互(例如單擊按鈕),請執行類似以下操作:(請注意它說 JavaObject 的位置 - 它表示子 java object(例如,要單擊按鈕,您需要使用 GetAccessibleChildFromContext 獲取該按鈕的 JavaObject正如我上面提到的)
//獲取可能的操作 JavaAutomation.Java.Functions.GetAccessibleActions(VMID, JavaObject, out AccessibleActions accessibleActions);
foreach( var action in accessibleActions.actionInfo) { Log.Info($"DoAction: {action.name}"); } AccessibleActionsToDo accessibleActionsToDo = new AccessibleActionsToDo(); accessibleActionsToDo.actions = accessibleActions.actionInfo; accessibleActionsToDo.actionsCount = accessibleActions.actionsCount; //Do Actions JavaAutomation.Java.Functions.DoAccessibleActions(VMID, JavaObject, ref accessibleActionsToDo, out int failure);
截至2019年,我們有一個很棒的工具AccessBridgeExplorer由Google創建並開源。 這是一個非常好的凝視點,其中包含一個WindowsAccessBridgeInterop
項目,該項目將幾乎每個JAB API封裝到面向類,.NET友好的程序集中。
一個值得注意的事情, AccessBridge.Initialize()
必須在WPF / WinForm的UI線程或在您自己的消息泵線程調用,否則有些類似方法AccessBridge.EnumJvms()
將始終返回false /空。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.