pin_drop当前位置:知识文库 ❯ 图文

Selenium窗口管理 - 多窗口切换与窗口大小控制教程

Selenium提供了完整的窗口管理功能,包括获取和设置窗口大小、窗口位置、最大化、最小化、全屏等操作。在多窗口场景中,还需要处理窗口切换。掌握窗口管理对于处理响应式页面测试、多窗口交互等场景非常重要,是Web自动化测试中的核心技能之一。


一、窗口管理概述

在现代Web应用中,页面可能在不同尺寸下呈现不同布局(响应式设计),用户点击链接可能打开新窗口或新标签页,第三方登录可能在新窗口中完成。这些场景都需要Selenium能够精确控制浏览器窗口的大小、位置,并能够在多个窗口之间切换操作。

窗口管理主要包含两大方面:

  • 窗口状态管理:设置窗口大小、位置、最大化、最小化、全屏

  • 多窗口切换:在多个窗口或标签页之间切换操作


二、窗口大小与位置管理

窗口尺寸控制

使用 set_window_size() 可以精确设置窗口的宽度和高度,get_window_size() 则获取当前窗口的尺寸信息,返回格式为字典 {'width': int, 'height': int}

窗口位置控制

使用 set_window_position() 可以设置窗口在屏幕上的位置,get_window_position() 获取当前位置,返回格式为字典 {'x': int, 'y': int}

窗口状态操作

  • maximize_window():将浏览器窗口最大化,适合桌面端测试

  • minimize_window():将浏览器窗口最小化,测试最小化恢复行为

  • fullscreen_window():将浏览器切换到全屏模式,类似按F11


三、多窗口切换

在Web自动化中,经常会遇到新窗口打开的情况。Selenium通过窗口句柄(window handle)来标识和管理多个窗口。关键属性包括:

属性/方法 说明
current_window_handle 获取当前窗口的唯一句柄标识
window_handles 获取所有已打开窗口的句柄列表
switch_to.window(handle) 切换到指定句柄对应的窗口

四、代码示例

示例1:窗口大小和位置管理

代码示例

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 获取初始窗口大小
print(f"初始大小: {driver.get_window_size()}")

# 设置窗口大小
driver.set_window_size(1024, 768)
print(f"设置后大小: {driver.get_window_size()}")

# 获取窗口位置
print(f"窗口位置: {driver.get_window_position()}")

# 设置窗口位置
driver.set_window_position(100, 100)
print(f"移动后位置: {driver.get_window_position()}")

# 最大化窗口
driver.maximize_window()
print(f"最大化后大小: {driver.get_window_size()}")

driver.quit()

输出:

代码示例

初始大小: {'width': 800, 'height': 600}
设置后大小: {'width': 1024, 'height': 768}
窗口位置: {'x': 10, 'y': 10}
移动后位置: {'x': 100, 'y': 100}
最大化后大小: {'width': 1920, 'height': 1040}

示例2:多窗口切换

代码示例

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

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 获取当前窗口句柄
main_window = driver.current_window_handle
print(f"主窗口句柄: {main_window}")

# 打开新窗口(通过JavaScript)
driver.execute_script("window.open('https://www.python.org', '_blank');")

# 获取所有窗口句柄
all_windows = driver.window_handles
print(f"所有窗口: {all_windows}")

# 切换到新窗口
for window in all_windows:
    if window != main_window:
        driver.switch_to.window(window)
        break

print(f"新窗口标题: {driver.title}")

# 切换回主窗口
driver.switch_to.window(main_window)
print(f"回到主窗口: {driver.title}")

driver.quit()

输出:

代码示例

主窗口句柄: CDwindow-ABC123
所有窗口: ['CDwindow-ABC123', 'CDwindow-DEF456']
新窗口标题: Welcome to Python.org
回到主窗口: Example Domain

示例3:新建标签页并管理

代码示例

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.example.com")

# 记录初始窗口
initial = driver.current_window_handle

# 打开多个标签页
driver.execute_script("window.open('https://www.python.org');")
driver.execute_script("window.open('https://www.selenium.dev');")

# 查看所有窗口
handles = driver.window_handles
print(f"窗口数量: {len(handles)}")

# 遍历所有窗口并打印标题
for handle in handles:
    driver.switch_to.window(handle)
    print(f"窗口标题: {driver.title}")

# 关闭除初始窗口外的所有窗口
for handle in handles:
    if handle != initial:
        driver.switch_to.window(handle)
        driver.close()

# 切换回初始窗口
driver.switch_to.window(initial)
print(f"最终窗口: {driver.title}")

driver.quit()

输出:

代码示例

窗口数量: 3
窗口标题: Example Domain
窗口标题: Welcome to Python.org
窗口标题: Selenium
最终窗口: Example Domain

五、实际应用场景

  • 场景1:测试响应式布局,在不同窗口尺寸(手机320x568、平板768x1024、桌面1920x1080)下验证页面显示效果

  • 场景2:处理第三方登录弹窗,在新窗口完成OAuth登录后切回主窗口继续操作

  • 场景3:多标签页数据采集,在不同标签页间切换获取信息,提高采集效率


六、注意事项

注意driver.close() 只关闭当前窗口,如果只剩一个窗口则浏览器会退出。

注意:切换窗口前务必保存当前窗口句柄,否则操作完成后可能无法切回原窗口。

注意:窗口句柄的顺序不保证与打开顺序一致,应通过标题或URL来判断目标窗口。

注意minimize_window() 在某些浏览器或系统上可能不支持。


七、窗口操作对比

操作 方法 说明
设置大小 set_window_size(w, h) 精确控制窗口尺寸
最大化 maximize_window() 适合桌面端测试
最小化 minimize_window() 测试最小化恢复
全屏 fullscreen_window() 类似F11全屏
新建窗口 execute_script("window.open()") JavaScript方式
切换窗口 switch_to.window(handle) 通过句柄切换

八、小结

  • 窗口尺寸:通过set_window_size/get_window_size管理窗口尺寸

  • 多窗口切换:通过window_handles获取所有句柄,用switch_to.window()切换

  • 操作规范:操作新窗口前保存当前窗口句柄,操作完成后及时切回

  • 关闭区别:driver.close()关闭当前窗口,driver.quit()关闭所有窗口并退出浏览器

小贴士

  • Selenium 4新语法:Selenium 4提供了更简洁的窗口API,如 driver.switch_to.new_window('tab') 可直接打开新标签页

  • 截图技巧:在调整窗口大小后可以调用 driver.save_screenshot() 截取不同尺寸下的页面效果

  • 窗口句柄类型:窗口句柄是唯一的字符串标识,每次打开浏览器都会变化,不可写死到代码中


九、常见问题

常见问题

Q1:如何准确找到目标窗口的句柄?

建议遍历 window_handles,切换到每个窗口后检查 driver.titledriver.current_url 来识别目标窗口。

Q2:driver.close()和driver.quit()有什么区别?

close() 只关闭当前所在的窗口;quit() 关闭所有窗口并退出WebDriver进程。测试结束时应使用quit()释放资源。

Q3:如何用Selenium打开新标签页?

使用JavaScript:driver.execute_script("window.open('url', '_blank');")。Selenium 4中还可以使用 driver.switch_to.new_window('tab')

Q4:窗口切换后元素找不到怎么办?

切换窗口后,需要等待新页面加载完成。建议使用显式等待(WebDriverWait)等待目标元素出现后再进行操作。


十、练习题

练习1

编写程序,在不同窗口尺寸(手机320x568、平板768x1024、桌面1920x1080)下访问网页并截图保存。

练习2

编写程序,打开两个标签页,在两个标签页之间交替切换并获取各自的标题和URL。

标签: Selenium 窗口管理 多窗口切换 自动化测试 响应式测试 Python

本文涉及AI创作

内容由AI创作,请仔细甄别

list快速访问

上一篇: Selenium等待机制详解 - 显式等待隐式等待对比教程 下一篇: Selenium iframe切换详解 - 嵌套框架元素操作指南

poll相关推荐