什么是iframe?

<iframe> 标签是一个内联框架,即用来在当前 HTML 页面中嵌入另一个文档的,且所有主流浏览器都支持iframe标签。

简单说,就是在一个页面内,又嵌入了一个页面,看似是一个页面,但是在selenium中,无法对iframe内元素进行直接定位

示例:

  打印出网易云音乐-云音乐热歌榜中前10首歌曲名

我们先定位出排行榜中前10首歌曲的元素

简单说一下,为什么使用红色框内的 id 信息

  1. 定位元素,一般我们会直接先定位到某一首歌曲信息,此时我们发现该歌曲的 id 属性值为一长串数字,此时我们有必要怀疑,该数值是随机生成的

  2. 验证:复制该元素的 id 属性值,刷新界面,重新查看该元素的 id 属性值,是否与刚刚复制下来的内容一致,如不一致,则验证了第 1 条的假设

  3. 验证第 1 条之后,此时我们需要做的就是往上层找,看看是否存在我们能直接定位到元素的属性值

  4. 父元素的 class 属性值,可以直接准确定位,则该元素可用

  5. 再往上找,蓝色框内的 id 属性值可以看出,均存在乱序内容,我们第一反应就应该为 该属性值 不可用

  6. 再往上找到 id = song-list-pre-cache 的属性值,可以看出是有序的,可直接定位

  7. 此时,第 4 条与第 6 条均可实现精准定位,作者这里是习惯性的使用了 id 属性

查找到元素后,我们直接撸代码,打印出歌曲信息即可

from selenium importwebdriverdriver=webdriver.Chrome()
driver.implicitly_wait(10)#抓取排行榜信息
driver.get('https://music.163.com/#/discover/toplist?id=3778678')div= driver.find_elements_by_css_selector('#song-list-pre-cache .m-table-rank tbody tr:nth-child(-n+10) b')#使用for循环,获取到每首歌曲的元素,并打印出该元素的 text 属性值for one indiv:print(one.get_attribute('title')) driver.quit()

输出结果:

#在漫长的隐式等待(10s)中,输出结果为空,并没有报错,这是为什么呢?

知识点

  1. find_elements :注意 s ,复数;返回的为列表形式,如果为查找到元素,则返回空列表,无报错信息

  2. find_element : 定位某一元素,如果指定的时间内,未找到该元素,则会抛出错误

修改一下我们的代码:

from selenium importwebdriverdriver=webdriver.Chrome()
driver.implicitly_wait(10)#抓取排行榜信息
driver.get('https://music.163.com/#/discover/toplist?id=3778678')songList= driver.find_element_by_id('song-list-pre-cache')
div= songList.find_elements_by_css_selector('.m-table-rank tbody tr:nth-child(-n+10) b')#使用for循环,获取到每首歌曲的元素,并打印出该元素的 text 属性值
for one indiv:print(one.get_attribute('title')) driver.quit()

看一看我们的输出结果:

阿西吧,果然报错了,错在第8行:songList = driver.find_element_by_id('song-list-pre-cache');但是我们明明可以在浏览器中定位到该元素啊?

定位iframe

定位没有问题,那么我们就需要考虑是不是 iframe 在搞鬼!

重新查看一下我们的元素信息

从红色的框框内,我们看到了 id="song-list-pre-cache" 的 父元素 和 子元素,我们往前找,蓝色框内,存在了一个 #g_iframe 的父元素

点击蓝色区域,让我们看一下 iframe

我们可以确定了,排行榜的歌曲信息,是写在一个 iframe 框架内,那我们该如何操作 iframe 中的元素呢?

切换iframe

  • 通过 id 切换,且 id 唯一

    • driver.switch_to.frame('g_iframe')
  • 通过 name 切换,且 name 唯一

    • driver.switch_to.frame('contentFrame')
  • 若无 id 和 name ,则需要先定位到 iframe ,然后再切换

    1. iframe = driver.find_elements_by_tag_name('iframe')[0]
    2. driver.switch_to.frame(iframe)

切回主文档

  我们切入到 iframe 框架内进行操作后,需要再次回到主文档区域进行操作,就必须要切回主文档

  • driver.switch_to_default_content()

多嵌套iframe

  既然主文档可以嵌套 iframe ,那么 iframe 同样可以嵌套 iframe ,那么存在这种多重嵌套我们要怎么处理呢?

<html><iframeid="frame1"><iframeid="frame2"/></iframe>
</html>

  如果我们需要操作 iframe2 中的元素,我们需要切换 2 次

  • 先从主文档切换至 iframe1

    • driver.switch_to.frame('iframe1')
  • 再从 iframe1 切换至 iframe2
    • driver.switch_to.frame('iframe2')

  

  我们切到 iframe2 中操作完之后,需要回到 iframe1 中进行操作,selenium 提供了一个更好的方式,避免了从 iframe2 切到主文档 再切到 iframe1 的复杂

  • 从 iframe2 切回至 iframe1

    • driver.switch_to.parent_frame()

让我们来完成之前的需求:

from selenium importwebdriverdriver=webdriver.Chrome()
driver.implicitly_wait(10)#抓取排行榜信息
driver.get('https://music.163.com/#/discover/toplist?id=3778678')#定位到 iframe 的元素
iframe = driver.find_elements_by_tag_name('iframe')[0]#切到 iframe 框架内
driver.switch_to.frame(iframe)songList= driver.find_element_by_id('song-list-pre-cache')
div= songList.find_elements_by_css_selector('.m-table-rank tbody tr:nth-child(-n+10) b')#使用for循环,获取到每首歌曲的元素,并打印出该元素的 text 属性值
for one indiv:print(one.get_attribute('title'))#切到 iframe 的上一层,即为主文档
driver.switch_to.parent_frame()#打印主文档的一段内容
meta = driver.find_element_by_css_selector('meta[name="description"]')print('\n'+meta.get_attribute('content'))driver.quit()

输出结果如下:

心如止水
多想在平庸的生活拥抱你
归去来兮
晚安
我曾
四块五
出山
Monsters
那个女孩
像鱼网易云音乐是一款专注于发现与分享的音乐产品,依托专业音乐人、DJ、好友推荐及社交功能,为用户打造全新的音乐生活。

  

参考文档:

  selenium切换到iframe:https://www.cnblogs.com/xiaoxiaolvdou/p/9316805.html

转载于:https://www.cnblogs.com/wilson-5133/p/10935835.html

Selenium—iframe的操作相关推荐

  1. Selenium教程(4)操作选择框

    目录 Selenium教程(1)选择和查找基本元素 Selenium教程(2)CSS元素操作 Selenium教程(3)IFrame切换/窗口切换 Selenium教程(4)操作选择框 1.选择框操作 ...

  2. java communiframe_[Java教程]javascript iframe相关操作

    [Java教程]javascript iframe相关操作 0 2014-08-21 21:02:45 1. 获得iframe的window对象 iframeElement.contentWindow ...

  3. selenium之鼠标操作详解

    前言 人类频繁的用手操作鼠标和键盘,为了解决这个问题,selenium工具为我们提供了一个类来处理这些事件- Actionchains ,该类可以完成鼠标移动,鼠标点击事件.键盘输入.内容菜单交互等交 ...

  4. Selenium经典API操作

    Selenium经典API操作 三种等待方式 1.强制等待--sleep(等待时间) time库中的sleep()函数 不管怎么样,让等几秒就等几秒 真正测试的时候不需要死等,只要页面刷新出元素了就可 ...

  5. python 页面script xpath_python selenium xpath定位操作

    xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法,如有不足和错误,敬请指出. 注意:xpath的定位 同一级别的多个标签 索引从1开 ...

  6. Selenium定位元素操作实例详解

    Selenium定位元素操作示例 本文实例讲述了Selenium定位元素操作.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器 ...

  7. 已解决python selenium模块自动化操作谷歌浏览器点击元素失效问题解决(亲测有效)

    已解决python selenium模块自动化操作浏览器点击元素,抛出异常selenium.common.exceptions.ElementClickInterceptedException: Me ...

  8. selenium自动化之iframe弹窗操作实例

    以登录腾讯课堂为例介绍iframe弹窗的操作 # -*- coding:utf-8 -*- import timefrom selenium.webdriver.common.by import By ...

  9. selenium之frame操作

    前言 很多时候定位元素时候总是提示元素定位不到的问题,明明元素就在那里,这个时候就要关注你所定位的元素是否在frame和iframe里面 frame标签包含frameset.frame.iframe三 ...

最新文章

  1. CENTOS6.5安装日志分析ELK elasticsearch + logstash + redis + kibana
  2. 什么是python-了解什么是Python面向对象(1)
  3. Python构造栈结构
  4. kali linux 清华源_Kali Linux系统更新安装国外源教程:
  5. 【Oracle】DG三种保护模式及切换方式
  6. hdu 1556 Color the ball (线段树做法)
  7. C#基础笔记(第十天)
  8. 揭秘世界五大著名黑客
  9. 2021-11-12 Capturing Car-Following Behaviors by Deep Learning
  10. KinectFusion原理介绍
  11. 【文本差异对比工具网页版】
  12. VSYNC与HSYNC与PCLK与什么有关系
  13. qboimathtest1 t2 配对
  14. VM中调节系统窗口大小
  15. [表格扫描OCR]快速扫描识别并获取表格图片内容[免费]
  16. 弹窗代码(详细说明)
  17. 安卓期末作品简单_小东说:写ios和安卓系统的人到底有多牛?
  18. 【流量池】BD跨界营销(6)
  19. 软件工程1 初识软件工程
  20. jsp327的个人目标计划时间管理系统(idea运行)ssm+mysql

热门文章

  1. 女性排卵期的七个表现,把握住提前当宝妈
  2. php 女生生理计算,女性的安全期怎么算_世界避孕日官方网站
  3. 已解决:Downloading https://github.com/ultralytics.../yolov5n6.pt to yolov5n6——ubuntu18.4-yolov5报错记录[02]
  4. Intel Complier
  5. 文艺青年之——图形与图片的不同
  6. cmd命令跳转至指定目录
  7. 找工作标准简历表-Word简历可编辑下载
  8. python小记--攻防世界simple_js解题脚本编写
  9. 什么样的机器翻译比Google还要占优? | 硬创公开课
  10. 酷派发布新品牌ivvi,精品手机市场格局再变