Selenium 窗口切换

SegmentFault

共 2829字,需浏览 6分钟

 ·

2020-08-07 05:30

来源:SegmentFault 思否社区

作者:Leofighting




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


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





实例验证:


# 模拟场景:打开百度,点击左上角“视频”链接,打印出当前`WebDriver 对象` 对应的窗口信息from selenium import webdriverfrom 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 webdriverfrom 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-1FABF3D9B0B190F9883E66F25481738Eprint(driver.window_handles) # 获取所有句柄:['CDwindow-1FABF3D9B0B190F9883E66F25481738E', 'CDwindow-0871993F618FDBE540426562AEA2FB32']for handle in driver.window_handles: print(handle)
driver.quit() # 关闭浏览器


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


# 模拟场景:通过百度首页,打开 hao123,再通过 hao123 点击京东,进入京东首页,搜索“笔记本电脑”from selenium import webdriverfrom 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 返回的是一个列表,也可以通过下标值来切换到旧的窗口。





总结






点击左下角阅读原文,到 SegmentFault 思否社区 和文章作者展开更多互动和交流。

- END -

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报