在做网页自动化测试的时候,难免会打开很多个网页,那么,如何在多个窗口之间切换呢?
获取窗口的唯一标识用句柄(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
效果如下:
全部代码如下:
#导入需要使用的包
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,获得当前窗口
now_handle=driver.current_window_handle
print("当前窗口",now_handle)
print("当前窗口",driver.title) #window_handles,获得所有窗口
allhandles=driver.window_handles
print("所有窗口",allhandles) #切换到最新打开的窗口
driver.switch_to_window(driver.window_handles[-1])
print(driver.title) #通过循环,判定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