一尘不染

保持终端焦点

selenium

我有一个使用selenium自动化网页的python脚本,将焦点从需要用户输入的终端上移开。

python中是否有通过编程将焦点切换回终端的方法?

如果重要的话,我将在Windows 7的Windows命令提示符中运行我的程序,但是跨平台答案将是最有用的。


尝试次数

查看pywin32win32 API 的程序包绑定,我有以下内容:

import win32console
import win32gui
from selenium import webdriver as wd

d = wd.Firefox()
win32gui.SetFocus(win32console.GetConsoleWindow())
win32gui.FlashWindow(win32console.GetConsoleWindow(), False)
input('Should have focus: ')

SetFocus``pywintypes.error: (5, 'SetFocus', 'Access is denied.')由于Microsoft删除了从另一个应用程序获取焦点的功能而导致该错误。

FlashWindow 似乎无能为力。


阅读 306

收藏
2020-06-26

共1个答案

一尘不染

这是我想出的似乎是可行的。

class WindowManager:
    def __init__(self):
        self._handle = None

    def _window_enum_callback( self, hwnd, wildcard ):
        if re.match(wildcard, str(win32gui.GetWindowText(hwnd))) != None:
            self._handle = hwnd

    #CASE SENSITIVE
    def find_window_wildcard(self, wildcard):
        self._handle = None
        win32gui.EnumWindows(self._window_enum_callback, wildcard)

    def set_foreground(self):
        win32gui.ShowWindow(self._handle, win32con.SW_RESTORE)
        win32gui.SetWindowPos(self._handle,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)  
        win32gui.SetWindowPos(self._handle,win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)  
        win32gui.SetWindowPos(self._handle,win32con.HWND_NOTOPMOST, 0, 0, 0, 0, win32con.SWP_SHOWWINDOW + win32con.SWP_NOMOVE + win32con.SWP_NOSIZE)
        shell = win32com.client.Dispatch("WScript.Shell")
        shell.SendKeys('%')
        win32gui.SetForegroundWindow(self._handle)

    def find_and_set(self, search):
        self.find_window_wildcard(search)
        self.set_foreground()

然后找到一个窗口并将其激活,您可以…

w = WindowManager()
w.find_and_set(".*cmd.exe*")

这是在python 2.7中,这也是我发现的一些链接,这些链接解释了为什么要切换活动窗口必须要花很多麻烦。

2020-06-26