Python
Python как считает вкладки в браузере: window_handles в Selenium
Python сам по себе не знает, сколько вкладок открыто в Chrome, Firefox или Яндекс Браузере. Но если вы управляете браузером через Selenium, список вкладок можно получить через window_handles
count = len(browser.window_handles)
print(count)
window_handles — это список идентификаторов вкладок и окон, которыми управляет Selenium
Минимальный пример
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://example.com")
print("Вкладок:", len(browser.window_handles))
browser.switch_to.new_window("tab")
browser.get("https://www.python.org/")
print("Вкладок:", len(browser.window_handles))
input("Нажмите Enter")
browser.quit()
Ожидаемый вывод
Вкладок: 1
Вкладок: 2
Так Python «считает вкладки» не через операционную систему, а через Selenium-сессию
Что такое window_handles
browser.window_handles возвращает список примерно такого вида
['2F78A0...', 'CD91B4...']
Это не названия страниц и не адрес. Это внутренние идентификаторы окон или вкладок браузера
Чтобы посмотреть текущую вкладку, используйте
print(browser.current_window_handle)
Чтобы переключиться на вкладку, используйте
browser.switch_to.window(browser.window_handles[0])
Или на последнюю открытую
browser.switch_to.window(browser.window_handles[-1])
Как вывести адрес всех вкладок
Сами window_handles не содержат адрес. Нужно по очереди переключиться на каждую вкладку и прочитать current_url
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://example.com")
browser.switch_to.new_window("tab")
browser.get("https://www.python.org/")
for handle in browser.window_handles:
browser.switch_to.window(handle)
print(browser.current_url)
input("Enter")
browser.quit()
Вывод будет примерно таким
https://example.com/
https://www.python.org/
Как вывести заголовки всех вкладок
for handle in browser.window_handles:
browser.switch_to.window(handle)
print(browser.title)
Это полезно, если нужно найти вкладку по заголовку страницы
for handle in browser.window_handles:
browser.switch_to.window(handle)
if "Python" in browser.title:
print("Нашли вкладку Python")
break
После break Selenium останется на найденной вкладке
Почему Python не видит вкладки, открытые вручную
Если вы открыли Chrome сами, а потом запустили Python-скрипт, Selenium обычно создает отдельное окно браузера. Он видит только свои вкладки, а не все вкладки вашей обычной сессии
Это нормальное поведение. Selenium предназначен для управляемого браузера, а не для слежения за вашим личным Chrome
Подключаться к уже открытому Chrome можно через remote debugging, но это отдельный сценарий. Для новичка лучше сначала понять window_handles в обычной Selenium-сессии
Как посчитать только вкладки, а не окна
В Selenium вкладки и окна часто идут в одном списке. Если вы открываете именно new_window("tab"), визуально это вкладки. Если new_window("window"), это отдельные окна
browser.switch_to.new_window("window")
Но в обоих случаях Selenium добавит новый handle в window_handles
Поэтому len(browser.window_handles) показывает количество управляемых оконных контекстов, а не всегда строго «вкладок» в бытовом смысле
Для большинства учебных задач это различие не мешает
Частые ошибки
Список вкладок не меняется
Возможно, новая вкладка открылась не через Selenium или браузер заблокировал popup
Для теста используйте явную команду
browser.switch_to.new_window("tab")
Selenium печатает handles, но я не понимаю, где адрес
Handles — это технические ID. Для адрес нужно переключаться на вкладку и читать browser.current_url
После закрытия вкладки код падает
После browser.close() текущий handle становится недействительным. Переключитесь на живую вкладку
browser.switch_to.window(browser.window_handles[0])
Мини-задача
Откройте три вкладки и выведите их адреса
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://example.com")
browser.switch_to.new_window("tab")
browser.get("https://www.python.org/")
browser.switch_to.new_window("tab")
browser.get("https://docs.python.org/3/")
print("Всего вкладок:", len(browser.window_handles))
for handle in browser.window_handles:
browser.switch_to.window(handle)
print(browser.current_url)
input("Enter")
browser.quit()
Если вывелось Всего вкладок: 3, логика работает
Что почитать дальше по Python
Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:
- Как запустить расширение в браузере через Python: Selenium, Chrome profile и ограничения
- Python открыть ссылку в новой вкладке: webbrowser и Selenium
- Python сразу закрывает браузер: как исправить в Selenium и обычном запуске
- element.get_attribute в Python Selenium: как получить href, class, value и другие атрибуты