【自动化】Java Access Bridge 使用说明
Java Access Bridge是一项在Microsoft Windows动态链接库(DLL)中公开Java Accessibility API的技术,使实现Java Accessibility API的 Java应用程序对Microsoft Windows系统上的辅助技术可见。
开启jab服务
1 、首先获取java版本信息,1.8版本以下需要首先安装依赖文件。
获取java版本信息的命令
获取java版本信息
java.exe -version
2、安装依赖文件
依赖文件下载链接
oracle官方下载链接
个人下载链接
安装依赖文件
oracle官方指导手册
图表说明
注意:(accessibility.properties放在当前用户目录下将影响当前用户的全部java程序)
3、开启jab
注意:开启JAB后,需重启java程序。
3.1、使用jabswitch.exe
在jre\bin目录下找到jabswitch.exe
使用jabswitch.exe开启和关闭jab
jabswitch.exe -enable
jabswitch.exe -disable
3.2、修改accessibility.properties文件
在\jre\lib目录或者用户目录下找到accessibility.properties文件,增加启动参数
accessibility.properties
assistive_technologies=com.sun.java.accessibility.AccessBridge
screen_magnifier_present=true
3.3、在windows轻松使用中设置
在windows轻松使用中勾选 Enable Java Access Bridge 以开启jab服务。
4、测试工具
JavaMonkey
JavaFerret
access-bridge-explorer
5 测试demo
二、针对Jab操作的类
# -*- coding: utf-8 -*-
import time
import copy
import ctypes
from rpa import log
from rpa.java._jab_structure import AccessibleContextInfo, AccessibleTextInfo, AccessibleTextItemsInfo
from rpa.java._load_dll import dll
from rpa.win32 import get_hwnd_by_title, mouse_click
MAX_BUFFER_SIZE = 10240
MAX_STRING_SIZE = 1024
SHORT_STRING_SIZE = 256
class JavaElement:
__slots__ = ("vmid", "ac", "vac")
def __init__(self, vmid, ac):
self.vmid = vmid
self.ac = ac
self.vac = self.ac
def __getattr__(self, attr):
try:
context_info = AccessibleContextInfo()
dll.GetAccessibleContextInfo(self.vmid, self.ac, ctypes.byref(context_info))
return context_info.__getattribute__(attr)
except AttributeError:
raise Exception(f"AttributeError:'JavaElement' object has no attribute '{attr}'")
def __getitem__(self, item):
try:
context_info = AccessibleContextInfo()
dll.GetAccessibleContextInfo(self.vmid, self.ac, ctypes.byref(context_info))
return context_info.__getattribute__(item)
except AttributeError:
raise Exception(f"AttributeError:'JavaElement' object has no attribute '{item}'")
@property
def index_array(self):
index_array = []
while True:
index = self.indexInParent # 最顶层的indexInParent=-1
if index < 0:
break
index_array.insert(0, index)
parent_ac = dll.GetAccessibleParentFromContext(self.vmid, self.ac)
if parent_ac <&#