第 4 章 WebDriver API - 4.9 多表单切换 - 4.8 定位一组元素

4.9 多表单切换

在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素进行识别和定位,无法直接定位 frame/iframe 表单内嵌页面上的元素,这时就需要通过 switch_to.frame()方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面。
这里以 126 邮箱登录为例,登录框结构如下。

第 4 章 WebDriver API - 4.9 多表单切换 - 4.8 定位一组元素

通过 switch_to.frame()方法切换表单。

"""
*  switch_to.frame()  进入表单
*  switch_to.default_content()  退出表单至根页面
"""
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get("http://www.126.com")
sleep(2)

login_frame = driver.find_element_by_css_selector(iframe[id^="x-URS-iframe"])
driver.switch_to.frame(login_frame)
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()

driver.quit()

switch_to.frame()默认可以直接对表单的 id 属性或 name 属性传参,因而可以定位元素的对象。在这个例子中,表单的 id 属性后半部分的数字(1553484417298.5217)是随机变化的,在 CSS 定位方法中,可以通过「^=」匹配 id 属性为以「x-URS-iframe」开头的元素。

最后,通过 switch_to.default_content()回到最外层的页面。

4.10 多窗口切换

在页面操作过程中,有时单击某个链接会弹出新的窗口,这时就需要切换到新打开的窗口中进行操作。WebDriver 提供的 switch_to.window()方法可以实现在不同的窗口间切换。
● current_window_handle:获得当前窗口句柄。
● window_handles:返回所有窗口的句柄到当前会话。
● switch_to.window():切换到相应的窗口。

以百度首页和账号注册页为例,在两个窗口之间的切换如图 4-4 所示。

第 4 章 WebDriver API - 4.9 多表单切换 - 4.8 定位一组元素

"""
*  switch_to.window()  切换窗口
*  current_window_handle 获得当前窗口的句柄
*  window_handles:返回所有窗口的句柄到当前会话
"""
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

# 获得百度搜索窗口句柄
search_windows = driver.current_window_handle

driver.find_element_by_link_text(登录).click()
driver.find_element_by_link_text("立即注册").click()

# 获得当前所有打开的窗口的句柄
all_handles = driver.window_handles

# 进入注册窗口
for handle in all_handles:
    if handle != search_windows:
        driver.switch_to.window(handle)
        print(driver.title)
        driver.find_element_by_name("userName").send_keys(username)
        driver.find_element_by_name(phone).send_keys(138xxxxxxx)
        time.sleep(2)
        # ……
        # 关闭当前窗口
        driver.close()


# 回到搜索窗口
driver.switch_to.window(search_windows)
print(driver.title)

driver.quit()

脚本的执行过程:首先打开百度首页,通过 current_window_handle 获得当前窗口句柄,并赋值给变量 search_handle。接着打开登录弹窗,在登录弹窗上单击「立即注册」链接,从而打开新的注册窗口。通过 window_handles 获得当前所有窗口句柄(包含百度首页和账号注册页),并赋值给变量 all_handles。
循环遍历 all_handles,如果 handle 不等于 search_handle,那么一定是注册窗口,因为在脚本执行过程中只打开了两个窗口。然后,通过 switch_to.window()切换到账号注册页。

 

第 4 章 WebDriver API - 4.9 多表单切换 - 4.8 定位一组元素

上一篇:WPF 从当前层次遍历查找 子控件及父控件


下一篇:Core WebAPI配置Swagger