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('已经退出到上级表单')