【Python】使用Java访问桥(Java Access Bridge)来进行Java自动化操作
目标 (mù使用Java Access Bridge来实现Java应用程序的自动化。
背景 – 背景情况通常情况下,浏览器和Windows应用程序可以使用Selenium或UIAutomation进行自动化。然而,在Java应用程序的情况下,由于其通过Java执行环境运行,无法获取元素信息,因此很难进行自动化。
因此,经过调查,发现可以使用JavaAccessBridge来实现Java应用程序的自动化。
尝试进行验证。
因此,经过调查,发现可以使用JavaAccessBridge来实现Java应用程序的自动化。
尝试进行验证。
关于无法在UIAutomation中获取Java Element的原因,将在另一篇文章中进行总结。
Java Access Bridge是什么?阅读并理解公式的解释。
Microsoft Windows DLL 是一种技术,可以公开 Java Accessibility API,在 Microsoft Windows 系统上,可以通过用户辅助技术可视化 Java 应用程序和小程序中的 Java Accessibility API。
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
-
- 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
需要以 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的流程是,
-
启动JAB(调用initializeAccessBridge函数)
- 启动JAB(调用initializeAccessBridge函数)
-
- 检查Java应用程序是否实现了Accessibility API(调用IsJavaWindow函数)
-
- 获取JAB API的基本应用程序信息(调用GetAccessibleContextFromHWND函数)
-
- 使用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程序员指南。
一个选项:拼音是”拼音查”。