多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] 前言    有些页面的链接打开后,会重新打开一个窗口,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。 <br /> 一、认识多窗口 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) <br /> 二、获取当前窗口句柄 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) # 打印首页句柄 ``` <br /> 三、获取所有句柄 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) # 打印所有的句柄 ``` <br /> 四、切换句柄 网上大部分教程都是些的第一种方法,小编这里新增一个更简单的方法,直接从获取所有的句柄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) <br /> 六、参考代码 ``` # 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) ```