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

Selenium(Python)打开新标签页后无法关闭、停留在原页问题求助

Selenium 新标签页无法关闭问题修复方案

你的判断完全正确:Selenium 默认不会自动切换窗口上下文,所有操作默认都作用在触发新标签页的原始页面上,你发送的关闭快捷键并没有作用到新打开的标签页,因此无法生效。


核心修复逻辑

  • 提前保存原始页面的窗口句柄,方便关闭新标签后切回原页面继续执行后续操作
  • 新标签页打开后,获取当前所有窗口的句柄列表,切换到最新打开的标签页(一般是列表最后一个元素)
  • 关闭当前激活的标签页,推荐直接使用driver.close()方法,比发送系统快捷键兼容性更高,不需要区分 Mac/Windows 系统的按键差异
  • 操作完成后切回原始页面的窗口句柄

调整后的代码示例

你只需要修改循环内打开新标签后的逻辑即可,参考代码如下:

# 建议在最外层循环外提前保存原始页面句柄
original_window = driver.current_window_handle

for x in range(2000):
    time.sleep(1.5)
    for x in range(3):
        company_elem = driver.find_element_by_xpath('//*[@id="company_ratings"]/div[' + element_num[0] + ']' + '/div[1]/a')
        element_num.pop(0)
        '''Scrolls to element'''
        desired_y = (company_elem.size['height'] / 2) + company_elem.location['y']
        current_y = (driver.execute_script('return window.innerHeight') / 2) + driver.execute_script('return window.pageYOffset')
        scroll_y_by = desired_y - current_y
        driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
        '''_'''
        time.sleep(0.5)
        company_elem.send_keys(Keys.COMMAND + Keys.SHIFT + Keys.RETURN)
        time.sleep(2)

        # 新增切换窗口逻辑
        all_windows = driver.window_handles
        # 切换到新打开的标签页
        driver.switch_to.window(all_windows[-1])
        # 关闭当前标签页
        driver.close()
        # 切回原始页面
        driver.switch_to.window(original_window)

        time.sleep(1)

    button_next_pg = driver.find_element_by_xpath('//*[@id="victor-pagination"]/a[' + next_page[0] + ']')
    next_page.pop(0)
    desired_y = (button_next_pg.size['height'] / 2) + button_next_pg.location['y']
    current_y = (driver.execute_script('return window.innerHeight') / 2) + driver.execute_script('return window.pageYOffset')
    scroll_y_by = desired_y - current_y
    driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
    time.sleep(1)
    button_next_pg.click()

优化建议

可以用Selenium的显式等待替代固定的time.sleep,避免网络波动、页面加载慢导致的逻辑异常,示例如下:

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

# 打开新标签前记录当前窗口数量
window_count = len(driver.window_handles)
company_elem.send_keys(Keys.COMMAND + Keys.SHIFT + Keys.RETURN)
# 最多等待10秒,直到新窗口打开
WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(window_count + 1))
# 再执行切换逻辑
all_windows = driver.window_handles
driver.switch_to.window(all_windows[-1])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:54:02