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

Python3+Selenium4如何从指定元素打开新标签页

Selenium4 Python 实现POST表单元素在新标签页打开并返回主页面

针对点击POST类型的input元素会切换当前窗口、导致原元素失效抛出StaleElementReferenceException的问题,可通过修改表单的target属性,让表单提交在新标签页打开,处理完成后切回主窗口。以下是具体实现:

步骤说明

  1. 保存主窗口句柄,方便后续切回。
  2. 遍历目标input元素时,找到它所属的表单,通过JavaScript修改表单target属性为_blank,使提交操作在新标签页触发。
  3. 点击元素后切换到新标签页处理业务逻辑。
  4. 处理完成后关闭新标签页,切回主窗口继续处理下一个元素。

完整代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("你的目标页面URL")

main_window = driver.current_window_handle
products = driver.find_elements(By.XPATH, '//input[@attr="foobar"]')

for product in products:
    # 获取当前input所在的表单元素
    form = product.find_element(By.XPATH, "./ancestor::form")
    # 修改表单target属性,让提交在新标签页打开
    driver.execute_script("arguments[0].target = '_blank';", form)
    # 点击元素触发POST提交
    product.click()
    
    # 切换到新打开的标签页
    new_window = None
    for handle in driver.window_handles:
        if handle != main_window:
            new_window = handle
            break
    driver.switch_to.window(new_window)
    
    # ------------------------------
    # 这里添加处理新标签页内容的代码
    # 例如:获取页面数据、操作元素等
    # ------------------------------
    
    # 处理完成后关闭新标签页
    driver.close()
    # 切回主窗口
    driver.switch_to.window(main_window)

driver.quit()

另一种Selenium4原生新窗口方法(适用于可重构请求场景)

如果需要使用Selenium4的new_window特性,可先打开新标签页,再在新标签页中重新构造POST请求(需提前获取表单的action地址和参数),示例如下:

import requests
from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get("你的目标页面URL")

main_window = driver.current_window_handle
products = driver.find_elements(By.XPATH, '//input[@attr="foobar"]')

for product in products:
    # 获取表单的action地址和参数
    form = product.find_element(By.XPATH, "./ancestor::form")
    action_url = form.get_attribute("action")
    form_data = driver.execute_script("""
        const form = arguments[0];
        const data = new FormData(form);
        return Object.fromEntries(data.entries());
    """, form)
    
    # 打开新标签页
    driver.switch_to.new_window('tab')
    # 构造POST请求并将响应内容注入新标签页
    response = requests.post(action_url, data=form_data)
    driver.execute_script(f"document.body.innerHTML = '{response.text.replace(''','\\'')}';")
    
    # ------------------------------
    # 处理新标签页内容
    # ------------------------------
    
    driver.close()
    driver.switch_to.window(main_window)

driver.quit()

这种方法依赖requests库,对动态页面支持有限,第一种修改表单target的方法更直接可靠。

内容的提问来源于stack exchange,提问作者Mévatlavé Kraspek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:15:10