本文来介绍如何处理driver在多窗口之间切换,想一下这样的场景,在页面A点击一个连接,会触发在新Tab或者新窗口打开页面B,由于之前的driver实例对象在页面A,但是你接下来的脚本是操作页面B的元素,这样就造成了找不到元素的报错。本文介绍selenium中switch_to.window()方法来处理这个问题。
测试场景:打开百度新闻(页面A),点击热点新闻中第一个新闻链接(一般是国家领导人的新闻),会在第二个窗口打开这个新闻的具体详情页(页面B),测试需要去判断你点击这个新闻,再打开的详情页是否正确。
问题拆分:
1. 我们已经知道switch_to.window()方法可以处理窗口切换的问题
2. 在页面A跳转到页面B之前,我们需要用一个变量保存这个新闻的标题
3. 切换到页面B后,我们获取这个新闻标题,然后和前面这个变量保存的值去对比,如果相等,那么就测试通过。
我们分两个步骤去解答这个测试需求:
1. 先实现页面A切换到页面B
2. 页面A和页面B两个新闻标题进行对比
先看看窗口切换的脚本代码:
import time from selenium import webdriver dr = webdriver.Chrome() dr.maximize_window() dr.get('http://news.baidu.com') time.sleep(1) dr.find_element_by_xpath("//*[@id='pane-news']/div/ul/li[1]/strong/a").click() print (dr.current_window_handle) #输出当前窗口句柄 handles = dr.window_handles #获取当前全部窗口句柄集合 print(handles) #输出句柄集合 for handle in handles: #切换窗口 if handle != dr.current_window_handle: print('switch to second window',handle) dr.close() #关闭第一个窗口 dr.switch_to.window(handle) #切换到第二个窗口
代码解释:
1. 先打印当前窗口(页面A)句柄,一个长字符串
2. 获取全部窗口句柄,这里我们有两个,打印出这两个句柄。
3. for 循环遍历,当发现其中一个句柄和当前句柄不相等,这里做了三件事,第一件,打印一个语句,告诉你马上要切换到第二个窗口,第二件,关闭当前窗口,这里指页面A,第三,切换到页面B窗口。
判断在打开新页面显示的新闻标题是不是你刚刚点击的新闻,脚本代码如下: