2015-05-28 18 views
6

Ich habe ein Python-Skript, das Selen verwendet, um Webseiten zu automatisieren, wobei der Fokus weg vom Terminal gezogen wird, wo Benutzereingaben benötigt werden.Das Terminal im Fokus behalten

Gibt es sowieso in Python, den Fokus programmgesteuert auf das Terminal zu wechseln?

Ich werde mein Programm in der Windows-Eingabeaufforderung auf Windows 7 ausführen, wenn es darauf ankommt, aber eine plattformübergreifende Antwort wäre am nützlichsten.


Versuche

an den Blick pywin32 Paket-Anbindung für die Win32-API die folgenden habe ich:

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 verursacht den Fehler pywintypes.error: (5, 'SetFocus', 'Access is denied.') aufgrund Microsoft die Fähigkeit zu entfernen nehmen Fokus von einem anderen Anwendung.

FlashWindow scheint nichts zu tun.

+0

Ist kein Javascript prompt eine Option für Benutzereingaben? – Saifur

+0

@Saifur Nicht wirklich, mein Skript ist in Python geschrieben (also ist es schwer, das in einer Browser-Entwicklerkonsole zu bekommen) und die Automatisierung beinhaltet das Schließen und Öffnen mehrerer Browser mit ihren eigenen Entwicklerkonsolen. Idealerweise suche ich nach einem einzelnen Python-Paket oder -Skript, das ich von Python ausführen kann, was den Fokus zurück zum Terminal bringt. – thodic

+1

Warum verwenden Sie keine VM, um all Ihre mit Selen verbundenen Aktivitäten zu hosten? Vielleicht selen grid oder ssh verwenden, um Selen-Skripte zu starten? –

Antwort

3

Hier ist, was ich dachte, scheint zu arbeiten.

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() 

Dann ein Fenster zu finden und machen es aktiv können Sie ...

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

Dies ist in Python 2.7, sind auch hier einige Links erkläre ich gefunden, warum Sie durch so gehen viel Mühe, um aktive Fenster zu wechseln.

win32gui.SetActiveWindow() ERROR : The specified procedure could not be found

Windows 7: how to bring a window to the front no matter what other window has focus?

+0

Das ist inspiriert! Mit fantastischer Begründung beantwortet es meine Frage perfekt. Hier haben Sie eine Prämie! – thodic

0

diese Antwort nicht wirklich Ihre Frage, aber die einfache Lösung ist in erster Linie um den Fokus nicht wegnehmen:

driver = webdriver.PhantomJS() 
# ... 

Die PhantomJS WebDriver keine UI haben, so nicht stehlen der Fokus.

+0

Danke für den Vorschlag, aber der Grund, warum ich Selen verwende, ist die Automatisierung mehrerer Browser mit UIs. – thodic

+0

Ah, also verwenden Sie es für browserübergreifende Tests? – Eric

+0

Ja und nein, ich habe mehrere Anwendungsfälle für meine Automatisierung, von denen eine Programmatic Tests sind, aber ich werde sie auch für Showcases und visuelle Inspektionen verwenden. – thodic

0

Um den Fokus zu erhalten, überprüfen Sie die Kommentare zu this answer.

Eine plattformübergreifende Methode könnte sein, Tkinter für die Benutzer-GUI zu verwenden, da es Methoden zum Ergreifen und Festlegen des Fokus für seine Fenster gibt.

+0

Ich habe versucht, die win32-API zu verwenden, wie Sie vorschlagen, aber Probleme aufgetreten sind, finden Sie in meiner Frage bearbeiten. – thodic

+0

Könnten Sie mir bitte erklären, wie ich Tkinter für meinen Anwendungsfall verwenden würde? Ich habe mir die Dokumentation angesehen, aber ich kann keine Lösung finden. – thodic

+0

Mit 'Tkinter' würden Sie Ihr eigenes Konsolentyp-Fenster erstellen, um mit dem Benutzer zu interagieren, und' Tkinter' hat seine eigenen Methoden, um den Fokus zu erhalten. –

Verwandte Themen