[TOC]
前言
有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。
一、认识多窗口
1.打开赶集网:http://bj.ganji.com/,点击招聘求职按钮会发现右边多了一个窗口标签
![](https://yuedu.baidu.com/bookeditor/interface/imageview?book_id=0f6a093b7dd184254b35eefdc8d376eeaeaa17e3&file=b9dc0aae3a59c24d307151b828552712.png)
2.我们用代码去执行点击的时候,发现界面上出现两个窗口,如下图这种情况就是多窗口了。
![](https://yuedu.baidu.com/bookeditor/interface/imageview?book_id=0f6a093b7dd184254b35eefdc8d376eeaeaa17e3&file=159c99b8ea691fc4baafc7658eaa525a.png)
3.到这里估计有小伙伴纳闷了,手工点击是2个标签,怎么脚本点击就变成2个窗口了,脚本执行默认是不加载配置的,
手工点击是浏览器默认设置了新窗口打开方式为标签,这里用鼠标按住点二个标签,拖拽出来,也就变成2个标签了,是一回事。
![](https://yuedu.baidu.com/bookeditor/interface/imageview?book_id=0f6a093b7dd184254b35eefdc8d376eeaeaa17e3&file=163fd908c8a75ebfaa73e579beb6d952.png)
二、获取当前窗口句柄
1. 元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。
2. 人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。
3. 获取当前页面的句柄:driver.current\_window\_handle
```
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://bj.ganji.com/")
driver.implicitly_wait(10)
h = driver.current_window_handle
print(h) # 打印首页句柄
```
三、获取所有句柄
1. 定位赶集网招聘求职按钮,并点击
2. 点击后,获取当前所以的句柄:window\_handles
```
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://bj.ganji.com/")
driver.implicitly_wait(10)
h = driver.current_window_handle
print(h) # 打印首页句柄
driver.find_element_by_link_text("工作").click()
all_h = driver.window_handles
print(all_h) # 打印所有的句柄
```
四、切换句柄
网上大部分教程都是些的第一种方法,小编这里新增一个更简单的方法,直接从获取所有的句柄list里面取值。
方法一:
1. 循环判断是否与首页句柄相等
2. 如果不等,说明是新页面的句柄
3. 获取的新页面句柄后,可以切换到新打开的页面上
4. 打印新页面的title,看是否切换成功
方法二:
1. 直接获取all\_h这个list数据里面第二个hand的值:all\_h\[1\]
```
# 方法一:判断句柄,不等于首页就切换
for i in all_h:
if i != h:
driver.switch_to.window(i)
print(driver.title)
# 方法二:获取list里面第二个直接切换
driver.switch_to.window(all_h[1])
print(driver.title)
```
五、关闭新窗口,切回主页
1. 打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证
2. 验证完后切关闭新窗口
3. 切回句柄到首页
4. 打印当前页面的句柄,看是否切换到首页了
![Snipaste_2020-08-17_09-49-31.png](https://i.loli.net/2020/08/17/2wyBuJItLprH5iW.png)
六、参考代码
```
# coding:utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://bj.ganji.com/")
driver.implicitly_wait(10)
h = driver.current_window_handle
driver.find_element_by_link_text("工作").click()
all_h = driver.window_handles
# 方法一:判断句柄,不等于首页就切换
'''
for i in all_h:
if i != h:
driver.switch_to.window(i)
print(driver.title)
'''
# 方法二:获取list里面第二个直接切换
driver.switch_to.window(all_h[1])
print(driver.title)
# 关闭新窗口
driver.close()
# 切换到首页句柄
driver.switch_to.window(h)
print(driver.title)
```