前言
上一篇博客介绍了iframe的切换,接下来还有两种比较重要的切换,窗口切换以及alert切换。
今天我们一起学习一下窗口切换
1、什么时候需要切换窗口?
- 在页面上操作某些元素时,会触发新的标签页的打开,需要定位新的标签页里面的元素或操作,那么我们就需要切换窗口至新的标签页,才能定位到目标元素。
2、切换句柄
- 1、每个窗口都会有自己一个独特的句柄,大家可以认为是窗口的唯一标识id,叫做句柄;
- 2、获取当前窗口的句柄
print(driver.current_window_handle)
- 3、获取当前浏览器所有窗口的句柄
handles=driver.window_handles
- 4、切换句柄
# handles 打印出来是一个句柄,-1 代表最后一个打开的窗口
driver.switch_to.window(handles[-1])
3、实例
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time
driver = webdriver.Chrome()
driver.implicitly_wait(30)
driver.get('https://www.jd.com')
# 获取当前所有的handles ,总数为一个窗口,返回handles是一个列表对象
handles= driver.window_handles
print(handles)
# 当前所在页的title
print(driver.title)
# 点击 京东超市 新打开第二个窗口
driver.find_element_by_xpath("//a[@aria-lable='京东超市']").click()
# 等待新的窗口出现
WebDriverWait(driver,10).until(EC.new_window_is_opened(handles))
# 获取当前所有的handles,总数为两个窗口
handles = driver.window_handles
# 切换至京东超市窗口,只要是切换至最新的窗口,都可以使用handles[-1],返回handles是一个列表对象
driver.switch_to.window(handles[-1])
print(handles)
print(driver.title) # 打印当前页的title
# 然后可以在新的窗口(京东超市)进行元素操作了
# 加一个显示等待,新的页面元素可点
locator = (By.XPATH,'//*[@id="chaoshi_fs_1"]/div[1]/div/ul[1]/li[2]/a')
WebDriverWait(driver,20).until(EC.visibility_of_element_located(locator))
# 点击 ‘超级量贩’
driver.find_element(*locator).click()
time.sleep(3)
driver.quit()
4、换一种方式实现切换句柄
其实如果两个窗口打开时,相互切换通过下表索引来切换会比较方便,如果多个窗口时,最好保持浏览器只有两个窗口,去一个页面操作完后,可以关闭当前的窗口。
例如
# 获取当前页面的handle
handle = driver.current_window_handle
# 获取所有窗口的句柄
handles=driver.window_handles
for i in handles :
if handle != i :
driver.switch_to.window(i)
print(driver.title)