диалоговое окно выбора файла python pywinauto

#python-3.x #openfiledialog #pywinauto

#python-3.x #openfiledialog #pywinauto

Вопрос:

Я нахожусь в процессе автоматизации обновления прошивки для определенного компонента, который мы часто используем. У меня завершена (и работает) автоматизация графического интерфейса, за исключением этого конкретного экрана.

Что мне нужно сделать, так это заставить программу автоматически перейти к нужной папке (стандартизированной для разных компьютеров) и выбрать правильный файл для использования для обновления.

Вот мой код до сих пор:

 from pywinauto.application import Application

app = Application(backend='win32').connect(title_re=".*EBDS*", found_index=0)

main_dlg = app.window(title_re=".*EBDS*", found_index=0)

main_dlg.child_window(title="Launch Control Panel", control_type="System.Windows.Forms.Button").click()

sub_dlg = app.window(title_re=".*Bill Acceptor*", found_index=0)

sub_dlg.child_window(title="Open", control_type="System.Windows.Forms.Button").click()

sub_dlg.child_window(title="Download", control_type="System.Windows.Forms.Button").click()

file_dlg = app.window(title_re=".*download*", found_index=0)
  

У него есть пара дополнительных окон, которые появляются после нажатия, таким образом, main_dlg, sub_dlg и file_dlg.

введите описание изображения здесь

Я уже сказал ему нажать кнопку загрузки, и появится окно «выбрать файл для загрузки».

Что мне нужно сделать сейчас, так это указать путь (где указано This PC), изменить тип файла (в настоящее время указано Bin files) и выбрать правильный файл.

Я выполнил «печать управляющих идентификаторов», и вот ссылка на текстовый файл этого вывода (он занимает более 3 тыс. строк, поэтому я не хотел вставлять его сюда) Control Identifiers .txt

Затем я правильно (вручную) выполнил шаги, чтобы получить его там, где он должен быть, и выполнил еще один «контроль печати идентификаторов». Опять же, это более 3 тыс. строк, поэтому вот ссылка на этот вывод.

Предполагая, что я все делаю правильно, путь к файлу в графическом интерфейсе: file_dlg.child_window(title="Select a file to download.", class_name='#32770').child_window(class_name="WorkerW").child_window(class_name="ReBarWindow32").child_window(class_name="Address Band Root").child_window(class_name="msctls_progress32").child_window(class_name="Breadcrumb Parent").child_window(title=".*Address:*", class_name="ToolbarWindow32")

Вопрос в том, как мне конкретно взаимодействовать с этим объектом? A .click() или .sendkeys() оба выдают ошибку.

Бонусные баллы, если вы можете выяснить, как изменить тип файла.

Я открыт для более простого / другого способа сделать это, однако это должно быть доступно для развертывания на паре сотен компьютеров, которые не имеют одинакового размера экрана, поэтому я не могу использовать pyautogui и количество пикселей.

Есть идеи?

Ответ №1:

Вы можете ввести полный путь к файлу в поле редактирования и нажать кнопку «Открыть». Это должно выглядеть так:

 file_dlg = app.window(title_re=".*Select a file to download*", found_index=0)
file_dlg.FileNameEdit.set_edit_text("full_path_to_file")
file_dlg.child_window(title="amp;Open", control_type="Button").click()
  

Я предполагаю, что вам нужно обойти .click_input() и .type_keys(...) использовать, поскольку они требуют активного рабочего стола, который сложно поддерживать на большом пуле машин.

Комментарии:

1. Спасибо за этот ответ, он очень полезен. Я могу использовать это, чтобы указать имя файла, однако, когда я нажимаю кнопку «открыть», появляется сообщение о недопустимом файле. Я думаю, что мне нужно, чтобы путь к файлу был указан в верхней панели. Я что-то пропустил на панели навигации?

2. Теперь я определил адресную строку как AddressEditBox и могу выделить ее. Теперь мне очень сложно пытаться отправить ему информацию, чтобы изменить каталог, который мы просматриваем. Какие-либо указатели?

3. Это похоже на неправильное поведение приложения или неправильный полный путь в какой-то небольшой точке (escape-последовательности?). Все приложения должны принимать полный путь в таком диалоговом окне. Я могу взглянуть на изменение адресной строки, но для экспериментов требуется некоторое время.