Если то, что вы действительно ищете, является хорошим предлогом, чтобы научиться взаимодействовать с другими приложениями, это может быть не лучшим вариантом. Веб-браузеры беспорядочные, время будет непредсказуемым и т. Д. Итак, вы взяли на себя очень сложную задачу, которую было бы очень легко, если бы вы сделали это обычным способом (поговорите с сервером напрямую, создайте текстовый файл напрямую и т. д., не касаясь других программ).
Но если вы действительно хотите взаимодействовать с другими приложениями, существует множество различных подходов, и то, что подходит, зависит от типов приложений, с которыми вам нужно иметь дело.
Некоторые приложения предназначены для автоматизации извне. В Windows это почти всегда означает COM-интерфейс, обычно с интерфейсом IDispatch, для которого вы можете использовать COM-оболочки pywin32
; на Mac это означает интерфейс AppleEvent, для которого вы используете ScriptingBridge
или appscript
; на других платформах универсального стандарта нет. IE (но, вероятно, не Chrome) и Word имеют такие интерфейсы.
Некоторые приложения имеют интерфейс без графического интерфейса пользователя - будь то командная строка, которую вы можете использовать с popen
, или DLL / SO / DYLIB, которые вы можете загрузить с помощью ctypes
. Или, в идеале, кто-то другой уже написал для вас привязки Python.
В некоторых приложениях нет ничего, кроме графического интерфейса, и автоматизировать графический интерфейс невозможно. Вы можете сделать это на низком уровне, создав сообщения WM_ для отправки через pywin32
в Windows, используя API специальных возможностей на Mac и т. Д., Или на несколько более высоком уровне с библиотеками, такими как pywinauto
, или, возможно, на очень высоком уровне selenium
или аналогичные инструменты, созданные для автоматизации определенных приложений.
Таким образом, вы можете сделать это с чем угодно, от селена для Chrome и автоматизации COM для Word до создания всех сообщений WM_ самостоятельно. Если это должно быть учебное упражнение, вопрос в том, что из этого вы хотите выучить сегодня.
Начнем с автоматизации COM. Используя pywin32
, вы получаете прямой доступ к собственным интерфейсам сценариев приложения без необходимости брать на себя управление графическим интерфейсом пользователя, выясните, как для навигации по меню и диалоговым окнам и т. д. Это современная версия написания «макросов Word» - макросы могут быть внешними скриптами, а не внутри Word, и их не нужно писать на VB, но они выглядят очень похоже. Последняя часть вашего скрипта будет выглядеть примерно так:
word = win32com.client.dispatch('Word.Application')
word.Visible = True
doc = word.Documents.Add()
doc.Selection.TypeText(my_string)
doc.SaveAs(r'C:\TestFiles\TestDoc.doc')
Если вы посмотрите Microsoft Word Scripts, то увидите множество примеров. Однако вы можете заметить, что они написаны на VBScript. И если вы посмотрите на руководства, все они написаны для VBScript (или более старого VB). А документация для большинства приложений написана для VBScript (или VB, .NET или даже низкоуровневого COM). И все известные мне руководства по использованию автоматизации COM из Python, например Quick Start to Client Side COM and Python, написаны для людей, которые уже знают об автоматизации COM и просто хотят знать, как это сделать с помощью Python. Тот факт, что Microsoft постоянно меняет названия всего, еще больше усложняет поиск - как вы догадались, что поиск в Google для автоматизации OLE, сценариев ActiveX, Windows Scripting House и т. Д. Будет иметь какое-то отношение к изучению автоматизации COM? Итак, я не уверен, что порекомендовать для начала. Я могу пообещать, что после того, как вы выучите всю эту ерунду, все будет так просто, как кажется из приведенного выше примера, но я не знаю, как преодолеть это первоначальное препятствие.
В любом случае, не каждое приложение можно автоматизировать. А иногда, даже если это так, описать действия графического интерфейса (то, что пользователь щелкнет на экране) проще, чем думать в терминах объектной модели приложения. «Выбрать третий абзац» сложно описать в терминах графического интерфейса пользователя, но «выбрать весь документ» легко - просто нажмите Ctrl-A или перейдите в меню «Правка» и выберите «Все». Автоматизация GUI намного сложнее, чем автоматизация COM, потому что вам нужно либо отправлять приложению те же сообщения, которые сама Windows отправляет для представления ваших действий пользователя (например, см. "Menu Notifications") или, что еще хуже, создавать сообщения мыши, такие как "go (32, 4) пикселей сверху- в левом углу щелкните мышью вниз на 16 пикселей, щелкните еще раз «чтобы сказать» откройте меню «Файл», затем щелкните «Создать».
К счастью, существуют такие инструменты, как pywinauto
, которые объединяют оба вида средств автоматизации графического интерфейса пользователя, чтобы сделать его намного проще. И есть такие инструменты, как swapy
, которые могут помочь вам определить, какие команды вы хотите отправить. Если вы не связаны с Python, есть также такие инструменты, как AutoIt
и _ 14_, которые даже проще, чем использовать swapy
и pywinauto
, по крайней мере, когда вы только начинаете. Таким образом, последняя часть вашего скрипта может выглядеть так:
word.Activate()
word.MenuSelect('File->New')
word.KeyStrokes(my_string)
word.MenuSelect('File->Save As')
word.Dialogs[-1].FindTextField('Filename').Select()
word.KeyStrokes(r'C:\TestFiles\TestDoc.doc')
word.Dialogs[-1].FindButton('OK').Click()
Наконец, даже со всеми этими инструментами веб-браузеры очень сложно автоматизировать, потому что каждая веб-страница имеет свои собственные меню, кнопки и т. Д., Которые не являются элементами управления Windows, а являются HTML. Если вы не хотите полностью опуститься до уровня «переместите мышь на 12 пикселей», с этим очень трудно справиться. Вот где приходит selenium
- он создает сценарии для веб-интерфейса пользователя так же, как pywinauto
сценарии для графического интерфейса пользователя Windows.
person
abarnert
schedule
11.01.2013
urllib2
иBeautifulSoup
). - person Matteo Italia   schedule 12.01.2013