2015-05-28 19 views
6

Tôi có một tập lệnh python sử dụng selen để tự động hoá trang web, vẽ tiêu điểm ra khỏi thiết bị đầu cuối nơi người dùng nhập vào là bắt buộc.Giữ thiết bị đầu cuối ở tiêu điểm

Có anyway trong python để chuyển tiêu điểm trở lại thiết bị đầu cuối, lập trình?

Tôi sẽ chạy chương trình của mình trong Windows Command Prompt trên Windows 7, nếu có vấn đề, nhưng câu trả lời trên nền tảng sẽ hữu ích nhất.


Nỗ lực

Nhìn vào pywin32 bindings gói cho các API win32 Tôi đã điều sau đây:

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 gây ra lỗi pywintypes.error: (5, 'SetFocus', 'Access is denied.') do Microsoft loại bỏ khả năng mất tập trung từ một ứng dụng.

FlashWindow dường như không làm gì cả.

+0

Không phải là javascript nhắc một lựa chọn cho người sử dụng đầu vào? – Saifur

+0

@Saifur Không thực sự, kịch bản của tôi được viết bằng python (do đó khó có thể chạy trong bảng điều khiển dành cho nhà phát triển trình duyệt) và tự động hóa bao gồm việc đóng và mở nhiều trình duyệt với bảng điều khiển dành cho nhà phát triển của riêng họ. Lý tưởng nhất là tôi đang tìm kiếm một gói python đơn hoặc kịch bản tôi có thể thực hiện từ python mà tập trung trở lại thiết bị đầu cuối. – thodic

+1

tại sao không sử dụng máy ảo để lưu trữ tất cả các hoạt động liên quan đến selen của bạn? Có thể sử dụng lưới selen hoặc ssh để khởi chạy bất kỳ tập lệnh selen nào? –

Trả lời

3

Đây là những gì tôi nghĩ ra có vẻ như đang hoạt động.

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

Sau đó, để tìm thấy một cửa sổ và làm cho nó hoạt động bạn có thể ...

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

Đây là trong python 2.7, cũng đây là một số liên kết tôi thấy để giải thích lý do tại sao bạn phải đi qua rất nhiều rắc rối để chuyển đổi các cửa sổ đang hoạt động.

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

Đây là cảm hứng! Với sự biện minh tuyệt vời, nó trả lời câu hỏi của tôi một cách hoàn hảo. Ở đây có một số tiền thưởng! – thodic

0

này không thực sự trả lời câu hỏi của bạn, nhưng giải pháp dễ dàng là để không mất tập trung đi ở nơi đầu tiên:

driver = webdriver.PhantomJS() 
# ... 

Các PhantomJS webdriver không có bất kỳ giao diện người dùng, vì vậy không ăn cắp trọng tâm.

+0

Cảm ơn đề xuất nhưng lý do tôi sử dụng selen là tự động hóa nhiều trình duyệt với giao diện người dùng. – thodic

+0

Ah, vì vậy bạn đang sử dụng nó để kiểm tra trình duyệt chéo? – Eric

+0

Có và không, tôi có nhiều trường hợp sử dụng cho tự động hóa của mình, một trong số đó là các thử nghiệm có lập trình nhưng tôi cũng sẽ sử dụng chúng để kiểm tra trình diễn và trực quan. – thodic

0

Để lấy tiêu điểm, hãy kiểm tra nhận xét tới this answer.

Phương pháp đa nền tảng có thể là sử dụng Tkinter cho GUI người dùng, vì nó có phương pháp lấy và đặt tiêu điểm cho cửa sổ của nó.

+0

Tôi đã cố gắng sử dụng API win32 như bạn đề xuất nhưng đã gặp sự cố, vui lòng xem chỉnh sửa câu hỏi của tôi. – thodic

+0

Bạn có thể giải thích làm thế nào tôi sẽ sử dụng Tkinter cho trường hợp sử dụng của tôi, tôi đã xem tài liệu nhưng tôi không thể tìm thấy một giải pháp. – thodic

+0

Với 'Tkinter', bạn sẽ tạo cửa sổ kiểu bàn điều khiển của riêng mình để tương tác với người dùng và' Tkinter' có các phương pháp riêng để lấy tiêu điểm. –

Các vấn đề liên quan