首页 > 其他分享 >iframe框 的正常处理和非正常处理

iframe框 的正常处理和非正常处理

时间:2023-09-25 17:15:50浏览次数:21  
标签:name 处理 driver id 非正常 iframe element find

我们都知道iframe 是HTML里面的一个用于网页嵌套网页的框架,一个网页可以嵌套到另一个网页中,可以嵌套多层,当然也可以平衡嵌套,常见的一般有两种:

  • 嵌套 框架 (大框架下包含小框架)

  • 平行 嵌套 (平衡摆放,平级关系)

    一般定位iframe的方法
    1、iframe有具体的name 和 id 属性(id和name的属性值如果是动态变化的数字 就不能使用)

    .switch_to_iframe("id or name 的属性值")

    2、iframe标签本身没有id 和 name 属性

    方式1:定位iframe元素
    iframe = driver.find_elements_by_tag_name("iframe")[0] # 根据需要填入index,这里定位HTML里的第一个
    driver.switch_to.frame(iframe)
    方式2:用Xpath或css定位到iframe的父类
    name = driver.find_element_by_xpath('//*[@id="panel"]')
    driver.switch_to_iframe(name)
    1
    3、框架有进入就会有退出 — 针对平行iframe标签

    .switch_to.default_content()

到这里你会发现,代码跑不通:

下面说说,定位163邮箱遇到的一些坑

坑一:
  • 输入代码:用固定id的方法定位
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(50)        # 我怕不够时间加载,所以时间加长了(排除时间太短产生timeout的错误)
# driver.switch_to.default_content()
# driver.switch_to.frame('x-URS-iframe1565846475124.4539')   # 切换到框架(这里用了ID属性)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content()  # 退出框架
  • 报错:定位不到对应的iframe
  • in frame raise NoSuchFrameException(frame_reference)
    selenium.common.exceptions.NoSuchFrameException: Message: x-URS-iframe

  经过分析得出: iframe 的id值是不停变化的

 发现这里的iframe标签的id会变动,所以不能用id属性直接定位,需要更改定位方式

坑二:
  • 输入代码:用xpath定位iframe的父类
# import time
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get("https://email.163.com")
# time.sleep(2)
# name = driver.find_element_by_xpath('//*[@id="panel"]')     # iframe 的父类
# driver.switch_to.frame(name)
# driver.find_element_by_name("email").send_keys("bingo")
# time.sleep(1)
# driver.find_element_by_name("password").send_keys("123456")
# time.sleep(1)
# driver.find_element_by_id("dologin").click()
# driver.switch_to.default_content()  # 退出框架
  • 报错:定位到的元素不是框架
  • in check_response raise exception_class(message, screen, stacktrace)
    selenium.common.exceptions.NoSuchFrameException: Message: no such frame: element is not a frame
  • 分析:既让定位到的是元素,那我就直接定位iframe标签了
    • 解决:
      输入代码
    • # import time
      # from selenium import webdriver
      # driver = webdriver.Chrome()
      # driver.get("https://email.163.com")
      # time.sleep(2)
      # iframe = driver.find_elements_by_tag_name("iframe")[0]
      # driver.switch_to.frame(iframe)
      # driver.find_element_by_name("email").send_keys("bingo")
      # time.sleep(1)
      # driver.find_element_by_name("password").send_keys("123456")
      # time.sleep(1)
      # driver.find_element_by_id("dologin").click()
      # driver.switch_to.default_content()  # 退出框架

本文遇见的情况就是: 元素属性值不是唯一的,每次的值都会随机发生变化

    解决办法: 通过定位框架的层级或者标签来定位,不是定位某个固定元素值


原文链接:https://blog.csdn.net/weixin_44342166/article/details/99635635

 

标签:name,处理,driver,id,非正常,iframe,element,find
From: https://www.cnblogs.com/xujunhui/p/17728331.html

相关文章

  • 关于处理数据分页查询用最后一个id还是用offset
    批量处理数据经常用到分页查询,两个形式第一种1select*fromtablewherename='name'orderbyiddesc offset0limit102select*fromtablewherename='name'andid<lastIdorderbyiddesclimit10当需要id或者时间倒序查询时候。并且没有数据的截止点......
  • #define 定义的明示变量就是在预处理阶段用标识符后面的值替换标识符,因此不会占据内存
    1.常考:预处理阶段只进行文本替换,不进行运算对于最后一条,预处理指令定义的标识符都不会占据内存。预处理指令也称预编译指令,即在编译之前进行一些处理,而预处理做的其实就是文本替换,这个过程也叫做宏展开,即用宏定义后面的替换体将程序中出现宏的地方替换掉。例如,#define定义的明示......
  • MySQL——处理JSON类型的数据
    MySQL对JSON类型数据的处理参考视频:快速学习MySQL8JSON注意,本文的键名也可以叫key,键值也可以叫value,意思是一样的1.字符串查询:JSON_EXTRACT假设我们有一个表叫做testDemo,其中有一个字段叫做details,类型为JSON,他的数据结构如下,我们就以这个结构为例(这是个例子,假设有很多行......
  • 【红外图像】利用红外图像处理技术对不同制冷剂充装的制冷系统进行性能评估(Matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 字符串处理函数
    1,字符串串联运算符2,SUBSTRING提取子串3,LEFT和RIGHT4,LEN和DATALENGTH5,CHARINDEX函数6,PATINDEX函数7,REPLACE替换8,REPLICATE复制字符串9,STUFF函数10,UPPER和LOWER函数11,RTRIM和LTRIM函数 字符串串联运算符由于业务需要,有的时候我们需要将两个字段(列)组合起来,中间加上分隔符,然后输出。......
  • 文档图像处理:大模型的突破与新探索
    前言随着数字化时代的到来,文档图像处理技术在各行各业扮演着越来越重要的角色。在2023第十二届中国智能产业高峰论坛(CIIS 2023)的专题论坛上,合合信息智能技术平台事业部副总经理、高级工程师丁凯博士分享了当前文档图像处理面临的困难,并讨论大模型在该领域的突破和新探索。虚竹哥把......
  • 每日一库:使用Viper处理Go应用程序的配置
    在开发Go应用程序时,处理配置是一个常见的需求。配置可能来自于配置文件、环境变量、命令行参数等等。Viper是一个强大的库,可以帮助我们处理这些配置。什么是Viper?Viper是一个应用程序配置解决方案,用于Go应用程序。它支持JSON、TOML、YAML、HCL、envfile和Javaproperties配置文......
  • linux Screen 多任务处理
    一、背景系统管理员经常需要SSH或者telent远程登录到Linux服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开......
  • 104_typecho插入B站(iframe)视频填坑
    这是一篇原发布于2020-01-1114:07:00得益小站的文章,备份在此处。前言B站默认给的插入代码不好用,这里收集了几个解决方案。B站链接参数来源:https://blog.csdn.net/xinshou_caizhu/article/details/94028606https://player.bilibili.com/player.html?aid=83006718&cid=1420034......
  • Vue3 事件处理实战:让你的代码更有魅力
    监听事件我们可以使用 v-on 指令(通常缩写为 @ 符号)来监听DOM事件,并在触发事件时执行一些JavaScript。用法为 v-on:click="methodName" 或使用快捷方式 @click="methodName"例如:<divid="basic-event"><button@click="counter+=1">Add1</button>&......