You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium多标签操作报错:no such window: target window already closed

Selenium多标签页切换后调用driver.get()报错问题分析与解决

问题情况

使用Selenium处理多标签页时,执行完以下代码后,在return提取的URL后立即调用driver.get()访问该URL,会触发错误:
Message: no such window: target window already closed from unknown error: web view not found

执行代码:

WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
driver.switch_to.window(driver.window_handles[-1])
time.sleep(1)
url_in_page_source= eu.look_for_url_in_page_source(
    page_html=driver.page_source,
    left_delimiter='placeholder',
    right_delimiter='placeholder'
)
driver.close()
driver.switch_to.window(driver.window_handles[0])
# time.sleep(10) # <--- 此代码可修复错误
return url_in_page_source

目前发现在return前添加time.sleep(10)能解决问题,但把等待时间缩短到10秒以内时,错误依然会出现,不清楚具体原因,需要解释和解决方案。

原因分析

出现这个问题的核心是浏览器窗口上下文的同步延迟:

  • 代码里调用driver.close()关闭新窗口,再用driver.switch_to.window()切回原窗口,这只是Selenium层面的指令执行,但浏览器底层需要时间完成窗口关闭的资源释放、上下文切换的同步操作。
  • 当你立即调用driver.get()时,Selenium的命令可能还没有完全绑定到原窗口的上下文,仍然试图访问已经关闭的窗口资源,导致报错。
  • time.sleep(10)是强制等待,给了浏览器足够的时间完成底层同步,但这种硬等待效率低,且依赖固定时间,不稳定。

解决方案

替换硬等待为显式等待,等待原窗口的上下文完全就绪后再继续执行,比固定sleep更可靠且高效:

修改后的代码:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))
# 先保存原窗口句柄,避免后续操作中句柄变化
original_window = driver.window_handles[0]
driver.switch_to.window(driver.window_handles[-1])

# 这里的sleep可以换成显式等待新页面的元素加载,比如等待某个元素出现
# WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "body")))
time.sleep(1)

url_in_page_source= eu.look_for_url_in_page_source(
    page_html=driver.page_source,
    left_delimiter='placeholder',
    right_delimiter='placeholder'
)

driver.close()
# 显式等待当前窗口句柄等于原窗口,确保上下文切换完成
WebDriverWait(driver, 10).until(lambda d: d.current_window_handle == original_window)
driver.switch_to.window(original_window)

# 可选:等待原窗口的标志性元素加载完成,进一步保证后续driver.get()的执行环境正常
# WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "your-element-id")))

return url_in_page_source

说明

  • 显式等待会主动检查条件是否满足(比如当前窗口句柄是否为原窗口),一旦满足就继续执行,不需要固定等待10秒,既节省时间又更可靠。
  • 如果原窗口在切换回来后需要重新加载或有元素需要就绪,可以额外等待原窗口的某个元素出现,进一步保证后续driver.get()的执行环境正常。

补充函数源码

eu.look_for_url_in_page_source()源码:

def look_for_url_in_page_source(page_html, left_url_delimiter, right_url_delimiter):
    print('Processing URL with f:look_for_url_in_page_source()')
    # extracts multiple URLs from page_source
    extracted_urls = []
    while True:
        # check if delimiters are present in page_html
        find_left_url_delimiter = page_html.find(left_url_delimiter)
        find_right_url_delimiter = page_html.find(right_url_delimiter)
        if find_left_url_delimiter == -1 or find_right_url_delimiter == -1:
            if len(extracted_urls) > 0:
                return extracted_urls
            print('f:look_for_url_in_page_source() was not able to get any text.')
            return False
        left_url_delimiter_pos = find_left_url_delimiter + len(left_url_delimiter)
        right_url_delimiter_pos = page_html[left_url_delimiter_pos:].find(right_url_delimiter) + left_url_delimiter_pos
        extracted_url = page_html[left_url_delimiter_pos:right_url_delimiter_pos].strip()
        extracted_urls.append(extracted_url)
        page_html = page_html[right_url_delimiter_pos:]

内容的提问来源于stack exchange,提问作者BigEd94

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:37:34