Python3+Selenium4如何从指定元素打开新标签页
Selenium4 Python 实现POST表单元素在新标签页打开并返回主页面
针对点击POST类型的input元素会切换当前窗口、导致原元素失效抛出StaleElementReferenceException的问题,可通过修改表单的target属性,让表单提交在新标签页打开,处理完成后切回主窗口。以下是具体实现:
步骤说明
- 保存主窗口句柄,方便后续切回。
- 遍历目标input元素时,找到它所属的表单,通过JavaScript修改表单
target属性为_blank,使提交操作在新标签页触发。 - 点击元素后切换到新标签页处理业务逻辑。
- 处理完成后关闭新标签页,切回主窗口继续处理下一个元素。
完整代码示例
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
相关产品推荐
相关产品推荐

