Продолжение автоматизации FineReader: работа над ошибками
Hints&tips, Малая механизация 28.03.2008Друзья, вынужден признать, что опубликованный мной скрипт AutoIT для автоматизации Finereader работает из рук вон плохо, кроме того неоптимален по времени и использованию ресурсов. После небольшого прохода по Google была обнаружена компания Ranorex GmbH, предлагающая замечательные средства для работы с Windows GUI. Поскольку я давно собирался начать осваивать Python, выбор скриптового языка для работы с FR не был вопросом.
Итак, под катом - очередная вариация скрипта на тему “Как автоматизировать FineReader”. Требуется Python и библиотеки Ranorex, которые скачиваются с сайта программы.
-
# coding=cp1251
-
-
import sys, re, imp, time, logging, logging.handlers
-
logging.basicConfig(level=logging.DEBUG,
-
format=‘%(asctime)s;%(levelname)s;%(message)s’,
-
filename=‘c:\\official\\py_log2.txt’,
-
filemode=‘w+’)
-
#smtp_log_handler = logging.handlers.SMTPHandler(’195.24.227.198′,’py-script@rospravo.local’,'K.Udartsev@rospravo.ru’,'Recon logger event’)
-
l01 = logging.getLogger(‘l01′)
-
#l01.addHandler(smtp_log_handler)
-
R = imp.load_dynamic(‘RanorexPython’, ‘c:\\Python25\\DLLs\\RanorexPython.dll’)
-
FRDir = ‘C:\\Program Files\\ABBYY FineReader 9.0\\‘
-
FRExecutablePath = FRDir+‘FineReader.exe’
-
DirListPath = ‘C:\\official\\lf_test.txt’
-
Number_of_retries = 10000 #x 1 sec - more than enough
-
-
def fr_start(frpath):
-
R.ApplicationStart(frpath)
-
return R.FormFindTitle("ABBYY FineReader", R.MATCH_SUBSTRING, True, 5000)
-
#return R.ApplicationGetFirst()
-
-
def main():
-
iteration = 0
-
dirList = open(DirListPath,‘r’)
-
dirs = dirList.readlines()
-
l01.debug(‘Read list of dirs; total: %d found’ %len(dirs))
-
#print str(5)+’-'+dirs[1][3:].strip().replace(’\\’,'-’)+’.pdf’
-
-
FRWnd = fr_start(FRExecutablePath)
-
l01.debug(‘Finereader window handle: %d’ %FRWnd)
-
-
if FRWnd == 0:
-
return 1
-
-
R.FormActivate(FRWnd)
-
R.Sleep(500)
-
#open file dialog
-
for dir in dirs:
-
print ‘Current directory: ‘+dir.strip()
-
logging.debug(‘Current directory: ‘+dir.strip())
-
R.ControlSendKeys(0, "{CTRLDOWN}o", 20)
-
R.ControlSendKeys(0, "{CTRLUP}", 20)
-
#
-
openFilesDlg = R.FormFindTitle(‘Open Image’,R.MATCH_EXACT, True, 500)
-
#R.FormActivate(openFilesDlg)
-
l01.debug(‘Open files dialog handle: %d’ %openFilesDlg)
-
#
-
edit_dirname = R.FormFindChildClassName(openFilesDlg, "Edit", 1)
-
l01.debug(‘edit_SrcDirName: %d’ %edit_dirname)
-
-
R.Sleep(500)
-
edit_cancelBtn = R.FormFindChildClassName(openFilesDlg, "Button", 4)
-
l01.debug(‘button_Cancel: %d’ %edit_cancelBtn)
-
-
R.Sleep(500)
-
edit_okBtn = R.FormFindChildClassName(openFilesDlg, "Button", 3)
-
l01.debug(‘button_Ok: %d’ %edit_okBtn)
-
-
R.Sleep(500)
-
ofd_element = R.ControlGetElement(openFilesDlg)
-
filesListViewEl = R.ElementFindChild(ofd_element, R.ROLE_SYSTEM_LIST,”,‘SysListView32′,R.MATCH_SUBSTRING)
-
-
R.ControlSendKeys(edit_dirname, dir, 1)
-
l01.debug(‘Set directory to ‘+dir.strip())
-
R.Sleep(150)
-
R.MouseClickElement(ofd_element,R.MOUSE_LEFT_BUTTON,100,100,1,1);
-
R.Sleep(150)
-
R.ControlSendKeys(0, "{CTRLDOWN}a{CTRLUP}", 20)
-
R.Sleep(150)
-
R.ControlSendKeys(0, "{ENTER}", 20)
-
-
processingWnd = R.FormFindTitle(‘Adding pages to the’,R.MATCH_FROM_START, True, 500)
-
processingWndEl = R.ControlGetElement(processingWnd)
-
processingWndValue = processingWndEl[2]
-
l01.debug(‘processingWndValue: ‘ + processingWndValue)
-
l01.debug(‘processingWnd: %d’ %processingWnd)
-
R.Sleep(150)
-
-
for i in xrange(Number_of_retries):
-
R.Sleep(750)
-
processingWndEl = R.ControlGetElement(processingWnd)
-
processingWndValue = processingWndEl[2]
-
opResult = processingWndValue.count(‘complete.’)
-
if opResult == 0:
-
l01.debug(‘Result: %d’ %opResult)
-
l01.debug(‘Finished; Ending operations’)
-
break
-
else:
-
l01.debug(‘Progress…’)
-
R.Sleep(500)
-
closeProcessingWndBtn = R.ElementFindChild(processingWndEl, R.ROLE_SYSTEM_PUSHBUTTON,‘Close’,‘Button’,R.MATCH_SUBSTRING)
-
R.MouseClickElement(closeProcessingWndBtn)
-
R.ControlSendKeys(0, "{CTRLDOWN}s{CTRLUP}", 20)
-
-
saveFilesDlg = R.FormFindTitle(‘Save Pages’,R.MATCH_EXACT, True, 500)
-
R.FormActivate(saveFilesDlg)
-
l01.debug(‘Save files dialog handle: %d’ %saveFilesDlg)
-
edit_save_dirname = R.FormFindChildClassName(saveFilesDlg, "Edit", 1)
-
l01.debug(‘edit_saveDirName: %d’ %edit_save_dirname)
-
-
filename = dir.strip()+‘\\‘+str(iteration)+‘-’+dir[3:].strip().replace(‘\\‘,‘-’)+‘.pdf’
-
R.ControlSetText(edit_save_dirname, filename)
-
l01.debug(‘Set save path & filename to ‘+filename)
-
R.Sleep(150)
-
R.ControlSendKeys(0, "{ENTER}", 20)
-
l01.debug(‘Saving file’)
-
-
savingWnd = R.FormFindTitle(‘Saving to file’,R.MATCH_FROM_START, True, 500)
-
savingWndEl = R.ControlGetElement(savingWnd)
-
savingWndValue = savingWndEl[2]
-
l01.debug(’savingWndValue: ‘ + savingWndValue)
-
l01.debug(’savingWnd: %d’ %savingWnd)
-
R.Sleep(150)
-
for i in xrange(Number_of_retries):
-
R.Sleep(100)
-
savingWndLoc = R.ControlGetPosition(savingWnd)
-
if savingWndLoc == None:
-
l01.info(‘Saved file’)
-
break
-
else:
-
l01.info(‘Still saving’)
-
R.Sleep(1000)
-
R.ControlSendKeys(0, "{ALTDOWN}f{ALTUP}c", 20)
-
R.Sleep(100)
-
-
dontSaveWnd = R.FormFindTitle(‘ABBYY FineReader 9.0 Professional Edition’,R.MATCH_EXACT, True, 500)
-
dontSaveWndEl = R.ControlGetElement(dontSaveWnd)
-
-
l01.debug(‘dontSaveWndEl: ‘ + dontSaveWndEl[2])
-
l01.debug(‘dontSaveWnd: %d’ %dontSaveWnd)
-
R.Sleep(150)
-
closeDontSaveWndBtn = R.ElementFindChild(dontSaveWndEl, R.ROLE_SYSTEM_PUSHBUTTON,‘Нет’,‘Button’,R.MATCH_SUBSTRING)
-
R.Sleep(150)
-
R.MouseClickElement(closeDontSaveWndBtn)
-
iteration+=1
-
return 0
-
-
if __name__ == "__main__":
-
ret = main()
-
if ret != 0:
-
print ‘Test FAILED’
-
else:
-
print ‘Test PASSED’
-
sys.exit(ret)

28.03.2008 в 19:45
Python курочить начал — молодца!
28.03.2008 в 20:20
Начал, ага. Немного непривычно, но красиво)
=)