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() #返回到主页面

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Python可以使用selenium库来爬取iframe嵌套页面。首先需要安装selenium库和对应的浏览器驱动,如ChromeDriver。然后可以使用以下代码来实现: ```python from selenium import webdriver # 创建浏览器对象 driver = webdriver.Chrome() # 打开目标网页 driver.get('http://example.com') # 切换到iframe iframe = driver.find_element_by_xpath('//iframe[@id="iframe_id"]') driver.switch_to.frame(iframe) # 在iframe中进行操作 # ... # 切换回主页面 driver.switch_to.default_content() # 关闭浏览器 driver.quit() ``` 其中,`find_element_by_xpath`方法可以根据xpath表达式查找iframe元素,`switch_to.frame`方法可以切换到该iframe中进行操作,`switch_to.default_content`方法可以切换回主页面。在iframe中进行操作的代码可以根据具体情况进行编写。 ### 回答2: Python爬取iframe嵌套页面需要充分了解iframe的概念及其与网页的关系。iframe即内联框架,是HTML中的一种标签,用于嵌套一个HTML页面。在实际应用中,网站经常使用iframe嵌套的方式来加载各种广告、调查问卷、意见反馈、视频等内容。这种方式可以很好地将网页功能分离,但也为Python爬虫带来了一定的挑战。 要爬取iframe嵌套页面,我们需要先获取主页面的HTML源代码。通过对源代码的分析,我们可以找到iframe标签的相关信息,包括其所在网址、宽度、高度等。通过Webdriver或Requests等Python库,我们可以打开这个iframe嵌套的网址,并获取其HTML源代码。这时需要注意的是,由于iframe嵌套在主页面中的,所以可能需要手动设置User-Agent等参数以保证爬取的正常。 获取到iframe嵌套页面的源代码后,我们就可以根据需要进行数据的提取和处理。在进行数据提取的过程中,我们需要注意一下几点: 1. 确认是否需要使用BeautifulSoup等库解析页面源代码。 2. 对于JavaScript动态加载的数据,需要寻找其Ajax请求URL,并模拟Ajax请求获取数据。 3. 对于通过iframe嵌套页面中,可能需要多层嵌套的情况,需要进行递归爬取处理。 总的来说,Python爬取iframe嵌套页面需要结合HTML基础知识和相关库的使用,仔细分析页面结构及其特性,并进行较为复杂的代码处理。通过不断的实践和磨合,我们的爬虫能力才能够得到进一步提升。 ### 回答3: Python是一个非常强大的编程语言,可以用来处理各种各样的任务,其中包括Web爬虫。在Web爬虫中,有很多情况下需要采集iframe嵌套页面,这是一个比较复杂的问题,但是使用Python是可以很容易地解决的。 在爬取iframe嵌套页面之前,我们需要了解一下iframe的原理。在简单的说,iframe一个内嵌网页框架,它可以加载其他网页。当我们使用Python爬取iframe嵌套页面时,需要分以下两种情况分别考虑。 第一种情况是远程iframe页面。当我们的嵌套页面是来自其他的域名时,我们需要使用Python中的Requests包进行跨域访问。首先,我们需要通过Requests包获取主页面的源代码,然后使用正则表达式或Beautiful Soup对源代码进行解析,找到iframe标签的src属性。最后,我们再次使用Requests包对src属性进行访问,然后获取目标页面的源代码即可。 第二种情况是同源iframe页面。当我们的嵌套页面来自同一个域名下时,我们可以直接通过Python中的Selenium包进行访问。Selenium包是一个自动化测试工具,可以用来模拟用户操作浏览器,因此可以很方便地访问同源iframe页面。首先,我们需要启动一个浏览器实例,然后通过WebDriver获取iframe页面的源代码。 总的来说,使用Python爬取iframe嵌套页面并不容易,因为这需要一定的编程技巧和Web开发知识。但是,如果我们掌握了上述两种情况的方法,我们就可以很方便地解决这个问题,并且提高我们的爬虫效率。如果您想要了解更多关于Python网络爬虫、Requests包和Selenium包的使用方法,请参考相关文献或教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值