Продолжение автоматизации FineReader: работа над ошибками
March 28th, 2008 | рубрики Hints&tips, Малая механизация
Друзья, вынужден признать, что опубликованный мной скрипт 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)
Похожих записей нет.
2 Комментариев
March 28th, 2008
Python курочить начал — молодца!
March 28th, 2008
О-хо-хо, какие люди
Начал, ага. Немного непривычно, но красиво)
=)
Добавить комментарий