2012-07-25 13 views

Odpowiedz

13

Najpierw pobierz i zainstaluj pywin32. Importować te moduły w skrypcie:

import win32gui 
import win32con 

Jeśli Google Chrome jest aktualnie aktywne okno, należy najpierw uzyskać uchwyt okna przez:

hwnd = win32gui.GetForegroundWindow() 

(W przeciwnym razie, znaleźć Google Chrome uchwyt okna przy użyciu win32gui.FindWindow. Windows Detective jest przydatny przy wyszukiwaniu nazw klas dla okien.)

Wydaje się, że jedynym sposobem uzyskania adresu URL jest uzyskanie tekstu w "omnibox" (address bar). Zwykle jest to adres URL karty, ale może to być również dowolny częściowy adres URL lub ciąg wyszukiwania, który użytkownik aktualnie pisze.

Ponadto adres URL w omniboksie nie będzie zawierał przedrostka "http: //", chyba że użytkownik wpisze je jawnie (i jeszcze nie naciśnie klawisza enter), ale w rzeczywistości będzie zawierać "https: //" lub "ftp: //", jeśli używane są te protokoły.

Więc znaleźć omnibox okno potomne wewnątrz bieżącego okna chrome:

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

Będzie przerwy oczywiście jeśli zespół Google Chrome postanawia zmienić nazwę ich klasy okien.

A następnie otrzymujemy "tekst okna" omniboksu, który nie działa dla mnie z win32gui.GetWindowText. Dobrze, że istnieje alternatywa, która działa:

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) 

Ta mała funkcja wysyła wiadomość WM_GETTEXT do okna i zwraca tekst okna (w tym przypadku, tekst w omniboksie).

Idź!

+0

Wielkie dzięki za "Windows Detective"! – akaRem

+0

Czy możesz wyczyścić takie "trudne" rzeczy: kiedy jakiś "złoczyńca-app" (skrypt Pythona, WindowDetective, ..) próbuje odczytać dowolne dane (hwnd, klasa, tekst, coś innego) z "ofiary-app" (Chrome , IE, "SomeParanoidApp") jest możliwe, że "ofiara" może poczuć/zobaczyć/sprawdzić, czy został zeskanowany? – akaRem

+0

Czy ma to zastosowanie tylko na platformie Windows lub ta biblioteka działa na różnych platformach? Jeśli nie, czy istnieje odpowiednik biblioteki dla systemu Mac OS. –

2

Odpowiedź Christiana nie zadziałała, ponieważ wewnętrzna struktura Chrome została całkowicie zmieniona i nie można już uzyskać dostępu do elementów okna przeglądarki Chrome przy użyciu programu win32gui.

Jedynym możliwym sposobem udało mi się znaleźć to przez UI Automation API, które ma this python wrapper z kilkoma przykładami użycia

uruchomić ten i przejść do okna Chrome chcesz pobrać adres z:

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() 
Powiązane problemy