如何解决Selenium句柄、多窗口问题
有时我们在打开浏览器浏览网页时,当点击网页上某些链接时,它不是直接在当前页面上跳转,而是重新打开一个新标签页面,对于这种情况,想在新页面上操作,就得先切换窗口了。获取窗口的唯一标识用句柄表示,所以只需要切换句柄,我们就能在多个页面上灵活自如的操作了。
一、认识多窗口
1、这里以赶集网为例,打开赶集网http://cd.ganji.com/,点击工作,就会发现会重新打开一个窗口;
image
二、获取当前窗口句柄
1.元素有属性,浏览器的窗口其实也有属性的,只是你看不到,浏览器窗口的属性用句柄(handle)来识别。
2.人为操作的话,可以通过眼睛看,识别不同的窗口点击切换。但是脚本没长眼睛,它不知道你要操作哪个窗口,这时候只能句柄来判断了。
3.获取当前页面的句柄:browser.current_window_handle
image
4.执行结果
image
三、获取所有窗口句柄
1、获取所有窗口句柄:brows.window_handles
image
2、执行结果
image
四、切换句柄
方法一:
1.循环判断是否与首页句柄相等;
2.如果不等,说明是新页面的句柄;
3.获取的新页面句柄后,可以切换到新打开的页面上;
4.打印新页面的title,看是否切换成功。
image
执行结果
image
方法二:
直接获取all_h这个list数据里面第二个hand的值:all_h[i]
image
执行结果
image
五、关闭新窗口,返回到原来的窗口
1.打开新页面后,其实只想验证新页面跳转对不对,这里可以做个简单的验证,获取当前页面的title验证;
2.验证完后切关闭新窗口;
3.切回句柄到首页;
4.打印当前页面的句柄,看是否切换到首页了。
image
执行结果
image
六、参考代码
#!/usr/bin/env python # -*- coding: utf-8 -*- # @File : handles.py # @Software: PyCharm import time from selenium import webdriver url = ‘http://cd.ganji.com/‘ browser = webdriver.Firefox() browser.get(url) time.sleep(5) # 获取当前页面的窗口句柄 handle = browser.current_window_handle print(handle) # 获取所有窗口句柄 browser.find_element_by_link_text(‘成都招聘‘).click() handles = browser.window_handles print(handles) # 方法一:判断句柄是否与首页相等 for i in handles: if i != handle: browser.switch_to.window(i) print(browser.title) browser.close() browser.switch_to.window(handle) print(browser.title) # 方法二:直接获取list列表里面的值,取值handles[i] # browser.switch_to.window(handles[0]) # print(browser.title) # 退出 browser.quit()