WebDriver 不区分窗口和标签页。如果打开了一个新窗口(标签),可以使用窗口句柄(handle)来处理它。 每个窗口都有一个唯一的标识符,该标识符在单个会话中保持持久性。
获取当前窗口句柄
作用:获取当前窗口句柄
签名:driver.current_window_handle
调用对象:WebDriver
实例
值类型:字符串
获取浏览器窗口句柄集合
作用:获取当前浏览器的窗口句柄集合
签名:driver.window_handles
调用对象:WebDriver
实例
值类型:字符串列表
打开并切换新窗口
在浏览器中打开新窗口(标签)之后,虽然浏览器当前页面已经切换为新窗口,但是获取的当前句柄还是原窗口的句柄!
这个问题Selenium4
中的driver.switch_to.new_window
方法可以解决。
因此在Selenium3
中,打开新窗口,需要获取新窗口句柄并切换,才可以继续操作。
实验:验证打开新窗口之后窗口句柄的变化
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 获取当前窗口句柄、当前窗口标题、浏览器窗口句柄列表
print(repr(driver.current_window_handle), repr(
driver.window_handles), driver.title)
# 打开新窗口
driver.find_element_by_xpath("//a[@target='_blank']").click()
time.sleep(5)
# 获取当前窗口句柄、当前窗口标题、浏览器窗口句柄列表(当前窗口句柄还是原始窗口)
print(repr(driver.current_window_handle), repr(
driver.window_handles), driver.title)
# 关闭当前窗口(关闭的仍是原窗口)
driver.close()
time.sleep(5)
# 获取浏览器窗口列表
print(repr(driver.window_handles))
结果:
'18' ['18'] 百度一下,你就知道
'18' ['18', '23'] 百度一下,你就知道
['23']
案例:打开并切换新窗口
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get("http://www.baidu.com")
# 获取当前窗口句柄、当前窗口标题、浏览器窗口句柄列表
old_windows = driver.window_handles
print(repr(driver.current_window_handle), repr(old_windows), driver.title)
# 打开新窗口
driver.find_element_by_xpath("//a[@target='_blank']").click()
time.sleep(5)
# 获取当前窗口句柄、当前窗口标题、浏览器窗口句柄列表
new_windows = driver.window_handles
print(repr(driver.current_window_handle), repr(new_windows), driver.title)
# 切换窗口
new_window = set(old_windows) ^ set(new_windows)
driver.switch_to.window(list(new_window)[0])
time.sleep(5)
# 获取浏览器窗口列表
print(repr(driver.current_window_handle), repr(new_windows), driver.title)
结果:
'15' ['15'] 百度一下,你就知道
'15' ['15', '23'] 百度一下,你就知道
'23' ['15', '23'] 百度新闻——海量中文资讯平台
窗口/frame切换API类别
WebDriver
实例提供了两种类型的窗口切换API。
第一类:调用WebDriver
实例的switch_to
特性的相关方法
这种方法是Selenium
推荐使用的方式,_switch_to
对象是selenium\webdriver\remote\switch_to.py
中的SwitchTo
类实例。
源码:selenium\webdriver\remote\webdriver.py
中的WebDriver
类
@property
def switch_to(self):
"""
:Returns:
- SwitchTo: an object containing all options to switch focus into
:Usage:
element = driver.switch_to.active_element
alert = driver.switch_to.alert
driver.switch_to.default_content()
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
driver.switch_to.parent_frame()
driver.switch_to.window('main')
"""
return self._switch_to
第二类:调用WebDriver
实例的相关方法,其实现与第一类API等价,未来会被废弃
例如:driver.switch_to_window(window_name)
相当于driver.switch_to.window(window_name)
源码:selenium\webdriver\remote\webdriver.py
中的WebDriver
类
def switch_to_window(self, window_name):
""" Deprecated use driver.switch_to.window
"""
warnings.warn("use driver.switch_to.window instead",
DeprecationWarning, stacklevel=2)
self._switch_to.window(window_name)
窗口/frame切换API
源码:selenium\webdriver\remote\switch_to.py
中的SwitchTo
类
active_element
特性:返回当前活动元素
作用:返回当前活动元素(焦点所在元素),如果没有则返回body
元素。
签名:driver.switch_to.active_element
返回值:元素,即WebElement
对象
案例:打开百度首页,活动元素为搜索框;打开腾讯首页,活动元素为body
元素
alert
特性:将焦点切换至警告框
作用:将焦点切换至警告框。
签名:driver.switch_to.alert
返回值:元素,即WebElement
对象
default_content()
方法:将焦点切换至默认frame
作用:将焦点切换至警告框。
签名:driver.switch_to.default_content()
parent_frame()
方法:将焦点切换至默认父frame
作用:将焦点切换至默认父frame,如果当前上下文为浏览器,焦点保持不变。
签名:driver.switch_to.parent_frame()
window(window_name)
方法:将焦点切换至某窗口
作用:将焦点切换至将焦点切换至window_name
窗口。
签名:driver.switch_to.window(window_name)
参数:窗口名称或者窗口句柄
frame(frame_reference)
方法:将焦点切换至某frame
作用:将焦点切换至某frame。
签名:driver.switch_to.frame(frame_reference)
参数:frame名称,frame索引或frame元素引用
示例:
driver.switch_to.frame('frame_name')
driver.switch_to.frame(1)
driver.switch_to.frame(driver.find_elements_by_tag_name("iframe")[0])
关闭窗口
作用:如果当前浏览器有多个窗口时,关闭当前窗口。如果当前浏览器只有一个窗口时,关闭浏览器。
签名:driver.close()
调用对象:WebDriver
实例
关闭浏览器
作用:关闭整个浏览器
签名:driver.quit()
调用对象:WebDriver
实例