Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I get the URL of the active Google Chrome tab in Windows?

How can my Python script get the URL of the currently active Google Chrome tab in Windows? This has to be done without interrupting the user, so sending key strokes to copy/paste is not an option.

like image 276
Christian Davén Avatar asked Jul 25 '12 07:07

Christian Davén


People also ask

Does new tab have a URL?

Chrome doesn't allow you to configure a new tab URL. It always opens its New Tab Page with a search bar and some browsing history. With this extension, you can use the options page to store a link to a page or even a path to a local file that will be loaded when a new tab is created.

What is the URL for Google Chrome browser?

Click the General tab. Under "Home page," enter: www.google.com .


2 Answers

First, you need to download and install pywin32. Import these modules in your script:

import win32gui
import win32con

If Google Chrome is the currently active window, first get the window handle by:

hwnd = win32gui.GetForegroundWindow()

(Otherwise, find the Google Chrome window handle by using win32gui.FindWindow. Windows Detective is handy when finding out class names for windows.)

It seems the only way to get the URL is to get the text in the "omnibox" (address bar). This is usually the tab's URL, but could also be any partial URL or search string that the user is currently typing.

Also, the URL in the omnibox won't include the "http://" prefix unless the user has typed it explicitly (and not yet pressed enter), but it will in fact include "https://" or "ftp://" if those protocols are used.

So, we find the omnibox child window inside the current Chrome window:

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

This will of course break if the Google Chrome team decides to rename their window classes.

And then we get the "window text" of the omnibox, which doesn't seem to work with win32gui.GetWindowText for me. Good thing there's an alternative that does work:

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)

This little function sends the WM_GETTEXT message to the window and returns the window text (in this case, the text in the omnibox).

There you go!

like image 159
Christian Davén Avatar answered Oct 21 '22 13:10

Christian Davén


Christian's answer did not work for me as internal structure of Chrome changed entirely and you can't really access elements of Chrome window using win32gui anymore.

The only possible way I managed to find was through UI Automation API, which has this python wrapper with some examples of usage

Run this and switch to Chrome window you want to grab address from:

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()
like image 4
proggeo Avatar answered Oct 21 '22 13:10

proggeo