2 多表单切换

在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

1.switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。
from selenium import webdriver
import time
url = 'http://www.126.com/'

driver = webdriver.Firefox()

# 访问126邮箱
driver.get(url)
time.sleep(5)
# 直接通过id进入
driver.switch_to.frame('x-URS-iframe')
# 先定位到元素再进入
el_frame = driver.find_element_by_id('x-URS-iframe')
driver.switch_to.frame(el_frame)

try:
    # 定位并输入账号
    el_user = driver.find_element_by_name('email')
    el_user.send_keys('itcast_soft_test')
    # 定位并输入密码
    el_pwd = driver.find_element_by_name('password')
    el_pwd.send_keys('1qaz2wsx#EDC')
    # 定位并点击登录
    el_sub = driver.find_element_by_id('dologin')
    el_sub.click()
    time.sleep(5)
except:
    print ('页面上没有账号密码输入框')

driver.quit()
2.driver.switch_to.default_content()
 跳回最外层的页面。
3.driver.switch_to.parent_frame()
 跳回上层的页面。
案例(此案例需配合文件运行):
from selenium import webdriver
import os
import time

file_path = 'file:///' + os.path.abspath('example_frame.html')
print (file_path)

driver = webdriver.Firefox()
# 加载本地html文件
driver.get(file_path)

# 进入到第一层表单,通过id值
driver.switch_to.frame('itcast_frame1')
time.sleep(5)

# 进入到第二层表单,通过元素定位
driver.switch_to.frame('itcast_frame2')
time.sleep(5)

# 定位到搜索栏标签
el_input = driver.find_element_by_id('sb_form_q')
el_input.send_keys('selenium')

el_sub = driver.find_element_by_id('sb_form_go')
el_sub.submit()
time.sleep(5)
driver.switch_to.parent_frame()

try:
    el_input = driver.find_element_by_id('sb_form_q')
except:
    print('已经退出到上级表单')