Selenium多窗口切换与Cookie管理

在 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
)

Cookie 是浏览器存储在客户端的小型文本文件,用于记录用户登录状态、偏好设置等。在自动化测试中,常通过操作 Cookie 实现 "免登录"(跳过验证码 / 密码输入)、验证 Cookie 有效期、模拟异常 Cookie 场景等。

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

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()

这是最常用的场景:先手动登录目标网站,复制登录后的 Cookie,再通过 Selenium 添加 Cookie,实现打开页面即登录状态。

步骤拆解:
  1. 手动登录目标网站(比如知乎),在浏览器开发者工具(F12)→ Application → Cookies 中复制登录关键 Cookie(如z_c0);
  2. 通过 Selenium 打开目标网站(先打开网站再添加 Cookie,否则 Cookie 域名不匹配);
  3. 添加复制的 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)→ 打开新窗口 → 验证新窗口继承登录状态":

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()

总结

  1. 多窗口切换的核心是句柄(handle) :通过window_handles获取所有窗口,switch_to.window()切换,建议用显式等待替代固定休眠;
  2. Cookie 管理的关键是域名匹配:添加 Cookie 前必须先打开目标网站,核心字段(name/value/domain)需准确;
  3. 实战中 Cookie 常用来实现 "免登录",多窗口切换则解决新标签页 / 弹窗的操作问题,两者结合可覆盖大部分复杂 Web 自动化场景。

掌握这两项技能,能大幅提升 Selenium 自动化脚本的稳定性和实用性,解决登录验证、多窗口交互等核心痛点。

相关推荐
猿小羽1 小时前
[TEST] Selenium 自动化测试 - 1769133931910
selenium·测试工具
小北方城市网2 小时前
Spring Cloud 服务治理实战:构建高可用微服务体系
spring boot·python·rabbitmq·java-rabbitmq·数据库架构
木叶子---2 小时前
Postman测试WebService接口
测试工具·postman
写代码的【黑咖啡】2 小时前
Python中的Statsmodels:统计建模与假设检验
开发语言·python
程序员杰哥2 小时前
Pytest自动化测试框架实战
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
weixin_433179332 小时前
python - 函数 function
开发语言·python
llilian_162 小时前
NTP时间同步服务器 卫星时钟同步服务器在气象监测方向的深度应用 授时服务器
服务器·功能测试·单片机·嵌入式硬件·测试工具
不吃鱼的小时喵3 小时前
【Python】关于python多进程
python
喵手3 小时前
Python爬虫零基础入门【第六章:增量、去重、断点续爬·第1节】增量采集:只抓新增/更新(新手也能做)!
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·增量、去重·增量采集