在浏览网页的时候,有时点击一个链接或者按钮,会弹出一个新的窗口。
应用 Selenium 进行 Web 自动化测试,如果弹出新窗口时,没有对窗口进行切换,那么,WebDriver 对象
的焦点对应的,仍然是旧窗口,后续的自动化操作,将持续在旧窗口中进行。
实例验证:
# 模仿场景:关上百度,点击左上角“视频”链接,打印出以后 `WebDriver 对象 ` 对应的窗口信息
from selenium import webdriver
from time import sleep
driver = 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
属性,返回一个列表,外面记录了以后浏览器所有的窗口句柄。
句柄:对应窗口的 id
# 获取以后浏览器上所有窗口句柄
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome() # 关上浏览器
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.current_window_handle) # 以后浏览器句柄:CDwindow-1FABF3D9B0B190F9883E66F25481738E
print(driver.window_handles) # 获取所有句柄:['CDwindow-1FABF3D9B0B190F9883E66F25481738E', 'CDwindow-0871993F618FDBE540426562AEA2FB32']
for handle in driver.window_handles:
print(handle)
driver.quit() # 敞开浏览器
因为 window_handles
返回的是一个列表,所以,能够通过 列表下标 来更换以后浏览器的窗口句柄,来实现窗口的自在切换:
# 模仿场景:通过百度首页,关上 hao123,再通过 hao123 点击京东,进入京东首页,搜寻“笔记本电脑”from selenium import webdriver
from time import sleep
driver = 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.click() # 点击
sleep(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]") # 在 hao123 定位 京东
element1.click() # 点击
windows2 = driver.window_handles # 第二次获取所有窗口句柄
print(windows2) # 打印句柄列表
print(driver.current_window_handle) # 打印切换前的句柄
driver.switch_to.window(windows2[-1]) # 第二次切换到最初一个句柄
print(driver.current_window_handle) # 打印切换后的句柄
element2 = driver.find_element_by_xpath("//input[@aria-label=' 搜寻 ']") # 定位搜寻输入框
element2.send_keys("笔记本电脑") # 输出内容
element3 = driver.find_element_by_class_name("button") # 定位搜寻按钮
element3.click() # 点击
sleep(3)
driver.quit() # 敞开浏览器
通过这个实例操作,能够看到,每一次切换窗口,都须要对获取到最新的句柄地位。
同样,因为 WebDriver.window_handles
返回的是一个列表,也能够通过下标值来切换到旧的窗口。
总结