Selenium3 Python WebDriver API源码探析(6):窗口(标签)管理(切换、关闭)

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实例

猜你喜欢

转载自blog.csdn.net/mighty13/article/details/114676294
今日推荐