在做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)相关推荐

  1. vue 数组中嵌套数组_vue+element-ui表单校验之数组多层嵌套

    表单校验两层数组嵌套 :prop="'collectKidDtoList.'+index+'.collectKid.'+i+'.collectCode'" :rules=" ...

  2. layui 父页面向弹出框中的子页面form表单进行赋值

    1 ,父页面js layer.open({type: 2,title: '修改数据',shadeClose: false,shade: 0.8,area: ['60%', '60%'],content ...

  3. Winform开发框架中工作流模块的业务表单开发

    在我们开发工作流的时候,往往需要设计到具体业务表单信息的编辑,有些是采用动态编辑的,有些则是在开发过程中处理的,各有各的优点,动态编辑的则方便维护各种各样的表单,但是数据的绑定及处理则比较麻烦,而自定 ...

  4. 微信h5页面提交表单后返回键重复提交的问题

    微信h5页面提交表单后返回键重复提交的问题 问题描述:h5表单提交保存成功之后,手机返回后原来的页面还能提交表单. 示例: mui.post('savexxxx',data,function(res) ...

  5. validate中submitHandler采用ajaxsubmit导致表单重复提交

    validate中submitHandler采用ajaxsubmit导致表单重复提交 在这几日的表单验证实践中,由于我的三个form都放在一个页面上,所以在submit上采用的是ajax方式来提交表单 ...

  6. 浏览器--如何让登陆页面的表单不默认显示账号和密码

    2019独角兽企业重金招聘Python工程师标准>>> 楼主做Javaweb项目,制作登陆页面访问时总是出现用户名和密码被自动填写的情况:如图楼主自制的网页登陆页面(这里以楼主用的C ...

  7. 解决在Vue中使用axios用form表单出现的问题

    vue中使用Axios第三方库,采用形式提交,参数格式为multipart /格式数据 ,请求参数变为对象格式的解决办法.(推荐第二种方法) 提交数据的四种编码方式 一,应用/ X WWW的窗体-ur ...

  8. html5基础(网页基本标签、图像标签、超链接、列表、表格、媒体元素、iframe框架、表单)

    网页的基本信息 1.DOCTYPE声明 文档类型的声明,约束HTML文档结构,检验是否符合相关Web标准,同时告诉浏览器,使用哪种规范来解释这个文档中的代码.DOCTYPE声明必须位于HTML文档第一 ...

  9. 【HTML5】html5中列表、表格、表单控件、浮动框架及结构化标签知识详解大全

    一.列表 1.有序列表 <ol>有序列表 order list <li>列表项</li> <li>列表项</li> </ol> ...

最新文章

  1. win32thread.c:(.text+0x60):对‘_beginthreadex’未定义的引用
  2. 5分钟了解 Python 中的super函数是如何实现继承的
  3. zenmap 的扫描方式
  4. ABB机器人的错误处理
  5. 下面由我来给大家表演个绝活
  6. Turing equation
  7. 递归基础之N皇后问题
  8. ios签名软件_使用ios企业签名需要准备哪些?
  9. zabbix源码安装
  10. JDBC——连接数据库
  11. WebView学习笔记
  12. 细数继承与派生(纯干货推荐)1.0
  13. qq透明图像问题#13
  14. Mac 下制作win7启动U盘启动PE
  15. 射频IC行业为何这么惨?——RFIC的尴尬的现实和迷茫的未来
  16. MindManager2021补丁注册码激活码生成器
  17. 麒麟服务器操作系统V10虚拟机安装
  18. photoshop--PS拼图
  19. 实习工作日志 2019.03.06
  20. Ubuntu18.04下的音频录制和编辑软件Ardour及QjackCtl(jackd gui)

热门文章

  1. 无法解析的外部符号 class boost::system::error_category const __cdecl boost::system::system_category(void)
  2. opencv读取字符串图像
  3. ignite windows无法访问linux ignite集群_Linux常见命令
  4. java微信开发bae_在百度BAE2.0 JAVA环境下搭建属于自己的微信公众平台接口
  5. 你还不知道 Eureka 和 zookeeper 的区别吗?
  6. freemarker中js里面取字符串,换行导致报错的解决办法
  7. Java 中 PO 与 VO 的区别
  8. flask_sqlalchemy连接Mysql报TypeError: create_engine() got an unexpected keyword argument 'encoding'解决办法
  9. jenkins中配置Ant
  10. Python之装饰器入门