html中嵌套iframe页面_selenium表单切换(iframe)
在做web自动化的过程中会遇到一些弹出的登录页面,定位后,执行程序发现还是出现报错,其实定位可能没有问题,而是表单再作怪,也就是iframe
iframe
iframe是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架,也就html中在嵌套一个网页
iframe长什么样子
我们通常登录的163邮箱其实就是iframe。可以通过F12查看
如何定位iframe
我们知道什么是iframe了,那么如何定位?我们可以使用selenium中自带的一个方法 switch_to_frame ,这里的定位iframe可以是id属性也可以是name属性
源码
def switch_to_frame(self, frame_reference):""" Deprecated use driver.switch_to.frame"""
warnings.warn("use driver.switch_to.frame instead",
DeprecationWarning, stacklevel=2)
self._switch_to.frame(frame_reference)
小试牛刀
方法一:
这里安静通过switch_to_frane方法进行定位,这里的iframe的ID为动态id,每次启动都不通,使用正则表达式抓取
from selenium import webdriverimport timeimport re
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')# 获取页面HTML
html = driver.page_source# 找到iframe的id,这里iframe是动态的
r = re.findall(r'
上面我们在pychram代码中会发现,switch_to_frame()中有横线,这里官方是不建议使用的,我们可以使用switch_to.frame()
方法二:
前面介绍了显示等待以及等待元素的几种方法,这里我们也可以通过显示等待,循环查看是否存在iframe,然后进行跳转进去
from selenium import webdriverfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.support.ui import WebDriverWaitimport timeimport re
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')# 获取页面HTML
html = driver.page_source# 找到iframe的id,这里iframe是动态的
r = re.findall(r'
方法三:
从上面观察发现iframe后面的一些数字为动态的,可以通过在CSS定位方法中,可以通过“^=”匹配id属性为以“x-URS-iframe“开头的元素进行定位。
from selenium import webdriverimport timeimport re
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')# 获取页面HTML
html = driver.page_source
time.sleep(2)# 通过Css方法定位
r = driver.find_element_by_css_selector('iframe[id^="x-URS-iframe"]')
driver.switch_to_frame(r)
driver.find_element_by_name('email').send_keys('821006052')
跳转回原页面
执行完iframe上的操作后,需要跳转回原页面上,这里需要使用方法: switch_to.default_content() 和 switch_to.parent_frame()
源码:
def default_content(self):"""
Switch focus to the default frame.
:Usage:
driver.switch_to.default_content()"""
self._driver.execute(Command.SWITCH_TO_FRAME, {'id': None})
源码:
def parent_frame(self):"""
Switches focus to the parent context. If the current context is the top
level browsing context, the context remains unchanged.
:Usage:
driver.switch_to.parent_frame()"""
self._driver.execute(Command.SWITCH_TO_PARENT_FRAME)
快速查看定位元素是否处于iframe上
这里打开F12,通过ctrl+F,找到需要定位的元素,观察是否有iframe上。
安静简单的介绍了跳转iframe的过程,如果那里有不懂的或者写错的地方,都可以下方留言,感谢支持~
html中嵌套iframe页面_selenium表单切换(iframe)相关推荐
- vue 数组中嵌套数组_vue+element-ui表单校验之数组多层嵌套
表单校验两层数组嵌套 :prop="'collectKidDtoList.'+index+'.collectKid.'+i+'.collectCode'" :rules=" ...
- layui 父页面向弹出框中的子页面form表单进行赋值
1 ,父页面js layer.open({type: 2,title: '修改数据',shadeClose: false,shade: 0.8,area: ['60%', '60%'],content ...
- Winform开发框架中工作流模块的业务表单开发
在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦,而自定 ...
- 微信h5页面提交表单后返回键重复提交的问题
微信h5页面提交表单后返回键重复提交的问题 问题描述:h5表单提交保存成功之后,手机返回后原来的页面还能提交表单. 示例: mui.post('savexxxx',data,function(res) ...
- validate中submitHandler采用ajaxsubmit导致表单重复提交
validate中submitHandler采用ajaxsubmit导致表单重复提交 在这几日的表单验证实践中,由于我的三个form都放在一个页面上,所以在submit上采用的是ajax方式来提交表单 ...
- 浏览器--如何让登陆页面的表单不默认显示账号和密码
2019独角兽企业重金招聘Python工程师标准>>> 楼主做Javaweb项目,制作登陆页面访问时总是出现用户名和密码被自动填写的情况:如图楼主自制的网页登陆页面(这里以楼主用的C ...
- 解决在Vue中使用axios用form表单出现的问题
vue中使用Axios第三方库,采用形式提交,参数格式为multipart /格式数据 ,请求参数变为对象格式的解决办法.(推荐第二种方法) 提交数据的四种编码方式 一,应用/ X WWW的窗体-ur ...
- html5基础(网页基本标签、图像标签、超链接、列表、表格、媒体元素、iframe框架、表单)
网页的基本信息 1.DOCTYPE声明 文档类型的声明,约束HTML文档结构,检验是否符合相关Web标准,同时告诉浏览器,使用哪种规范来解释这个文档中的代码.DOCTYPE声明必须位于HTML文档第一 ...
- 【HTML5】html5中列表、表格、表单控件、浮动框架及结构化标签知识详解大全
一.列表 1.有序列表 <ol>有序列表 order list <li>列表项</li> <li>列表项</li> </ol> ...
最新文章
- win32thread.c:(.text+0x60):对‘_beginthreadex’未定义的引用
- 5分钟了解 Python 中的super函数是如何实现继承的
- zenmap 的扫描方式
- ABB机器人的错误处理
- 下面由我来给大家表演个绝活
- Turing equation
- 递归基础之N皇后问题
- ios签名软件_使用ios企业签名需要准备哪些?
- zabbix源码安装
- JDBC——连接数据库
- WebView学习笔记
- 细数继承与派生(纯干货推荐)1.0
- qq透明图像问题#13
- Mac 下制作win7启动U盘启动PE
- 射频IC行业为何这么惨?——RFIC的尴尬的现实和迷茫的未来
- MindManager2021补丁注册码激活码生成器
- 麒麟服务器操作系统V10虚拟机安装
- photoshop--PS拼图
- 实习工作日志 2019.03.06
- Ubuntu18.04下的音频录制和编辑软件Ardour及QjackCtl(jackd gui)
热门文章
- 无法解析的外部符号 class boost::system::error_category const __cdecl boost::system::system_category(void)
- opencv读取字符串图像
- ignite windows无法访问linux ignite集群_Linux常见命令
- java微信开发bae_在百度BAE2.0 JAVA环境下搭建属于自己的微信公众平台接口
- 你还不知道 Eureka 和 zookeeper 的区别吗?
- freemarker中js里面取字符串,换行导致报错的解决办法
- Java 中 PO 与 VO 的区别
- flask_sqlalchemy连接Mysql报TypeError: create_engine() got an unexpected keyword argument 'encoding'解决办法
- jenkins中配置Ant
- Python之装饰器入门