浏览网页时,有时点击一个链接或按钮会弹出一个新窗口。使用Selenium进行web自动化测试,如果弹出新窗口时没有切换窗口,那么WebDriver对象的焦点对应的是旧窗口,后续的自动化操作会继续在旧窗口中进行。示例验证:#模拟场景:打开百度,点击左上角“视频”链接,打印出当前`WebDriver对象`对应的窗口信息fromseleniumimportwebdriverfromtimeimportsleedbriver=webdriver.Chrome()#打开浏览器driver.maximize_window()#浏览器最大化driver.get("https://www.baidu.com/")#跳转到百度首页sleep(1)element=driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]")#找到“视频”元素element.click()#点击sleep(1)print(driver.title)#百度一下就知道了print(driver.current_url)#https://www.baidu.com/driver.quit()#关闭浏览器根据程序打印结果,窗口仍停留在百度首页,当前url:https://www.baidu.com/,由此可以看出,Selenium并没有像我们预期的那样自动切换到新窗口。考虑到后面的操作步骤需要在新的窗口中进行,所以需要切换窗口。Selenium提供的窗口切换方法是:WebDriver.switch_to.window()WebDriver对象有window_handles属性,返回一个列表,里面记录了当前浏览服务器的所有窗口句柄。handle:对应窗口的id#获取当前浏览器上的所有窗口句柄fromseleniumimportwebdriverfromtimeimportsleeppriver=webdriver.Chrome()#打开浏览器driver.get("https://www.baidu.com/")#跳转到百度首页sleep(1)element=driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]")#定位到“video”元素element.click()#点击sleep(1)print(driver.current_window_handle)#当前浏览器句柄:CDwindow-1FABF3D9B0B190F9883E66F25481738Eprint(driver.window_handles)#获取所有句柄:['CDwindow-1FABF3D9B0B190F9883E66F25481738E','CDwindow-0871993F618FDBE540426562AEA2FB32']forhandleindriver.window_handles:print(handle)driver.quit()#关闭浏览器因为window_handles返回的是一个列表,所以可以用列表下标代替当前浏览器的窗口句柄,实现窗口的自由切换:#模拟场景:通过百度首页,打开hao123,然后通过hao123点击京东,进入京东首页,从selen搜索“笔记本电脑”iumimportwebdriverfromtimeimportsleedbriver=webdriver.Chrome()#打开浏览器driver.get("https://www.baidu.com/")#跳转到百度首页sleep(1)element=driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]")#定位“hao123”元素element.点击()#点击睡眠(1)windows1=driver.window_handles#获取所有窗口句柄print(windows1)#打印句柄列表print(driver.current_window_handle)#切换前打印句柄driver.switch_to.window(windows1[-1])#切换到最后一个句柄print(driver.current_window_handle)#打印切换后的句柄element1=driver.find_element_by_xpath("//li[@data-id='11']//a[1]")#定位京东element1.click()inhao123#点击windows2=driver.window_handles#第二次获取所有窗口句柄print(windows2)#打印句柄列表print(driver.current_window_handle)#切换前打印句柄driver.switch_to.window(windows2[-1])#切换到末尾为第二次Ahandleprint(driver.current_window_handle)#打印切换后的句柄element2=driver.find_element_by_xpath("//input[@aria-label='search']")#定位搜索输入框element2.send_keys("Laptop")#输入内容element3=driver.find_element_by_class_name("button")#定位搜索按钮element3.click()#点击sleep(3)driver.quit()#关闭浏览器通过本例操作可以看出,每次切换窗口,都需要获取最新的句柄位置。由于WebDriver.window_handles返回的是列表,所以也可以通过下标值切换到旧窗口。总结
