问题描述
我设法使用 jab 从 java applet 中的某些控件获取描述或名称,并且单击操作成功运行。 java小程序需要一些时间来响应点击动作,点击动作后,有时python脚本会继续运行剩余的行,但有时会崩溃并关闭而没有错误信息。在下面的代码中,我想将文本内容设置为文本框并单击按钮 5 次,不幸的是它总是在第一轮后崩溃。
在这里补充一点,我发现当我在下面的代码运行时手动单击该小程序上的某个按钮时,或者当点击操作发布并且小程序本身会做一些响应时,此时下面的代码将始终停止运行。
另外一点我发现,在python脚本运行过程中,applet中的任何状态变化都会导致python内核死亡。比如点击动作是post,小程序中会出现一些新的信息,然后python内核就死了。
import ctypes
import ctypes.wintypes
import threading
user32 = ctypes.windll.user32
import time
#=================================================================
def initialize():
bridgeDll = cdll.LoadLibrary(r'C:\XXX\windowsaccessbridge-64.dll')
# Accept wm_copydata and any wm_user messages from other processes even if running with higher privileges
if not windll.user32.ChangeWindowMessageFilter(winUser.WM_copYDATA,1):
raise WinError()
for msg in range(winUser.WM_USER + 1,0xffff):
if not windll.user32.ChangeWindowMessageFilter(msg,1):
raise WinError()
bridgeDll.Windows_run()
#=================================================================
class MyThread(threading.Thread):
def run(self):
msg = ctypes.wintypes.MSG()
initialize()
while user32.GetMessageW(ctypes.byref(msg),None,0):
user32.TranslateMessage(msg)
user32.dispatchMessageW(msg)
print('End of GetMessageW')
#=================================================================
#call dll initialize in the thread
t = MyThread()
t.start()
time.sleep(1)
#=================================================================
hwnd = 0x000D0E7A
print('java window is ',isJavaWindow(hwnd)) # java window is 1
#=================================================================
#To create instance
class JABContext(object):
def __init__(self,hwnd=None,vmID=None,accContext=None):
if hwnd and not vmID:
vmID=c_long()
accContext=JOBJECT64()
bridgeDll.getAccessibleContextFromHWND(hwnd,byref(vmID),byref(accContext))
#Record this vm ID and window handle for later use with other objects
vmID=vmID.value
vmIDsToWindowHandles[vmID]=hwnd
elif vmID and not hwnd:
hwnd = getwindowHandleFromAccContext(vmID,accContext)
self.hwnd=hwnd
self.vmID=vmID
self.accContext=accContext
def getAccessibleContextInfo(self):
info=AccessibleContextInfo()
bridgeDll.getAccessibleContextInfo(self.vmID,self.accContext,byref(info))
return info
def getAccessibleTextItems(self,index):
textItemsInfo=AccessibleTextItemsInfo()
bridgeDll.getAccessibleTextItems(self.vmID,byref(textItemsInfo),index)
return textItemsInfo
def getAccessibleChildFromContext(self,index):
accContext=bridgeDll.getAccessibleChildFromContext(self.vmID,index)
if accContext:
return self.__class__(self.hwnd,self.vmID,accContext)
else:
return None
#To input words into text controls
def setTextContents(self,word):
bridgeDll.setTextContents(self.vmID,word)
#To get actions structure
def getAccessibleActions(self):
info = AccessibleActions()
bridgeDll.getAccessibleActions(self.vmID,byref(info))
return info
#To do actions click
def doAccessibleActions(self,AccessibleActionsTodo):
info = AccessibleActionsTodo
failure = jint()
bridgeDll.doAccessibleActions(self.vmID,byref(info),byref(failure))
return failure
Jab = JABContext(hwnd = hwnd,vmID = None,accContext = None)
TextBox = Jab.getAccessibleChildFromContext(index = 0)
button = Jab.getAccessibleChildFromContext(index = 1)
#=================================================================
list_test = [1,2,3,4,5]
for num in list_test:
#set text
TextBox.setTextContents(num)
TempNum = TextBox.getAccessibleTextItems(index = 0).word
if TempNum != num:
print('input error')
print('input finished')
#click on button
getAccessibleActions = button.getAccessibleActions()
aa = button.doAccessibleActions(getAccessibleActions)
if aa == 0:
print('click failure')
print('click' finished)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)