2012-07-25 27 views

Trả lời

13

Trước tiên, bạn cần tải xuống và cài đặt pywin32. Nhập những mô-đun trong kịch bản của bạn:

import win32gui 
import win32con 

Nếu Google Chrome là cửa sổ đang hoạt động, lần đầu tiên có được xử lý cửa sổ theo:

hwnd = win32gui.GetForegroundWindow() 

(Nếu không, tìm ra xử lý cửa sổ Google Chrome bằng cách sử dụng win32gui.FindWindow. Windows Detective tiện dụng khi tìm ra tên lớp cho cửa sổ.)

Có vẻ như cách duy nhất để lấy URL là lấy văn bản trong "omnibox" (address bar). Đây thường là URL của tab, nhưng cũng có thể là bất kỳ URL hoặc chuỗi tìm kiếm nào mà người dùng hiện đang nhập.

Ngoài ra, URL trong thanh địa chỉ sẽ không bao gồm tiền tố "http: //" trừ khi người dùng đã nhập nó một cách rõ ràng (và chưa nhấn enter), nhưng thực tế nó sẽ bao gồm "https: //" hoặc "ftp: //" nếu các giao thức đó được sử dụng.

Vì vậy, chúng ta thấy các cửa sổ con omnibox bên trong cửa sổ Chrome hiện tại:

omniboxHwnd = win32gui.FindWindowEx(hwnd, 0, 'Chrome_OmniboxView', None) 

này muốn của phá vỡ tất nhiên nếu nhóm Google Chrome quyết định đổi tên lớp cửa sổ của họ.

Và sau đó chúng tôi nhận được "văn bản cửa sổ" của thanh địa chỉ, dường như không hoạt động với win32gui.GetWindowText đối với tôi. Điều tốt có một sự thay thế mà không làm việc:

def getWindowText(hwnd): 
    buf_size = 1 + win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH, 0, 0) 
    buf = win32gui.PyMakeBuffer(buf_size) 
    win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, buf_size, buf) 
    return str(buf) 

chức năng nhỏ này sẽ gửi thông điệp WM_GETTEXT vào cửa sổ và trả về văn bản cửa sổ (trong trường hợp này, các văn bản trong thanh tìm kiếm).

Có bạn đi!

+0

Rất cám ơn "thám tử cửa sổ" !! – akaRem

+0

Bạn có thể xóa điều "khó khăn" như vậy không: khi một số "nhân vật phản diện-ứng dụng" (python script, WindowDetective, ..) cố gắng đọc bất kỳ dữ liệu nào (hwnd, class, text, smth. Else) từ "victim-app" (Chrome , IE, "SomeParanoidApp") là nó có thể là "nạn nhân" có thể cảm thấy/xem/kiểm tra xem ih đã được quét? – akaRem

+0

Điều này chỉ áp dụng trên nền tảng Windows hoặc thư viện này hoạt động trên các nền tảng? Nếu không, có thư viện tương đương nào cho Mac OS không. –

2

Câu trả lời của Christian không phù hợp với tôi vì cấu trúc nội bộ của Chrome đã thay đổi hoàn toàn và bạn không thể truy cập các thành phần của cửa sổ Chrome bằng win32gui nữa.

Cách duy nhất có thể, tôi cố gắng tìm đã được thông qua giao diện người dùng tự động hóa API, trong đó có this python wrapper với một số ví dụ về việc sử dụng

Run này và chuyển sang cửa sổ Chrome mà bạn muốn lấy địa chỉ từ:

from time import sleep 
import uiautomation as automation 

if __name__ == '__main__': 
    sleep(3) 
    control = automation.GetFocusedControl() 
    controlList = [] 
    while control: 
     controlList.insert(0, control) 
     control = control.GetParentControl() 
    if len(controlList) == 1: 
     control = controlList[0] 
    else: 
     control = controlList[1] 
    address_control = automation.FindControl(control, lambda c, d: isinstance(c, automation.EditControl) and "Address and search bar" in c.Name) 
    print address_control.CurrentValue() 
Các vấn đề liên quan