def testWaitCPUUsageLower(self): if is_x64_Python() != is_x64_OS(): return None app = Application().Start(r'explorer.exe') WaitUntil(30, 0.5, lambda: len(findwindows.find_windows(active_only=True, class_name='CabinetWClass')) > 0) handle = findwindows.find_windows(active_only=True, class_name='CabinetWClass')[-1] window = WindowSpecification({'handle': handle, }) explorer = Application().Connect(process=window.ProcessID()) try: window.AddressBandRoot.ClickInput(double=True) window.Edit.SetEditText(r'Control Panel\Programs\Programs and Features') window.TypeKeys(r'{ENTER 2}', set_foreground=False) WaitUntil(30, 0.5, lambda: len(findwindows.find_windows(active_only=True, title='Programs and Features', class_name='CabinetWClass')) > 0) explorer.WaitCPUUsageLower(threshold=2.5, timeout=40, usage_interval=2) installed_programs = window.FolderView.Texts()[1:] programs_list = ','.join(installed_programs) if ('Microsoft' not in programs_list) and ('Python' not in programs_list): HwndWrapper.ImageGrab.grab().save(r'explorer_screenshot.jpg') HwndWrapper.ActionLogger().log('\ninstalled_programs:\n') for prog in installed_programs: HwndWrapper.ActionLogger().log(prog) self.assertEqual(('Microsoft' in programs_list) or ('Python' in programs_list), True) finally: window.Close(2.0)
def test_wait_cpu_usage_lower(self): """Test that wait_cpu_usage_lower() works correctly""" if is_x64_Python() != is_x64_OS(): return None Application().Start(r'explorer.exe') def _cabinetwclass_exist(): "Verify if at least one active 'CabinetWClass' window is created" l = findwindows.find_elements(active_only=True, class_name='CabinetWClass') return (len(l) > 0) WaitUntil(40, 0.5, _cabinetwclass_exist) handle = findwindows.find_elements( active_only=True, class_name='CabinetWClass')[-1].handle window = WindowSpecification({ 'handle': handle, 'backend': 'win32', }) explorer = Application().Connect(process=window.process_id()) try: explorer.WaitCPUUsageLower(threshold=1.5, timeout=60, usage_interval=2) window.AddressBandRoot.ClickInput() window.TypeKeys(r'Control Panel\Programs\Programs and Features', with_spaces=True, set_foreground=True) window.TypeKeys(r'{ENTER}', set_foreground=False) WaitUntil( 40, 0.5, lambda: len( findwindows.find_elements(active_only=True, title='Programs and Features', class_name='CabinetWClass')) > 0) explorer.WaitCPUUsageLower(threshold=1.5, timeout=60, usage_interval=2) installed_programs = window.FolderView.texts()[1:] programs_list = ','.join(installed_programs) if ('Microsoft' not in programs_list) and ('Python' not in programs_list): hwndwrapper.ImageGrab.grab().save(r'explorer_screenshot.jpg') hwndwrapper.ActionLogger().log('\ninstalled_programs:\n') for prog in installed_programs: hwndwrapper.ActionLogger().log(prog) self.assertEqual(('Microsoft' in programs_list) or ('Python' in programs_list), True) finally: window.Close(2.0)
def test_connect_windowspec(self): """Test that connect_() works with a windowspec""" app1 = Application() app1.start(_notepad_exe()) #unused var: handle = app1.UntitledNotepad.handle app_conn = Application() try: app_conn.connect(title="Untitled - Notepad") except findwindows.WindowAmbiguousError: wins = findwindows.find_elements(active_only=True, title="Untitled - Notepad") app_conn.connect(handle=wins[0].handle) except findwindows.ElementNotFoundError: WaitUntil( 30, 0.5, lambda: len( findwindows.find_elements(active_only=True, title="Untitled - Notepad")) > 0) wins = findwindows.find_elements(active_only=True, title="Untitled - Notepad") app_conn.connect(handle=wins[0].handle) self.assertEqual(app1.process, app_conn.process) app_conn.UntitledNotepad.MenuSelect('File->Exit')
def _wait_minimized(dlg): """A helper function to verify that the specified dialog is minimized Basically, WaitNot('visible', timeout=30) would work too, just wanted to make sure the dlg is really got to the 'minimized' state because we test hiding the window to the tray. """ WaitUntil(timeout=_ready_timeout, retry_interval=_retry_interval, func=lambda: (dlg.GetShowState() == win32defines.SW_SHOWMINIMIZED)) return True
def testClickVisibleIcon(self): """ Test minimizing a sample app into the visible area of the tray and restoring the app back """ if is_x64_Python() != is_x64_OS(): # We don't run this test for mixed cases: # a 32-bit Python process can't interact with # a 64-bit explorer process (taskbar) and vice versa return # Make sure that the hidden icons area is disabled orig_hid_state = _toggle_notification_area_icons(show_all=True, debug_img="%s_01" % (self.id())) self.dlg.Minimize() _wait_minimized(self.dlg) menu_window = [None] # Click in the visible area and wait for a popup menu def _show_popup_menu(): taskbar.explorer_app.WaitCPUUsageLower(threshold=5, timeout=self.tm) taskbar.RightClickSystemTrayIcon('MFCTrayDemo') menu = self.app.top_window().children()[0] res = isinstance(menu, ToolbarWrapper) and menu.is_visible() menu_window[0] = menu return res WaitUntil(self.tm, _retry_interval, _show_popup_menu) menu_window[0].MenuBarClickInput("#2", self.app) popup_window = self.app.top_window() hdl = self.dlg.PopupWindow() self.assertEquals(popup_window.handle, hdl) taskbar.ClickSystemTrayIcon('MFCTrayDemo', double=True) self.dlg.Wait('active', timeout=self.tm) # Restore Notification Area settings _toggle_notification_area_icons(show_all=orig_hid_state, debug_img="%s_02" % (self.id()))
def _toggle_notification_area_icons(show_all=True, debug_img=None): """ A helper function to change 'Show All Icons' settings. On a succesful execution the function returns an original state of 'Show All Icons' checkbox. The helper works only for an "English" version of Windows, on non-english versions of Windows the 'Notification Area Icons' window should be accessed with a localized title" """ app = Application() starter = app.start(r'explorer.exe') class_name = 'CabinetWClass' def _cabinetwclass_exist(): "Verify if at least one active 'CabinetWClass' window is created" l = findwindows.find_windows(active_only=True, class_name=class_name) return (len(l) > 0) WaitUntil(_ready_timeout, _retry_interval, _cabinetwclass_exist) handle = findwindows.find_windows(active_only=True, class_name=class_name)[-1] window = WindowSpecification({'handle': handle, }) explorer = Application().Connect(process=window.ProcessID()) cur_state = None try: # Go to "Control Panel -> Notification Area Icons" window.Wait("ready", timeout=_ready_timeout) window.AddressBandRoot.ClickInput() window.TypeKeys( r'control /name Microsoft.NotificationAreaIcons', with_spaces=True, set_foreground=True) # Send 'ENTER' separately, this is to make sure # the window focus hasn't accidentally been lost window.TypeKeys( '{ENTER}', with_spaces=True, set_foreground=True) explorer.WaitCPUUsageLower(threshold=5, timeout=_ready_timeout) # Get the new opened applet notif_area = explorer.Window_(title="Notification Area Icons", class_name=class_name) notif_area.Wait("ready", timeout=_ready_timeout) cur_state = notif_area.CheckBox.GetCheckState() # toggle the checkbox if it differs and close the applet if bool(cur_state) != show_all: notif_area.CheckBox.ClickInput() notif_area.Ok.ClickInput() explorer.WaitCPUUsageLower(threshold=5, timeout=_ready_timeout) except Exception as e: if debug_img: from PIL import ImageGrab ImageGrab.grab().save("%s.jpg" % (debug_img), "JPEG") l = pywinauto.actionlogger.ActionLogger() l.log("RuntimeError in _toggle_notification_area_icons") raise e finally: # close the explorer window window.Close() return cur_state
def _toggle_notification_area_icons(show_all=True, debug_img=None): """ A helper function to change 'Show All Icons' settings. On a succesful execution the function returns an original state of 'Show All Icons' checkbox. The helper works only for an "English" version of Windows, on non-english versions of Windows the 'Notification Area Icons' window should be accessed with a localized title" """ Application().start(r'explorer.exe') class_name = 'CabinetWClass' def _cabinetwclass_exist(): "Verify if at least one active 'CabinetWClass' window is created" l = findwindows.find_elements(active_only=True, class_name=class_name) return (len(l) > 0) WaitUntil(_ready_timeout, _retry_interval, _cabinetwclass_exist) handle = findwindows.find_elements(active_only=True, class_name=class_name)[-1].handle window = WindowSpecification({ 'handle': handle, 'backend': 'win32', }) explorer = Application().Connect(process=window.process_id()) cur_state = None try: # Go to "Control Panel -> Notification Area Icons" cmd_str = r'control /name Microsoft.NotificationAreaIcons' for _ in range(3): window.Wait("ready", timeout=_ready_timeout) window.AddressBandRoot.click_input() explorer.WaitCPUUsageLower(threshold=2, timeout=_ready_timeout) window.type_keys(cmd_str, with_spaces=True, set_foreground=True) # verfiy the text in the address combobox after type_keys finished cmbx_spec = window.AddressBandRoot.ComboBoxEx if cmbx_spec.exists(timeout=_ready_timeout, retry_interval=_retry_interval): texts = cmbx_spec.texts() if texts and texts[0] == cmd_str: break # Send ESCs to remove the invalid text window.type_keys("{ESC}" * 3) # Send 'ENTER' separately, this is to make sure # the window focus hasn't accidentally been lost window.type_keys('{ENTER}', with_spaces=True, set_foreground=True) explorer.WaitCPUUsageLower(threshold=5, timeout=_ready_timeout) # Get the new opened applet notif_area = Desktop().window(title="Notification Area Icons", class_name=class_name) notif_area.Wait("ready", timeout=_ready_timeout) cur_state = notif_area.CheckBox.GetCheckState() # toggle the checkbox if it differs and close the applet if bool(cur_state) != show_all: notif_area.CheckBox.click_input() notif_area.Ok.click_input() explorer.WaitCPUUsageLower(threshold=5, timeout=_ready_timeout) except Exception as e: if debug_img: from PIL import ImageGrab ImageGrab.grab().save("%s.jpg" % (debug_img), "JPEG") l = pywinauto.actionlogger.ActionLogger() l.log("RuntimeError in _toggle_notification_area_icons") raise e finally: # close the explorer window window.Close() return cur_state