GUI Автоматизация изменения политики для кнопки выхода из системы. pywinauto.findwindows.ElementNotFoundError: ошибка. Как поменять контекст? - PullRequest
2 голосов
/ 06 марта 2019

enter image description here

Я автоматизирую шаги по изменению политики для кнопки выхода из системы.Шаги включают в себя:

  1. Открыть локальную групповую политику с помощью gpedit.msc

  2. Выберите «Меню Пуск и Панель задач» из раскрывающегося списка в конфигурации пользователя> Административный шаблон с левой панели

  3. На правой панели дважды щелкните «Изменить кнопку питания в меню Пуск»

  4. Выберите переключатель«Включено»

  5. В раскрывающемся меню параметров: выберите «Выход из системы»

Я прошел третий этап, но у меня естьпроблема в отображении «Изменить кнопку питания меню Пуск» из второго шага.Мой код выглядит следующим образом:

from pywinauto import Application

Application().start(r'mmc gpedit.msc') 
app = Application(backend="uia").connect(path='mmc.exe')
#app.LocalGroupPolicyEditor.dump_tree()

Admin_template = app.LocalGroupPolicyEditor.child_window(title="User 
Configuration", control_type="TreeItem").child_window(title="Administrative 
Templates", control_type="TreeItem") # since there are same templates 
Admin_template.double_click_input() # it expands the subtree
#Admin_template.dump_tree()

Start_menu = Admin_template.child_window(title="Start Menu and Taskbar", 
control_type="TreeItem").double_click_input()
Start_menu.dump_tree()
#Admin_template.child_window(title="Start Menu and Taskbar", 
control_type="TreeItem").dump_tree()

#Change_start_menu = Start_menu.child_window(title="Change Start Menu power 
#button", control_type="MenuItem").double_click_input()
#Change_start_menu.dump_tree()

У меня проблемы с поиском и отображением элементов в правой панели.Также, когда я использую Start_menu.dump_tree(), отображаются только элементы «Уведомления».Однако остальное, в том числе «Кнопка включения меню« Пуск »», - это то, что я дважды щелкну следующим.

enter image description here

Я ценю помощь,Спасибо.

1 Ответ

2 голосов
/ 14 марта 2019

Это было довольно сложно, но это должно сделать работу (она выполняет все шаги, которые вы перечислили - нажимает ОК - и закрывает программу):

import pywinauto

pywinauto.Application().start(r'mmc gpedit.msc') 
app = pywinauto.Application(backend="uia").connect(path='mmc.exe')

admin_template = app.LocalGroupPolicyEditor.child_window(title="User Configuration", control_type="TreeItem").child_window(title="Administrative Templates", control_type="TreeItem")
admin_template.double_click_input()

start_menu = admin_template.child_window(title="Start Menu and Taskbar", control_type="TreeItem")
start_menu.double_click_input()

option_list = app.LocalGroupPolicyEditor.child_window(auto_id="12786", control_type="List")

# Just select any of the first options to change the focus to the list.
first_elem = option_list.child_window(title="Add Search Internet link to Start Menu", control_type="ListItem")
first_elem.click_input()

# Used to scroll down the window so that the wanted option becomes visible.
pywinauto.keyboard.send_keys("cccc")

option = option_list.child_window(title="Change Start Menu power button", control_type="ListItem")
option.double_click_input()

pop_up = app.LocalGroupPolicyEditor.child_window(auto_id="tableLayoutFullForm", control_type="Pane")

radio = pop_up.child_window(title="Enabled", auto_id="radioButtonEnabled", control_type="RadioButton")
radio.click_input()

drop_down = pop_up.child_window(title="Choose one of the following actions", auto_id="dropDownListChoose one of the following actions", control_type="ComboBox")
drop_down.click_input()

# 'Hack' to first select the Restart option and then the next option after that which starts with l (=Log off).
# This ensures that the correct setting gets set despite of what the setting was before.
pywinauto.keyboard.send_keys("rl{ENTER}")

ok = pop_up.child_window(title="OK", auto_id="buttonOK", control_type="Button")
ok.click_input()

app.kill()

Убедитесь, что этот скрипт запущен от имени администратора, иначе он потерпит неудачу.

Не стесняйтесь спрашивать, есть ли у вас какие-либо вопросы по поводу кода:)

Edit:

Если вы используете версию pywinauto <0.6.0, вам придется заменить два вхождения (строки 19 и 34) <code>pywinauto.keyboard.send_keys() на:

pywinauto.SendKeysCtypes.SendKeys()

Если это не сработает, вы можете попробовать:

pywinauto.keyboard.SendKeys()
...