WebDriver API之iframe、frame页面嵌套操作

在一个页面中可以嵌套另外一个页面,如frame/iframe技术,这是现在很多web应用中使用的一种方式,webdriver对象只能在一个页面(外层是默认的)中定位元素,需要一种方式将driver对象从外层切换给内层使用才能对内层的对象进行处理。
下图是qq邮箱登录页面,其中的登录框就是一个内嵌的frame页面,下面我们就以他为案例。

webdriver中提供的对iframe/frame操作API常用到有:
driver.switch_to.frame()
driver.switch_to.default_content()
driver.switch_to.parent_frame()
一、driver.switch_to.frame()
从外部页面切入frame框架中,参数可以为id/name/index及页面元素对象。
第一种方式:默认是可以给ID、name的
driver.switch_to.frame(“login_frame”)
第二种方式:给出页面的iframe的索引index,根据同层frame的顺序定位
driver.switch_to.frame()
第三种方式:可以传参iframe的元素对象
iframeObj = driver.find_element_by_xpath(’//*[@id=“login_frame”]’)
driver.switch_to.frame(iframeObj)

#导包、创建浏览器对象、打开qq首页
from selenium import webdriver
import time
driver = webdriver.Chrome()
# 1.打开腾讯首页;http://www.qq.com
driver.get("https://www.qq.com")

# 2.点击邮箱图标;
driver.find_element_by_link_text("Qmail").click()
# 跳转到邮箱登录界面(窗口),涉及到多窗口的处理
handles = driver.window_handles
driver.switch_to.window(handles[1])
#现在先验证窗口跳转是否成功
# driver.find_element_by_link_text("基本版").click()

# 3.输入用户名
#webdriver中提供API:driver.switch_to.frame()实现frame的切换
#第一种方式,默认是可以给ID或者name的
# driver.switch_to.frame("login_frame")
#第二种方式,可以传参iframe的元素对象
# iframeObj = driver.find_element_by_xpath('//*[@id="login_frame"]')
# driver.switch_to.frame(iframeObj)
#第三种方式,可以给索引号
driver.switch_to.frame(1)

driver.find_element_by_link_text('帐号密码登录').click()
driver.find_element_by_xpath('//*[@id="u"]').send_keys("2572612580")
time.sleep(2)
# 4.输入密码;
driver.find_element_by_xpath('//*[@id="p"]').send_keys("123456789")
time.sleep(2)
# 5.点击登录;
driver.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)
# 6.关闭浏览器。
driver.quit()

二、driver.switch_to.default_content()
切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。
driver.switch_to.default_content() # 直接从内层frame页面切换回到主文档中。
三、driver.switch_to.parent_frame()
如果frame/iframe有多层,我们可以通过driver.switch_to.frame()一层层切入到内层,并可以通过driver.switch_to.parent_frame()一层层再退出来,相当于前进、后退。
相对driver.switch_to.default_content()方法,是一层层退回,而不是直接退回主页面
driver.switch_to.frame(“frame1”) #从主页面切入到frame1,相当于前进
driver.switch_to.frame(“frame2”) #从frame1再切入到frame2,相当于前进
driver.switch_to.parent_frame() #返回到上级frame1,相当于后退
driver.switch_to.parent_frame() #返回到主页面

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值