如何存储当前标签页的ID并切换到该标签页?

How do I store the ID of the current tab and switch to this tab?

我打开了一个全新的 window 和三个选项卡。

driver.get('link1')
driver.switch_to.new_window('tab')
driver.get('link2')
wait.sleep(2)
driver.switch_to.new_window('tab')
driver.get('link3')

如何存储 tab1、tab2、tab3 的 ID,以便我可以通过编程方式在它们之间切换?

我试过这个:

  original_window = driver.current_window_handle

您没有描述 current_window_handle 遇到的问题,所以我不明白您的问题。如果您收到一些错误消息,那么您应该在问题中显示它。


我创建(许多)选项卡并获得 IDs/handlers

没问题
driver.switch_to.new_window('tab')

tab_id = driver.current_window_handle

稍后切换到此选项卡

driver.switch_to.window(tab_id)

driver.get('link2')

即使我在使用

创建的新 window 中创建选项卡,所有这一切都有效
driver.switch_to.new_window('window')

文档Working with windows and tabs

顺便说一句:在第一句的文档中你可以看到

"WebDriver does not make the distinction between windows and tabs."

最简单的工作代码,首先创建 4 个空选项卡并使用 driver.current_window_handle 获取 ID/handler 并保留在列表中。后来它使用这个列表来切换选项卡并加载 4 个不同的 url。

即使我在 window 中手动切换(或重新排序)选项卡也能正常工作。

测试于:

  • Linux Mint 20
  • Python 3.8
  • Selenium 4.1.3
  • 浏览器:FirefoxChromeMicrosoft Edge

我使用模块 webdriver_manager 为当前浏览器自动下载新的驱动程序。

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
#from webdriver_manager.firefox import GeckoDriverManager
#from webdriver_manager.microsoft import EdgeChromiumDriverManager

import selenium
print('Selenium:', selenium.__version__)

all_urls = [
    'https://httpbin.org/get',
    'https://toscrape.com/',
    'https://books.toscrape.com/',
    'https://quotes.toscrape.com/',
]

all_tabs = []

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
#driver = webdriver.Firefox(service=Service(GeckoDriverManager().install()))
#driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()))

#print('--- create second window ---')
#driver.switch_to.new_window('window')

print('--- create empty tabs ---')

for number in range(len(all_urls)):
    driver.switch_to.new_window('tab')
    tab_id = driver.current_window_handle
    all_tabs.append(tab_id)
    print(f'tab{number+1}:', tab_id)

print('--- switch tabs to load urls ---')

for number, (tab_id, url) in enumerate(zip(all_tabs, all_urls), 1):
    driver.switch_to.window(tab_id)
    driver.get(url)
    print(f'tab{number}:', driver.current_window_handle, url)
    
#  now you can manually switch/reorder tabs and rerun last for-loop