【Python】使用Java访问桥(Java Access Bridge)来进行Java自动化操作

目标 (mù

使用Java Access Bridge来实现Java应用程序的自动化。

背景 – 背景情况

通常情况下,浏览器和Windows应用程序可以使用Selenium或UIAutomation进行自动化。然而,在Java应用程序的情况下,由于其通过Java执行环境运行,无法获取元素信息,因此很难进行自动化。
因此,经过调查,发现可以使用JavaAccessBridge来实现Java应用程序的自动化。
尝试进行验证。

关于无法在UIAutomation中获取Java Element的原因,将在另一篇文章中进行总结。

Java Access Bridge是什么?

阅读并理解公式的解释。

Microsoft Windows DLL 是一种技术,可以公开 Java Accessibility API,在 Microsoft Windows 系统上,可以通过用户辅助技术可视化 Java 应用程序和小程序中的 Java Accessibility API。

为了获取Java应用程序的信息,需要利用Java中实现的Java Accessibility API。Java Access Bridge(以下简称为JAB)通过将该API作为DLL公开,提供了从Windows访问Java应用程序元素信息的方式。JAB的具体实现包括jdk/bin/windowsaccessbridge-64.dll和jdk/bin/javaaccessbridge.dll。前者用于与Windows进行交互,后者用于与Java应用程序进行交互。

Java Accessibility API是Java Accessibility工具包的一部分,它是一组实用工具类,它支持用户辅助技术提供对实现Java Accessibility API的GUI工具包的访问。

Java Accessibility API是一种可以获取Java应用程序的GUI元素信息和事件信息的API。辅助技术是指可以捕获Java应用程序元素信息的工具,例如Access Bridge Explorer(以下简称ABE)。通过使用ABE获取的元素信息,可以操作Java应用程序。

在Microsoft Windows上运行的用户辅助技术应用程序(如屏幕阅读器)与Java Access Bridge DLL进行交互,Java Access Bridge DLL通过Java Access Bridge Java库与Java虚拟机进行交互。这些Java库与Java辅助功能实用程序进行交互。Java辅助功能实用程序收集有关在Java应用程序中发生的信息,并通过Java Access Bridge将其传输到屏幕阅读器。

解释如何从Java应用程序中获取信息。 JAB DLL是一个类库,通过使用它来与Java虚拟机(Java Accessibility Utility)进行交互。**Java辅助功能实用程序**才是获取与屏幕相关的信息的主要实体。

JAB与Java辅助工具交互,从Java应用程序中获取界面信息。

在实际操作中亲自用Python写一遍试试看

在这里,我们将使用一个名为**pyjab**的库来操作Android Studio。它的使用方式与Selenium类似,通过使用driver对象的方法进行操作。

环境和所需物品

    • Windows 10

 

    • Python 3.10

 

    • pyjab 1.1.7

 

    • OpenJDK 21

 

    • Android Studio

 

    Access Bridge Explorer(オプション)

预先准备

    JABを有効化しておくこと

打开Android Studio并尝试各种功能试试看

需要以 README.md 中的示例程序为基础进行编写。作为前提条件,需要将 jdk-21.0.1\bin\windowsaccessbridge-64.dll 放置在工作目录中。

import pyjab.jabdriver
import pathlib

# Point 1. Create a JABDriver object.
jabdriver = pyjab.jabdriver.JABDriver(title='My Application', file_path=pathlib.Path(r'C:\Program Files\Android\Android Studio\bin\studio64.exe'))

# Point 2. Find a JABElement by element name
element = jabdriver.find_element_by_name("Resource Manager")

# Point 3. Click a JABElement
element.click()

# Point 4. Get property of JABElement
name = element.name
description = element.description
role = element.role
role_en_us = element.role_en_us
states = element.states
states_en_us = element.states_en_us
object_depth = element.object_depth
index_in_parent = element.index_in_parent
children_count = element.children_count
# Return {x, y, height, width}
bounds = element.bounds
accessible_component = element.accessible_component
accessible_action = element.accessible_action
accessible_selection = element.accessible_selection
accessible_text = element.accessible_text
text = element.text
table = element.table

我们正在为Point 1创建用于操作Java应用程序的Jabdriver。创建Jabdriver与启动Jab是相同的意思。有两种方法可以创建已经启动的Java应用程序的jabdriver,也可以在启动Java应用程序后创建jabdriver。根据具体情况来选择使用哪种方法。需要注意的是,如果指定的标题与GUI显示的窗口标题不同,可能会出现”no java window found by title ‘My Application’ in ’30’seconds”等错误。在这种情况下,可以尝试检查使用win32等方式获取的窗口标题。

在第2点中,获取了操作对象的元素。在这里,使用了name属性进行指定。其他方法还有其他选择。

    • description

 

    • role

 

    • states

 

    • object depth

 

    • children count

 

    • index in parent

 

    xpath

可以通过其属性进行搜索。此外,示例程序使用了一种获得首个匹配元素的方法,但也存在一种获得所有匹配元素的方法,例如find_elements_by_name。个人感觉,name、role和object depth等属性可能非常有用。虽然我们希望能获取到xpath,但这一方法仍在调查中。

在第三点中,我们发送了有关点击元素的命令并获取了元素的信息。由于不同元素支持的命令和可获取的信息可能不同,所以需要注意。例如,如果一个可用的元素支持AccessibleAction,那么它就可以进行点击操作;如果支持AccessibleSelection,那么它就可以进行选择操作;如果支持AccessibleText,那么它就可以获取显示文本。

请查看JAB API的文档。

尝试查看Java Access Bridge API的文档。使用Java Access Bridge的流程是,

    1. 启动JAB(调用initializeAccessBridge函数)

 

    1. 检查Java应用程序是否实现了Accessibility API(调用IsJavaWindow函数)

 

    1. 获取JAB API的基本应用程序信息(调用GetAccessibleContextFromHWND函数)

 

    1. 使用JAB API操作Java应用程序(调用各种Accessible函数)

 

    关闭JAB(调用shutdownAccessBridge函数)

1-3是在上述程序中的第1点总结。您可以在venv\Lib\site-packages\pyjab\jabdriver.py中查看JABDriver的Init函数的详细信息。第4点是在第2-4点中执行的。元素的数据结构在API数据结构中有所说明,可以确认可以获取哪些信息。就个人而言,AccessibleContextInfo和AccessibleTextInfo的数据使用频率较高。

请参考

针对用户辅助技术开发者的Java Access Bridge程序员指南。

一个选项:拼音是”拼音查”。

广告
将在 10 秒后关闭
bannerAds