selenium切换窗口
在做网页自动化测试的时候,难免会打开很多个网页,那么,如何在多个窗口之间切换呢?
获取窗口的唯一标识用句柄(handle)表示,因此只需要切换句柄,就可以灵活的在各窗口之间切换。
下面介绍几个方法
- current_windle_handle 获得当前窗口的句柄
- window_handles 获得所有窗口的句柄
- switch_to_window(handle) 切换到制定窗口
还是用例子说话:
在火狐首页中打开新浪,这样就有了两个窗口
#导入需要使用的包 from selenium import webdriver import time #设置要打开的网页链接 url="http://e.firefoxchina.cn/" driver = webdriver.Firefox() driver.get(url) time.sleep(3) #打开一个新窗口 driver.find_element_by_css_selector("a[title='新 浪']").click()
下面我们来看current_window_handle的用法
#获得当前窗口的handle now_handle=driver.current_window_handle #打印 print(now_handle)
打印的结果是13
新浪,是我们打开的新页面,所以,13一定是新浪的handle喽?
是与不是,我们把标题打印出来就知道啦。在上面的代码最后,打印标题。
#打印标题 print(driver.title)
what???!!!这不是火狐首页的标题吗?!
没错,我们点击一个连接,打开一个页面后,虽然,新的页面将原本的页面覆盖,但handle的焦点依然在原来页面上,需要我们进行切换。
但是,switch_to_winow(handle)是需要传递参数的,传递我们要切换的窗口的handle。如何知道窗口的handle?
#获得所有窗口 allhandles=driver.window_handles print("所有窗口:"+allhandles)
试一试效果
OK,13是火狐主页的,那56肯定是新开的页面的,多运行几次就会发现,56这各数字是在变的,所以我们不可能先通过window_handles获得编号,再去给程序增加代码的方式定位到新开的页面。
介绍两种方法切换窗口:
- 方法1:数组
传递的参数可以使用driver.windows_handles[数字]来表示。
可以将窗口的句柄想象为一个数组,数组的0值即为第一个窗口,1值为第二个窗口,以此类推,-1值表示最后一个窗口。
以打开最后一个窗口为例:
driver.switch_to_window(driver.window_handles[-1]) print(driver.title)
效果如下:
- 方法2:循环判定,任意切换
如果切换到随意一个窗口,可使用title来循环判定,这种方法较为复杂,不推荐使用。
for handle in allhandles: title="新浪首页" driver.switch_to_window(handle) print("当前为:"+driver.title) if title in driver.title: #验证 now=driver.current_window_handle print("切换后:"+now) print(driver.title) break
效果如下:
全部代码如下:
1 #导入需要使用的包 2 from selenium import webdriver 3 import time 4 5 #设置要打开的网页链接 6 url="http://e.firefoxchina.cn/" 7 driver = webdriver.Firefox() 8 driver.get(url) 9 time.sleep(3) 10 11 #打开一个新窗口 12 driver.find_element_by_css_selector("a[title='新 浪']").click() 13 14 15 16 #current_window_handle,获得当前窗口 17 now_handle=driver.current_window_handle 18 print("当前窗口",now_handle) 19 print("当前窗口",driver.title) 20 21 22 #window_handles,获得所有窗口 23 allhandles=driver.window_handles 24 print("所有窗口",allhandles) 25 26 #切换到最新打开的窗口 27 driver.switch_to_window(driver.window_handles[-1]) 28 print(driver.title) 29 30 #通过循环,判定title,切换 31 for handle in allhandles: 32 title="新浪首页" 33 driver.switch_to_window(handle) 34 print("当前为:"+driver.title) 35 36 if title in driver.title: 37 #验证 38 now=driver.current_window_handle 39 print("切换后:"+now) 40 print(driver.title) 41 break