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
View Code

 

posted @ 2017-10-10 16:36  代码羡  阅读(1865)  评论(0编辑  收藏  举报