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)来标识和管理多个窗口。关键属性包括:
四、代码示例
示例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/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.title 或 driver.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。
本文涉及AI创作
内容由AI创作,请仔细甄别