簡體   English   中英

C# 使用 Java Access Bridge 自動化 Java 應用程序

[英]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 的文章后理解了它。 有一些代碼示例,但我現在真的不是在摸索它。 通過分解,我認為這是需要實現的:

  1. 導入/加載/解析 JAB dll
  2. Map JAB 中的函數 dll 到我程序中的方法/調用
  3. 讓 Java 應用程序自動運行(啟用 JAB)並將其處理到我的程序
  4. 利用 JAB 功能控制 Java 應用程序

我不知道 C#,也不知道 Java,但這不會阻止我。

如果有人可以提供幫助、指導、指示或任何幫助我入門的東西,那真是太棒了。

基於 Stackia 關於使用 Google 的 AccessBridgeExplorer 的重要提示,以下是一些幫助您前進的提示:

  • 下載Access Bridge Explorer

  • 在您自己的(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM