Selenium—iframe的操作
什么是iframe?
<iframe> 标签是一个内联框架,即用来在当前 HTML 页面中嵌入另一个文档的,且所有主流浏览器都支持iframe标签。
简单说,就是在一个页面内,又嵌入了一个页面,看似是一个页面,但是在selenium中,无法对iframe内元素进行直接定位
示例:
打印出网易云音乐-云音乐热歌榜中前10首歌曲名
我们先定位出排行榜中前10首歌曲的元素
简单说一下,为什么使用红色框内的 id 信息
定位元素,一般我们会直接先定位到某一首歌曲信息,此时我们发现该歌曲的 id 属性值为一长串数字,此时我们有必要怀疑,该数值是随机生成的
验证:复制该元素的 id 属性值,刷新界面,重新查看该元素的 id 属性值,是否与刚刚复制下来的内容一致,如不一致,则验证了第 1 条的假设
验证第 1 条之后,此时我们需要做的就是往上层找,看看是否存在我们能直接定位到元素的属性值
父元素的 class 属性值,可以直接准确定位,则该元素可用
再往上找,蓝色框内的 id 属性值可以看出,均存在乱序内容,我们第一反应就应该为 该属性值 不可用
再往上找到 id = song-list-pre-cache 的属性值,可以看出是有序的,可直接定位
此时,第 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)中,输出结果为空,并没有报错,这是为什么呢?
知识点
find_elements :注意 s ,复数;返回的为列表形式,如果为查找到元素,则返回空列表,无报错信息
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 ,然后再切换
iframe = driver.find_elements_by_tag_name('iframe')[0]
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的操作相关推荐
- Selenium教程(4)操作选择框
目录 Selenium教程(1)选择和查找基本元素 Selenium教程(2)CSS元素操作 Selenium教程(3)IFrame切换/窗口切换 Selenium教程(4)操作选择框 1.选择框操作 ...
- java communiframe_[Java教程]javascript iframe相关操作
[Java教程]javascript iframe相关操作 0 2014-08-21 21:02:45 1. 获得iframe的window对象 iframeElement.contentWindow ...
- selenium之鼠标操作详解
前言 人类频繁的用手操作鼠标和键盘,为了解决这个问题,selenium工具为我们提供了一个类来处理这些事件- Actionchains ,该类可以完成鼠标移动,鼠标点击事件.键盘输入.内容菜单交互等交 ...
- Selenium经典API操作
Selenium经典API操作 三种等待方式 1.强制等待--sleep(等待时间) time库中的sleep()函数 不管怎么样,让等几秒就等几秒 真正测试的时候不需要死等,只要页面刷新出元素了就可 ...
- python 页面script xpath_python selenium xpath定位操作
xpath是一种在xm文档中定位的语言,详细简介,请自行参照百度百科,本文主要总结一下xpath的使用方法,个人看法,如有不足和错误,敬请指出. 注意:xpath的定位 同一级别的多个标签 索引从1开 ...
- Selenium定位元素操作实例详解
Selenium定位元素操作示例 本文实例讲述了Selenium定位元素操作.分享给大家供大家参考,具体如下: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器 ...
- 已解决python selenium模块自动化操作谷歌浏览器点击元素失效问题解决(亲测有效)
已解决python selenium模块自动化操作浏览器点击元素,抛出异常selenium.common.exceptions.ElementClickInterceptedException: Me ...
- selenium自动化之iframe弹窗操作实例
以登录腾讯课堂为例介绍iframe弹窗的操作 # -*- coding:utf-8 -*- import timefrom selenium.webdriver.common.by import By ...
- selenium之frame操作
前言 很多时候定位元素时候总是提示元素定位不到的问题,明明元素就在那里,这个时候就要关注你所定位的元素是否在frame和iframe里面 frame标签包含frameset.frame.iframe三 ...
最新文章
- CENTOS6.5安装日志分析ELK elasticsearch + logstash + redis + kibana
- 什么是python-了解什么是Python面向对象(1)
- Python构造栈结构
- kali linux 清华源_Kali Linux系统更新安装国外源教程:
- 【Oracle】DG三种保护模式及切换方式
- hdu 1556 Color the ball (线段树做法)
- C#基础笔记(第十天)
- 揭秘世界五大著名黑客
- 2021-11-12 Capturing Car-Following Behaviors by Deep Learning
- KinectFusion原理介绍
- 【文本差异对比工具网页版】
- VSYNC与HSYNC与PCLK与什么有关系
- qboimathtest1 t2 配对
- VM中调节系统窗口大小
- [表格扫描OCR]快速扫描识别并获取表格图片内容[免费]
- 弹窗代码(详细说明)
- 安卓期末作品简单_小东说:写ios和安卓系统的人到底有多牛?
- 【流量池】BD跨界营销(6)
- 软件工程1 初识软件工程
- jsp327的个人目标计划时间管理系统(idea运行)ssm+mysql
热门文章
- 女性排卵期的七个表现,把握住提前当宝妈
- php 女生生理计算,女性的安全期怎么算_世界避孕日官方网站
- 已解决:Downloading https://github.com/ultralytics.../yolov5n6.pt to yolov5n6——ubuntu18.4-yolov5报错记录[02]
- Intel Complier
- 文艺青年之——图形与图片的不同
- cmd命令跳转至指定目录
- 找工作标准简历表-Word简历可编辑下载
- python小记--攻防世界simple_js解题脚本编写
- 什么样的机器翻译比Google还要占优? | 硬创公开课
- 酷派发布新品牌ivvi,精品手机市场格局再变