2015-12-18 3 views
3

Я использую PyAutoGUI-библиотеку Python для автоматизации графического интерфейса. Приложение, которое я автоматизирую, открывает новое окно после того, как я закончил запись данных в текущем окне. Все заботится о автоматизации python (ввод данных в текущем окне и щелчок, необходимый для открытия окна).Windows Desktop GUI Automation с использованием Python - Сон против жесткого цикла

Когда щелчок выполняется в текущем окне, новое окно занимает некоторое время, чтобы открыть (может варьироваться от 2 до 5 секунд). Таким образом, есть два варианта, которые я могу думать здесь:

  1. сон с помощью time.sleep(5) (Con: 3 секунды может быть впустую излишне)
  2. Спина в тугой петле до на экране появится окно. PyAutoGUI предлагает функцию locateOnScreen, которая может быть использована, чтобы узнать, действительно ли окно появилось на экране. (Тем не менее, это интенсивность процессора, а сама функция имеет интенсивность процессора и занимает почти 2 секунды)

Так что это выглядит [1], это лучший вариант для меня. Есть ли какая-то другая техника, которую я, возможно, пропустил, был бы лучше, чем любой из этих двух методов? Благодарю.

+0

Вариант 1 - это путь – Ruslan

+2

Любой из них ошибается. Вам нужно будет использовать [Автоматизация пользовательского интерфейса] (https://msdn.microsoft.com/en-us/library/windows/desktop/ee684009.aspx) и [WinEvents] (https://msdn.microsoft.com /en-us/library/windows/desktop/dd373868.aspx), чтобы получать уведомления о создании или уничтожении окон. – IInspectable

ответ

5

Для Windows только автоматизация графического интерфейса pywinauto является более полнофункциональной (и пифонической). Он неявно ждет некоторое время по умолчанию и допускает явное ожидание (внутри неинтенсивного цикла нет процессора: вид паузы в 0,1 сек и быстрая проверка изменений, затем ожидание снова).

Функция PyAutoGUI locateOnScreen использует расширенный анализ скриншота. Вот почему он настолько интенсивен (но кросс-платформенный).

pywinauto пример:

from pywinauto import Application 

app = Application().start(u'your_app.exe') 
app.MainWindow.MenuSelect(u'File->Open') 

app.OpenDialog.Edit.SetEditText(u'some path') 
app.OpenDialog.Open.Click() 
app.OpenDialog.WaitNot('visible', timeout=10) 

new_main_window = app.Window_(title_re='^.* - The Software$') 
new_main_window.Wait('ready', timeout=15) 

Getting Started Guide является хорошей отправной точкой для изучения основной pywinauto концепции.

+0

Спасибо за ваш ответ и высокую оценку за уважаемую библиотеку 'pywinauto' !! Однако я вижу, что некоторые вещи не работают так, как ожидалось для меня. Например, когда я пытаюсь использовать 'app.UntitledNotepad.Edit.TypeKeys (« hello »)' в консоли, все, что я получаю, это «привет», напечатанное на консоли, а не в «Блокноте», который я открыл с помощью «pywinauto». Я использую python версии 3.4.3 и pywinauto версии 0.5.4 – toddlermenot

+0

Ну, похоже, что это происходит только тогда, когда одновременно открываются несколько несохраненных блокнотов. – toddlermenot

+1

Мы все должны сказать спасибо Марку, который сделал такую ​​классную библиотеку. Мы просто пытаемся расширить его. BTW, метод 'TypeKeys' должен автоматически настраивать фокус на целевое окно. Или вы можете явно «app.UntitledNotepad.SetFocus()» явно. –

0

Я бы выбрал вариант, но я бы спал в течение 2 секунд, если это минимальное среднее время, необходимое для открытия окна. Через 2 секунды я проверю, появилось ли окно, а если нет, то я снова буду спать 2 секунды. Это могло бы сэкономить больше времени, чем спать в течение 5 секунд.

Но поскольку попытка проверить, что окно является интенсивным и трудоемким процессом, я думаю, что ожидание в течение 5 секунд было бы лучше всего.

+0

Спасибо, проблема со спящим в течение 2 секунд заключается в том, что без оконного рисунка остальная часть кода автоматизации (которая должна выполняться на новых ветрах) выполняется, вызывая неожиданные результаты, такие как другие фоновые окна, сводятся к минимуму или закрывают некоторые другие фоновое окно. – toddlermenot

+0

Мой ответ не был ясен, и я также не принимал во внимание, что функция поиска окна интенсивна. Вы правы, ожидая 5 секунд, это лучший подход. – masnun