浏览器多窗口处理

    有时候我们在测试一个web 应用时会出现多个浏览器窗口的情况,在selenium1.0 中这个问题比较难处理。webdriver 提供了相关相方法可以很轻松的在多个窗口之间切换并操作不同窗口上的元素。

 

                                                                 图 3.10

要想在多个窗口之间切换,首先要获得每一个窗口的唯一标识符号(句柄)。通过获得的句柄来区别分不同的窗口,从而对不同窗口上的元素进行操作。

 

代码示例:

#coding=utf-8
from selenium import webdriver
import time


driver = webdriver.Firefox()
driver.get("http://www.baidu.com/")


#获得当前窗口
nowhandle=driver.current_window_handle

#打开注册新窗口
driver.find_element_by_name("tj_reg").click()

 

#获得所有窗口

 

allhandles=driver.window_handles

#循环判断窗口是否为当前窗口
for handle in allhandles:
     if handle != nowhandle:
             driver.switch_to_window(handle)
             print 'now register window!'

 

#切换到邮箱注册标签
driver.find_element_by_id("mailRegTab").click()


time.sleep(5)


driver.close()   # 关闭当前窗口调用close()方法

 

#回到原先的窗口
driver.switch_to_window(nowhandle)

driver.find_element_by_id("kw").send_keys(u"注册成功!")


time.sleep(3)


driver.quit()     #quit()用于退出驱动程序并关闭所有相关窗口

 

说明:

处理过程:
这个处理过程相比我们前面的元素操作来说稍微复杂一些,执行过程为:首选通过nowhandle 获得当前窗口(百度首页)的句柄;然后,打开注册窗口(注册页);通过allhandles 获得所有窗口的句柄;对所有句柄进行循环遍历;判断窗口是否为nowhandle(百度首页),如果不是则获得当前窗口(注册页)的句柄;然后,对注册页上的元素进行操作。最后,回返到首页。


为了使执行过程更多更容易理解,在切换到注册页时,打印了'now register window!'一条信息;切换回百度首页时,我们在输入框输入了“注册成功!”。注意,我们在切换到注册页时,只是切换了一下邮箱注册标签,如果要直执行注册过程还需要添加更多的操作步骤。

在本例中所有用到的新方法:


current_window_handle
获得当前窗口句柄

 

window_handles
返回的所有窗口的句柄到当前会话

switch_to_window()
用于处理多窗口操作的方法,与我们前面学过的switch_to_frame() 是类似,switch_to_window()用于处理多窗口之间的切换,switch_to_frame() 用于处理多框架的切换。


close()

如果你足够细心会发现我们在关闭“注册页”时用的是close()方法,而非quit();close()用于关闭当前窗口,quit()用于退出驱动程序并关闭所有相关窗口。

posted on 2016-12-27 15:39  chenzx0918  阅读(313)  评论(0编辑  收藏  举报

导航