#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-последовательности?). Все приложения должны принимать полный путь в таком диалоговом окне. Я могу взглянуть на изменение адресной строки, но для экспериментов требуется некоторое время.