Почему pywinauto только нажимает кнопку, когда я смотрю? - PullRequest
0 голосов
/ 08 мая 2018

Я пытаюсь, чтобы Windows Task Scheduler автоматизировал приложение с помощью pywinauto , когда я вошел в систему, но компьютер переключен на другого пользователя. В настоящее время у меня есть:

from time import sleep
from pywinauto.application import Application

app = Application(backend='uia').connect(path='program.exe')
sleep(5)
if 'System Administration' in app.top_window().window_text():
    app.top_window().SignOut.click()
    sleep(5)
    app.top_window().print_control_identifiers(filename='controls.txt')

В этот момент, control.txt имеет:

Control Identifiers:


Dialog - 'System Administration - V6.0.3'    (L448, T158, R1471, B922)
[u'System Administration - V6.0.31', u'System Administration - V6.0.30', u'System Administration - V6.0.3', u'System Administration - V6.0.3Dialog', u'Dialog']
child_window(title="System Administration - V6.0.3", control_type="Window")

   | 
...
   | 
   | Button - 'Sign out'    (L980, T399, R1120, B444)
   | ['Button8', u'Sign out', u'Sign outButton']
   | child_window(title="Sign out", control_type="Button")

   | 

Указывает, что кнопка «Выйти» не была нажата, потому что теперь это должен быть следующий набор меню. Что меня действительно смутило, так это то, что если я вошел в систему и смотрю приложение, то все работает правильно: кнопка нажата, и приложение переходит к следующему набору меню.

Другие вещи, которые я пробовал:

pywinauto.actionlogger.enable() Результат:

2018-05-06 16:15:15,145;INFO
Invoked button "Sign out"

(но по-прежнему не нажимает кнопку)

app.top_window().SignOut.click_input() Результат:

2018-05-07 12:00:11,730;ERROR
Traceback (most recent call last):
  File "myscript.py", line 7, in <module>
    app.top_window().SignOut.click_input()
  File "C:\Python27\lib\site-packages\pywinauto\base_wrapper.py", line 671, in click_input
    key_down=key_down, key_up=key_up)
  File "C:\Python27\lib\site-packages\pywinauto\mouse.py", line 125, in _perform_click_input
    win32api.SetCursorPos((coords[0], coords[1]))
error: (0, 'SetCursorPos', 'No error message is available')

Я не знаю, что это значит. Наличие планировщика заданий «Запуск с самыми высокими привилегиями» приводит к:

2018-05-08 08:45:05,908;ERROR
Traceback (most recent call last):
  File "myscript.py", line 4, in <module>
    app = Application(backend='uia').connect(path='program.exe')
  File "C:\Python27\lib\site-packages\pywinauto\application.py", line 955, in connect
    self.__warn_incorrect_bitness()
  File "C:\Python27\lib\site-packages\pywinauto\application.py", line 1028, in __warn_incorrect_bitness
    if self.backend.name == 'win32' and self.is64bit() != is_x64_Python():
  File "C:\Python27\lib\site-packages\pywinauto\application.py", line 1043, in is64bit
    return handleprops.is64bitprocess(self.process)
  File "C:\Python27\lib\site-packages\pywinauto\handleprops.py", line 172, in is64bitprocess
    phndl = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED, 0, process_id)
error: (5, 'OpenProcess', 'Access is denied.')

(Это также сбивает с толку, потому что Python и программа 32-битные.)

Как я могу заставить pywinauto нажимать кнопку, когда я переключаюсь на другую учетную запись пользователя?

1 Ответ

0 голосов
/ 08 мая 2018

Когда пользователь Windows заблокирован, у вас нет активного рабочего стола. Таким образом, любой инструмент автоматизации GUI не будет работать. Это ограничение ОС. У вас должна быть виртуальная машина или удаленная машина с RDP в оконном режиме (не свернутом). Программное обеспечение сервера VNC может заменить RDP с возможностью отключения, сохраняя активный рабочий стол все время (например, сервер VNC). Или специальная настройка mstsc должна быть установлена, чтобы позволить минимизацию.

Эта проблема SetCursorPos может рассматриваться и для подтверждения безопасности UAC. Это тоже дизайн ОС.

P.S. Убедитесь, что запускаете скрипт от имени администратора. В настоящее время о таких проблемах ничего не говорится, но 0.6.5 предупредит о недостаточных привилегиях.

...