• 0
  • 0
分享
  • iframe中碰到的问题及解决方法——软件测试圈
  • 饭团🍙 2022-08-12 15:33:07 字数 1744 阅读 3954 收藏 0

前言

今天在做验证码识别项目的时候,一开始就碰到了一个问题,出了各种各样的报错,研究查询了很久终于解决了,在这里归纳分享一下。

碰到的问题及解决方法

在我定位验证码滑块元素的时候一直显示我定位语句错误,多次调试定位方法及路径未果,后来发现这里验证码的部分是用iframe写入的,也就是子Frame,相当于页面的子页面,它的结构与外部网页完全一致,selenium在打开网页后,默认在父级Frame里面操作,所以获取不到子Frame的节点。

1.png

这时需要用switch_to.frame()的方式切换到iframe:

from selenium import webdriver
 
broswer = webdriver.Chrome()
broswer.get('网页链接')
broswer.switch_to.frame('iframe的id或者name值')

但是这里最后报错显示:NoSuchFrameException: Message: tcaptcha_iframe_dy,经过查询对比发现原来这个网页里面有两个iframe

2.png

这时候我以为定位近的一个就行了,结果很不幸,又是一样的报错,我只能再去查找原因。

我用亿图照着画了两个。

iframe有两种嵌套方式 :

1.平行嵌套

3.png

2.层级嵌套

4.png

层级嵌套需要一层一层的进入,最后再一层一层的退出,结果按照方法尝试后还是定位不到iframe,这下就又蒙了,好在只要肯查大概率就能解决问题,结合分析对比后发现,这里的iframe标签属性是动态的,直接定位iframe标签:

from selenium import webdriver
from selenium.webdriver.common.by import By
 
browser = webdriver.Chrome()
browser.get("网页链接")
iframe = driver.find_elements(By.TAG_NAME, "iframe")[0]
broswer.switch_to.frame(iframe)

但是有意思的是我在使用时又有了新的报错:IndexError: list index out of range,这个报错有两种可能,

1、索引超出范围;

2、列表是空的没有元素,我估计也就是根本没找到这个标签,原因是这里其实是平行嵌套,但我理解错了用了层级嵌套的方法,先进入了第一个iframe,没回到Frame,所以查不到第二个标签元素。

最后代码如下

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
 
broswer = webdriver.Chrome()
broswer.get('https://maoyan.com/board/4?offset=100')
time.sleep(2)
iframe = broswer.find_elements(By.TAG_NAME, "iframe")[0]
broswer.switch_to.frame(iframe)
# 也可以这么写
# iframe = broswer.find_elements(By.TAG_NAME, "iframe")
# broswer.switch_to.frame(iframe[0])
element = broswer.find_element(By.XPATH, '//head/meta')
# 获取列表元素信息
print(element.get_attribute('charset'))
# 回到默认的frame
broswer.switch_to.default_content()
elements = broswer.find_element(By.XPATH, '//head/meta')
print(elements.get_attribute('charset'))

测试成功,这里的属性内容在父frame里是大写的,子frame为小写:

5.png


作者:Yy_Rose

原文链接:https://blog.csdn.net/Yy_Rose/article/details/121682665

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 简介在开发前后台分离项目并且通过不同团队来实现的时候,如何将后台设计的 API 准确的传达到前台,是一个非常重要的工作。为了简化这个过程,开源社区做了很多努力,比如 protobuf技术,swagger 的诞生, 以及后面 openapi 的演化,都在试图解决 API 描述和文档的问题。这些标准某些程度上大大简化了 API 文档的撰写和维护,但是API设计往往比较复杂,所以另外还有一些痛点没有解决:若干 API 的调用顺序是有要求的若干 API 的输入和输出是相互关联的若干 API 需要重复调用达到不同的效果举了具体的例子, 某后端小伙伴X和前端小伙伴Y合作开发一款游戏, X 设计好 API ...
            0 0 2343
            分享
          •   为了回馈广大用户对51Testing软件测试网的支持,我们准备了一份价值398元的测试实战课程礼包,只需填写下方链接的行业调查问卷即可免费领取~ 链接:http://vote.51testing.com/   随着公司微服务体系服务越来越多,业务增长越来越迅速,版本迭代越来越快,而且对系统的可用性要求越来越高,传统的手工发布系统的方式已经完全无法满足日常运维的需求了,自动化构建发布的需求越来越强烈,但是自动化发布有个基础的环境,自动化测试,鉴于团队规模不大,测试人员的能力参差不齐,自动化测试我们选择了以开发测试一起搭建的方式,通过轻量级的工具postman进行自动化测试。  测试文件共享 ...
            1 1 1867
            分享
          •   大多数的性能测试工作人员分为以下三个阶段:  1、出了问题看资源,资源占用如果很高,报以窃喜的心态,恩,发现了,原理是资源瓶颈。  2、资源没有出现瓶颈,通过一些技术手段分析,发现是组件的配置文件有问题,例如:server的并发策略有问题,带宽有问题,找到了线路短板性能中的短板,到了这个阶段在我看来是比较牛的测试。  3、以上均无问题的情况下,考虑数据结构和算法我个人接触到的来说,现在大多数的人员都是在仰望第二阶段,摸索第三阶段,希望从代码级发现出性能的问题,进行问题的发现和解决,也符合我们的bug越早发现修复的成本越低的理论。同时,也是一名性能测试工程师高薪的象征。  性能测试调优哪些方...
            0 0 805
            分享
          •   分布式搜索分析,即ES。在之前的文章《掌握2个小工具,轻松解决大数据/数据库测试!》中,笔者介绍了elasticsearch-head和elasticsearch-sql两个工具,前者具有可视化、操作简单、能够完成es基本管理等特点,后者能够直接将一些基本mysql查询语句翻译为es语句进行查询,两者各具特色。  但随着对es的了解不断深入,发现了一款新的比较好用的es工具——cerebro。本文将从对比的角度出发,介绍cerebro的基本功能和用法,以及与elasticsearch-head和elasticsearch-sql对比,各自的优缺点。  cerebro介绍  安装方式  ce...
            0 0 1138
            分享
          • 在压力测试中,经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值,本文来具体介绍一下。随机数函数JMeter 提供了多个用于生成随机数的函数,其中最常用的是__Random函数。该函数可以生成一个指定范围内的随机整数或浮点数。语法如下:${__Random(min,max)}其中,min 和 max 是生成随机数的范围,可以是整数或浮点数。例如,${__Random(1,100)} 会生成一个 1 到 100 之间的随机整数。以下是随机手机号最后 3 位数字的例子:查看传过去的数据:也可以用 BeanShell 来实现。添加前置处理器: BeanShell PrePro...
            0 0 3406
            分享
      • 51testing软件测试圈微信