2017-02-13 8 views
1

Как я могу написать «привет» в первом поле диалогового окна «Добавить в архив» 7-zip?pywinauto: Как выбрать этот диалог? Какой шпионский инструмент использовать? Какая информация мне нужна?

мне удалось до сих пор, чтобы вызвать 7-Zip (Windows 64x) «Добавить в архив» диалог с помощью этого

from pywinauto.application import Application 
app = Application().start(r"C:\Program Files\7-Zip\7zFM.exe") #set the app 
app.top_window_().Edit.type_keys(r"C:\Users\me\Desktop{ENTER}") 
app.top_window_().SysListView32.Select(r'test.txt') #select files in list 
app.top_window_().ToolbarAdd.TypeKeys("{ENTER}") #apply 

Тогда я не могу выбрать Добавить в диалоге архивирования.

1: Это не сработало. Я думаю, потому что он не нашел диалог. Если да, то почему?

app.window(title_re="Add to Archive", class_name="#32770").print_control_identifiers() 

2: Это также не работает:

app.window(title_re="Add to Archive", class_name="#32770").Edit.type_keys("hello") 

3: Я пытался найти все доступные диалоги на мое приложение с помощью print(app.windows())

Но он печатает это:

[<pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004033D68>, <pywinauto.controls.common_controls.ToolTipsWrapper object at 0x0000000004089128>, <pywinauto.controls.hwndwrapper.HwndWrapper object at 0x0000000004089208>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x 
00000000040893C8>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004089390>] 

Я не вижу окна «Добавить в архив», почему? Что это за вещи (например, in32_controls.DialogWrapper)?

печати экран различных инструментов шпиона шпиона ++ для диалогового enter image description here

шпиона ++ на первый элемент управления (это говорит Edit, но а.е. enter image description here

inspect.exe для диалога: enter image description here

+0

Но, 7zip может быть вызван из командной строки [] (https: // sevenzip. osdn.jp/chm/cmdline/syntax.htm), почему бы не использовать это? –

+0

@PeterWood это хорошо знать, спасибо! Но я хочу полностью понять pywinauto (это своего рода упражнение, чтобы осваивать его основную функцию) –

ответ

1

Я вижу 7zFM.exe порождает другой процесс (это даже другой исполняемый файл!) С этим диалоном г. Вам нужно подключиться к новому процессу.

app2 = Application().connect(path='7zG.exe', title='Add to Archive') 
app2.AddToArchive.print_control_identifiers() 

[EDIT]

Если открыть диспетчер задач (вкладка "Подробности" на Win8.1 или Win10) вы увидите процесс 7zG.exe. Другой способ увидеть это: в Spy ++, когда вы смотрите на иерархию окон, щелкните правой кнопкой мыши по диалоговому окну «Добавить в архив» и выберите «Свойства», затем переключитесь на вкладку с помощью значения ProcessID (оно отображается как шестнадцатеричное число). Сравните аналогичное число для диалогового окна «Диспетчер файлов». Существуют разные идентификаторы ProcessID!

В Inspect.exe вы также можете увидеть свойство ProcessId (== 5304 на скриншоте). Найти это значение в диспетчере задач/Подробности/столбец PID.

+0

Извините, но я не понимаю. 'Я вижу, что 7zFM.exe порождает другой процесс (это еще один исполняемый файл!) С этим диалогом. ', Но где (или как) вы это видите? Вы имеете в виду, что вы видите это на инструменте проверки, если это так? (Вы используете средство inspect.exe или spy ++, чтобы увидеть это? Или какой?) Я не вижу на экране выше 7zG.exe, я в замешательстве. –

+0

Я добавил в диалоговом окне print.exe экран (отредактированный вопрос). Он не упоминает 7zG.exe. (Я еще более запутан) –

+1

Если вы откроете диспетчер задач (вкладка «Сведения» на Win8.1 или Win10), вы увидите процесс '7zG.exe'. Другой способ увидеть это: в Spy ++, когда вы смотрите на иерархию окон, щелкните правой кнопкой мыши по диалоговому окну «Добавить в архив» и выберите «Свойства», затем переключитесь на вкладку с помощью значения ProcessID (оно отображается как шестнадцатеричный номер). Сравните аналогичное число для диалогового окна «Диспетчер файлов». Существуют разные идентификаторы ProcessID! –

1

Василий уже ответил на вопрос. Я просто хотел собрать все пункты, упомянутые в комментариях и в latest docs). (Ответы в курсивом). Не стесняйтесь заполнять отверстия, оставшиеся в этом базовом туто (осталось несколько вопросов), или исправить.


1/Я не могу подключиться к этому диалоговому

app.window(title_re="Add to Archive", class_name="#32770").print_control_identifiers() 

Ответ: это не работает, потому что это другой процесс. Так что это новое приложение (app2). Поэтому вам нужно подключиться к нему (некоторые приложения могут запускать новый процесс для каждого запускаемого окна).

Для некоторых приложений вам также необходимо указать «бэкэнд», по умолчанию это «win32». Если инструмент шпиона (см ниже) можно увидеть «управление» (имя, класс и т.д. каждое поле, кнопку ...) в режиме «ерд», вы должны использовать Application(backend='uia')

Чтобы восстановить связь необходимо сделать снова app2=Application().connect(path='7zG.exe'), затем выбрать управление

Похоже, что чем больше вы указываете материал для подключения, тем легче он будет подключаться. Вероятно, поэтому Василий использовал путь + название. Я просто хотел показать, что он также работает только с заголовком - в этом случае

2/да, но я знаю, что это новый процесс?

Ответ: Вы можете видеть это в шпионском инструменте (cf 6/и внизу экрана для печати).

3/Я не могу выбрать элемент управления (введите текст в поле) в этом диалоге:

app.window(title_re="Add to Archive", class_name="#32770").Edit.type_keys("hello") 

Ответ: это нормально, вам нужно сначала подключиться к диалогу. Сначала подключите к app2 (см выше), то сделать это:

app2.window(title_re="Add to Archive", class_name="#32770").Edit1.type_keys(r"great success!", with_spaces = True) 

4/Я пытался найти все доступные диалоги на моем приложении с помощью print(app.windows()) Но он печатает эти (и другие странные вещи):

[<pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004033D68>, <pywinauto.controls.common_controls.ToolTipsWrapper object at 0x0000000004089128>, <pywinauto.controls.hwndwrapper.HwndWrapper object at 0x0000000004089208>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x 
00000000040893C8>, <pywinauto.controls.win32_controls.DialogWrapper object at 0x0000000004089390>] 

Я не вижу окна «Добавить в архив», почему? Что это за вещи (например, in32_controls.DialogWrapper)?

ответ: «он возвращает действующие обертки для каждого окна». Каждая из этих строк - это местоположение (адрес) памяти объекта. Я не знаю, как использовать их

Вы можете получить текст с помощью print ([w.window_text() for w in app.windows()]) (распечатать, что ['C:\\Users\\Me\\Desktop\\', '', '', 'M', 'Default IME'] Понятия не имею, что делает это средство.)

5/Если я получаю всю информацию, необходимую для доступ к этим диалогом и управлению, действительно ли мне нужно распечатать этот список диалогов или элементов управления?

Не знаю. Я еще не полностью понял необходимость распечатки списка диалогов.Но я понимаю (возможно), что этот список управления предлагает способ сократить код. Например. он дает такие вещи, как AddToArchive. Вместо сочинительство app2.window(title_re="Add to Archive"). вы могли бы написать app2.AddToArchive.

6/Spy ++ и inspect.exe даже не показывает процесс (плюс вторая тяжелая и багги)

Ответ: лучший инструмент шпионажа кажется чтобы быть одним из AutoHotkey (ниже печатного экрана AU3_Spy.exe). Он показывает имя/класс/процесс и даже имя элемента управления (и другие вещи) в крошечном окне без загрузки CPU. И в отличие от 2 других шпионских инструментов, AutoHotkey дает правильное имя управления

Обратите внимание, что названия управления меняются от одного шпионского инструмента к другому. Наиболее точным представляется тот, который был сделан с autohotkey (все тесты работали до сих пор). И это дает только то, что вам нужно, а другой инструмент шпионажа показать много бесполезных вещей Зависит, что вам нужно (например, процесс и реальные имена элементов управления)

enter image description here

Вы найдете кучу инструмента-шпиона here Acc explorer complete nice Ahk (Он делает то же самое, что и шпион ++, но только лучше).

(Вы можете использовать мои скриншоты)


Дополнительные советы:

Есть ли способ сократить код?

.window(title_re="Add to Archive", class_name="#32770") 

эквивалентно .AddtoArchive. Таким образом, можно было бы написать:

app2.AddtoArchive.type_keys(r"great success!", with_spaces = True) 

Idem для других приложений, как Дитто:

dittoApp=Application().connect(path='Ditto.exe') 
ditto_dialog=ditto.window(best_match='Ditto') 

эквивалентно:

ditto=Application().connect(path='Ditto.exe') 
dittoApp.Ditto 

Есть ли список действий, я могу играть с? Вы будете делать here много действий, которые вы могли бы выполнить (в списке, кнопке, поле редактирования ...).

Вы можете перечислить все доступные методы объекта с помощью:

print(dir(dlg_spec.wrapper_object())) 

например:

print(dir(ditto.ditto.SysListView321.wrapper_object())) 

Вам необходимо импортировать модули pywinauto перед их использованием! Модули - это класс, который вам необходимо импортировать (например: pywinauto.application module) Использовать them не забывайте импортировать класс!Ex использовать один из перечисленных метода в findbestmatch module вам нужно: from pywinauto import findbestmatch

Другой пример: вам нужно from pywinauto import keyboard использовать SendKeys('^a^c')

+1

Спасибо! Добавлен [запрос функции 311] (https://github.com/pywinauto/pywinauto/issues/311) для документов. –