第二章(第7节):多窗口或多iframe切换
在页面操作过程中有时候点击某个链接会弹出新的窗口或标签页,这时就需要主机切换到新打开的窗口或标签页上进行操作,我们使用的 WebDriver 对窗口或标签页的切换使用的函数是一样的,故在本节学习中,为了方便描述,我们统一使用窗口。
在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位,对于 frame/iframe 表单内嵌页面上的元素无法直接定位。这时就需要通过 switch_to.frame() 方法将当前定位的主体切换为 frame/iframe 表单的内嵌页面中。
多窗口之间切换
WebDriver 提供了 switch_to.window() 方法,可以实现在不同的窗口之间切换。以百度首页和百度注册页为例,在两个标签页之间的切换代码如下。
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")
# 获得百度搜索窗口句柄
sreach_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 != sreach_windows:
driver.switch_to.window(handle) # 切换到下一个窗口
print('now register window!')
driver.find_element_by_name("account").send_keys('username')
driver.find_element_by_name('password').send_keys('password')
time.sleep(2)
driver.quit()
多 iframe 切换
我们以 126 邮箱登录框页面为例,该页面中有一个子页面 iframe,我们下面列出该页面的部分代码。
<html>
<iframe id="x-URS-iframe" ...>
<input name="email" >
想要操作登录框必须要先切换到 iframe 表单才能找到的该元素,然后才能去操作。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe') # 跳进该 iframe 页面
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content() # 跳回最外层的页面