在 Web 自动化测试中,多窗口切换和 Cookie 管理是高频且核心的操作场景。比如点击链接弹出新窗口、模拟用户登录状态保持、跨域名验证等,都离不开这两项技能。本文将从实战角度,系统讲解 Selenium 中多窗口切换的实现逻辑,以及 Cookie 增删改查的完整操作,帮助你彻底掌握这两个关键知识点。
一、Selenium 多窗口切换
当我们使用 Selenium 操作浏览器时,点击<a target="_blank">标签、弹窗广告、第三方登录按钮等,都会触发新窗口 / 新标签页的打开。此时 WebDriver 默认仍聚焦在原窗口,必须手动切换到目标窗口才能继续操作。
1. 核心原理:窗口句柄(Window Handle)
浏览器中每个窗口都有唯一的标识,称为窗口句柄(Window Handle)。Selenium 通过句柄来区分和切换不同窗口,核心 API 如下:
driver.current_window_handle:获取当前窗口的句柄driver.window_handles:获取所有已打开窗口的句柄列表(按打开顺序排列)driver.switch_to.window(handle):切换到指定句柄的窗口driver.close():关闭当前窗口(不退出浏览器)driver.quit():退出浏览器(关闭所有窗口)
2. 实战:多窗口切换完整示例
以下代码模拟 "打开百度→点击链接打开新窗口→切换新窗口操作→切回原窗口" 的完整流程:
python
运行
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化浏览器(以Chrome为例)
driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待,提升稳定性
driver.maximize_window()
# 1. 打开原窗口(百度首页)
driver.get("https://www.baidu.com")
original_handle = driver.current_window_handle # 保存原窗口句柄
print(f"原窗口句柄:{original_handle}")
# 2. 打开新窗口(点击百度"新闻"链接,会打开新标签页)
driver.find_element(By.LINK_TEXT, "新闻").click()
time.sleep(2) # 等待新窗口加载(实战建议用显式等待)
# 3. 获取所有窗口句柄,遍历切换到新窗口
all_handles = driver.window_handles
print(f"所有窗口句柄:{all_handles}")
for handle in all_handles:
if handle != original_handle:
driver.switch_to.window(handle) # 切换到新窗口
break
# 4. 在新窗口执行操作(打印新闻页标题)
print(f"新窗口标题:{driver.title}")
driver.find_element(By.ID, "ww").send_keys("Selenium 多窗口切换") # 新闻页搜索框输入内容
# 5. 切回原窗口
driver.switch_to.window(original_handle)
print(f"切回原窗口后的标题:{driver.title}")
# 6. 清理操作
driver.quit()
3. 进阶技巧:显式等待新窗口出现
上述示例中用time.sleep()等待新窗口,实战中更推荐用WebDriverWait显式等待,避免固定休眠导致的不稳定:
python
运行
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 点击链接后,等待新窗口出现(句柄数量大于1)
WebDriverWait(driver, 10).until(
lambda d: len(d.window_handles) > 1
)
二、Selenium Cookie 管理
Cookie 是浏览器存储在客户端的小型文本文件,用于记录用户登录状态、偏好设置等。在自动化测试中,常通过操作 Cookie 实现 "免登录"(跳过验证码 / 密码输入)、验证 Cookie 有效期、模拟异常 Cookie 场景等。
1. Cookie 核心操作 API
Selenium 提供了完整的 Cookie 增删改查方法,核心如下:
| 方法 | 作用 |
|---|---|
driver.get_cookies() |
获取当前页面所有 Cookie(返回字典列表) |
driver.get_cookie(name) |
根据名称获取指定 Cookie |
driver.add_cookie(cookie_dict) |
添加 Cookie(需传入字典,包含 name/value 等键) |
driver.delete_cookie(name) |
删除指定名称的 Cookie |
driver.delete_all_cookies() |
删除所有 Cookie |
2. 实战 1:获取并解析 Cookie
python
运行
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 获取所有Cookie
all_cookies = driver.get_cookies()
print("所有Cookie:")
for cookie in all_cookies:
# 打印Cookie的核心字段:名称、值、域名、有效期
print(f"名称:{cookie['name']},值:{cookie['value']},域名:{cookie['domain']}")
# 获取指定Cookie(比如百度的BAIDUID)
baidu_uid = driver.get_cookie("BAIDUID")
if baidu_uid:
print(f"\nBAIDUID Cookie:{baidu_uid}")
driver.quit()
3. 实战 2:添加 Cookie 实现免登录
这是最常用的场景:先手动登录目标网站,复制登录后的 Cookie,再通过 Selenium 添加 Cookie,实现打开页面即登录状态。
步骤拆解:
- 手动登录目标网站(比如知乎),在浏览器开发者工具(F12)→ Application → Cookies 中复制登录关键 Cookie(如
z_c0); - 通过 Selenium 打开目标网站(先打开网站再添加 Cookie,否则 Cookie 域名不匹配);
- 添加复制的 Cookie,刷新页面即可免登录。
python
运行
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.zhihu.com") # 先打开网站,确保域名匹配
# 删除原有Cookie(避免冲突)
driver.delete_all_cookies()
# 添加登录Cookie(替换为你自己的Cookie值)
login_cookie = {
"name": "z_c0", # 知乎登录核心Cookie名称
"value": "你的Cookie值", # 替换为实际值
"domain": ".zhihu.com", # 域名必须以.开头(跨子域名生效)
"path": "/",
"secure": True, # 若网站是HTTPS,需设为True
"httpOnly": True # 若Cookie是HttpOnly,需设为True
}
driver.add_cookie(login_cookie)
# 刷新页面,生效Cookie
driver.refresh()
time.sleep(5) # 等待页面加载,验证是否登录成功
print(f"登录后页面标题:{driver.title}")
driver.quit()
4. 注意事项
- 添加 Cookie 前必须先打开目标网站(
driver.get(url)),否则 Cookie 的域名无法匹配,添加失败; - Cookie 的
domain字段需正确(比如知乎是.zhihu.com,百度是.baidu.com); - HttpOnly 类型的 Cookie 无法通过 JS 修改,但 Selenium 作为浏览器驱动可以操作;
- Cookie 有有效期,若免登录失效,需重新获取最新 Cookie。
三、综合实战:多窗口 + Cookie 联动
以下示例模拟 "在原窗口登录(添加 Cookie)→ 打开新窗口 → 验证新窗口继承登录状态":
python
运行
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
# 1. 打开原窗口,添加登录Cookie(以百度为例)
driver.get("https://www.baidu.com")
driver.delete_all_cookies()
# 替换为你自己的百度登录Cookie
driver.add_cookie({
"name": "BDUSS",
"value": "你的百度BDUSS值",
"domain": ".baidu.com",
"path": "/"
})
driver.refresh()
# 2. 打开新窗口(百度网盘)
driver.find_element(By.LINK_TEXT, "网盘").click()
time.sleep(2)
# 3. 切换到新窗口,验证登录状态
all_handles = driver.window_handles
for handle in all_handles:
if handle != driver.current_window_handle:
driver.switch_to.window(handle)
break
print(f"网盘页面标题:{driver.title}")
# 若登录成功,网盘页面会显示用户名,而非登录入口
try:
driver.find_element(By.CLASS_NAME, "user-name")
print("新窗口验证:Cookie生效,已登录!")
except:
print("新窗口验证:Cookie未生效,未登录!")
driver.quit()
总结
- 多窗口切换的核心是句柄(handle) :通过
window_handles获取所有窗口,switch_to.window()切换,建议用显式等待替代固定休眠; - Cookie 管理的关键是域名匹配:添加 Cookie 前必须先打开目标网站,核心字段(name/value/domain)需准确;
- 实战中 Cookie 常用来实现 "免登录",多窗口切换则解决新标签页 / 弹窗的操作问题,两者结合可覆盖大部分复杂 Web 自动化场景。
掌握这两项技能,能大幅提升 Selenium 自动化脚本的稳定性和实用性,解决登录验证、多窗口交互等核心痛点。