在页面操作过程中有时候点击某个链接会弹出新的窗口或标签页,这时就需要主机切换到新打开的窗口或标签页上进行操作,我们使用的 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()
我们以 126 邮箱登录框页面为例,该页面中有一个子页面 iframe,我们下面列出该页面的部分代码。
<html> <body> ... <iframe id="x-URS-iframe" ...> <html> <body> ... <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() # 跳回最外层的页面 driver.quit()
switch_to.frame() 默认可以直接取表单的 id 或 name 属性,如果 iframe 没有可用的 id 和 name 属性,则可以先定位到该 iframe 元素,直接把该元素本身传入给 switch_to.frame() 函数。
# 先通过 xpth 定位到 iframe,当然你可以根据前面学的任何定位方法来定位 xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]') # 再将定位元素传给 switch_to.frame() 方法 driver.switch_to.frame(xf)
selenium 无所不能!厉害了,我的哥