多窗口和多表单
一, 多窗口
在实际操作中, 有些页面的链接点击会弹出一个新的窗口. 这时候如果需要到新的窗口上进行操作, 就需要学会窗口切换了.
1, 获得当前窗口句柄:
driver.current_window_handle
2, 获取当前所有的句柄:
driver.window_handles
3, 切换到相应的窗口:
driver.switch_to.window()
示例:
- from selenium import webdriver
- from time import sleep
- driver = webdriver.Chrome()
- driver.get("http://www.baidu.com")
- # 获取当前窗口句柄
- sreach_windows = driver.current_window_handle
- driver.find_element_by_link_text('登录').click()
- sleep(2)
- driver.find_element_by_link_text("立即注册").click()
- # 获得当前所有打开的窗口的句柄
- all_handles = driver.window_handles
- # 判断句柄是不是首页句柄
- for handle in all_handles:
- if handle != sreach_windows:
- # sleep(5)
- # driver.switch_to.window(sreach_windows)# 不是, 切换到首页
- sleep(5)
- driver.switch_to.window(handle)# 不是, 切换到注册页面
- sleep(5)
- driver.quit()
二, 多表单
在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用, Frame 与 Iframe 两者可以实现的功能基本相同, 不过 frame 是整个页面的框架, iframe 是内嵌的网页元素. WebDriver 只能在一个页面上对元素识别与定位, 对于 frame/iframe 表单内嵌页面上的元素无法直接定位.
1, 切换 iframe
driver.switch_to.frame()
switch_to.frame() 默认可以直接取表单的 id 或 name 属性. 如果 iframe 没有可用的 id 和 name 属性, 则可以通过下面的方式进行定位.
- x_frame = driver.find_element_by_xpath("//*[@id="9"]")
- driver.switch_to.frame(x_frame)
2, 释放 iframe
driver.switch_to.default_content()
示例:
- from selenium import webdriver
- from time import sleep
- driver = webdriver.Chrome()
- driver.get("http://mail.163.com/")
- sleep(2)
- # 切换 iframe
- driver.switch_to.frame("x-URS-iframe")
- driver.find_element_by_name("email").send_keys("chen")
- driver.find_element_by_name("password").send_keys("chen")
- # 释放 iframe
- driver.switch_to.default_content()
- sleep(5)