Как получить URL-адрес активной вкладки Google Chrome в Windows?

Как мой скрипт Python может получить URL-адрес активной активной вкладки Google Chrome в Windows? Это необходимо сделать, не прерывая пользователя, поэтому отправка штрихов для копирования / вставки не является вариантом.

Во-первых, вам нужно загрузить и установить pywin32 . Импортируйте эти модули в свой скрипт:

import win32gui import win32con 

Если Google Chrome является текущим активным окном, сначала получите дескриптор окна:

 hwnd = win32gui.GetForegroundWindow() 

(В противном случае найдите дескриптор окна Google Chrome с помощью win32gui.FindWindow . Windows Detective удобен при поиске имен классов для окон.)

Кажется, единственный способ получить URL-адрес – получить текст в «omnibox» (адресная строка) . Обычно это URL-адрес вкладки, но также может быть частью частичного URL-адреса или строки поиска, которые пользователь набирает.

Кроме того, URL-адрес в omnibox не будет включать префикс «http: //», если пользователь не набрал его явно (и еще не нажал enter), но на самом деле будет включать «https: //» или «ftp: // "если эти протоколы используются.

Итак, мы находим дочернее окно omnibox внутри текущего окна Chrome:

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

Это, конечно, сломается, если команда Google Chrome решит переименовать свои оконные классы.

И тогда мы получаем «оконный текст» omnibox, который, похоже, не работает с win32gui.GetWindowText для меня. Хорошо, что есть альтернатива, которая работает:

 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) 

Эта небольшая функция отправляет сообщение WM_GETTEXT в окно и возвращает текст окна (в этом случае текст в омнибоксе).

Вот так!

Ответ Кристиана не сработал для меня, так как внутренняя структура Chrome полностью изменилась, и вы больше не сможете получить доступ к элементам окна Chrome с помощью win32gui.

Единственный возможный способ, который мне удалось найти, – это использовать API UI Automation, который имеет эту оболочку python с некоторыми примерами использования

Запустите это и переключитесь в окно Chrome, с которого вы хотите получить адрес:

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