微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Selenium 窗口切换

在浏览网页的时候,有时点击一个链接或者按钮,会弹出一个新的窗口。

使用 Selenium 进行 Web 自动化测试,如果弹出新窗口时,没有对窗口进行切换,那么,WebDriver 对象 的焦点对应的,依然是旧窗口,后续的自动化操作,将继续在旧窗口中进行。

实例验证:

# 模拟场景:打开百度,点击左上角“视频”链接,打印出当前`WebDriver 对象` 对应的窗口信息
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.maximize_window()  # 浏览器最大化
driver.get("https://www.baidu.com/")  # 跳转百度首页
sleep(1)
element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]")  # 定位“视频”元素
element.click()  # 点击
sleep(1)
print(driver.title)  # 百度一下,你就知道
print(driver.current_url)  # https://www.baidu.com/

driver.quit()  # 关闭浏览器

根据程序的打印结果可知,窗口依然停留在百度首页,当前的 url :https://www.baidu.com/,由此可推断,Selenium 没有按照我们预期那样,自动切换到新的窗口。

考虑到后续的操作步骤都需要在新窗口进行,就需要对进行窗口切换,Selenium 提供的窗口切换方法是:

WebDriver.switch_to.window()

WebDriver 对象有 window_handles 属性,返回一个列表,里面记录了当前浏览器所有的窗口句柄。

句柄:对应窗口的 id

# 获取当前浏览器上所有窗口句柄
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.get("https://www.baidu.com/")  # 跳转百度首页
sleep(1)
element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]")  # 定位“视频”元素
element.click()  # 点击
sleep(1)
print(driver.current_window_handle)  # 当前浏览器句柄:CDwindow-1FABF3D9B0B190F9883E66F25481738E
print(driver.window_handles)  # 获取所有句柄:['CDwindow-1FABF3D9B0B190F9883E66F25481738E', 'CDwindow-0871993F618fdbE540426562AEA2FB32']
for handle in driver.window_handles:
    print(handle)

driver.quit()  # 关闭浏览器

因为 window_handles 返回的是一个列表,所以,可以通过列表下标来更换当前浏览器的窗口句柄,来实现窗口的自由切换:

# 模拟场景:通过百度首页,打开 hao123,再通过 hao123 点击京东,进入京东首页搜索“笔记本电脑”
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()  # 打开浏览器
driver.get("https://www.baidu.com/")  # 跳转百度首页
sleep(1)
element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]")  # 定位“hao123”元素
element.click()  # 点击
sleep(1)
windows1 = driver.window_handles  # 获取所有窗口句柄
print(windows1)  # 打印句柄列表
print(driver.current_window_handle)  # 打印切换前的句柄
driver.switch_to.window(windows1[-1])  # 切换到最后一个句柄
print(driver.current_window_handle)  # 打印切换后的句柄
element1 = driver.find_element_by_xpath("//li[@data-id='11']//a[1]")  # 在 hao123 定位 京东
element1.click()  # 点击
windows2 = driver.window_handles  # 第二次获取所有窗口句柄
print(windows2)  # 打印句柄列表
print(driver.current_window_handle)  # 打印切换前的句柄
driver.switch_to.window(windows2[-1])  # 第二次切换到最后一个句柄
print(driver.current_window_handle)  # 打印切换后的句柄
element2 = driver.find_element_by_xpath("//input[@aria-label='搜索']")  # 定位搜索输入框
element2.send_keys("笔记本电脑")  # 输入内容
element3 = driver.find_element_by_class_name("button")  # 定位搜索按钮
element3.click()  # 点击
sleep(3)

driver.quit()  # 关闭浏览器

通过这个实例操作,可以看到,每一次切换窗口,都需要对获取到最新的句柄位置。

同样,由于 WebDriver.window_handles 返回的是一个列表,也可以通过下标值来切换到旧的窗口。

总结

在这里插入图片描述

写在最后

2021年,不要只做收藏从未停止,行动从未开始的人,很多事情,做着做着就无师自通了。如果在做的过程中还能稍微加点思考,稍微看一些别人的经验和做法,成长会更快,效果也会更好!

还不过瘾? 如果我的分享对你有那么一点点启发和帮助,请:

1、点赞。防止以后找不到,想看的时候,在自己主页就能找到了,很方便;
2、关注我和专栏。让我们成为长期关系,下一篇分享更多的硬核干货;
3、本文来源,公众号:程序员一凡。这样的好内容,里面还有近百篇。 谢谢你的支持
4.软件测试技术交流群:1079636098

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐