首页 > 其他分享 >selenium 处理iframe

selenium 处理iframe

时间:2023-10-18 13:06:45浏览次数:30  
标签:定位 处理 driver selenium 文档 切换 iframe id

iframe是HTML标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架), 作用就是嵌套网页。

以XXX邮箱账号或手机号码输入框为例,我们先按正常定位方法试下能否定位成功。

selenium 处理iframe_css

代码如下:

selenium 处理iframe_css_02

报错信息如下:

Traceback (most recent call last):

  1. ......
  2. raise exception_class(message, screen, stacktrace)

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable

(Session info: chrome=76.0.3809.132)

让我们定位到元素看下到底发生了什么

selenium 处理iframe_selenium_03

我们发现要定位的这个元素在当套的iframe页面里,我们要操作这个元素,需要先切换到iframe页面,才能正常定定位

一、怎么切换到iframe

1.iframe有固定id或name属性

①有id属性,且唯一

driver.switch_to.frame(‘id’)

②有那name性,且唯一

driver.switch_to.frame(‘name’)

selenium 处理iframe_selenium_04

2.如果是动态id或者没有id和name属性,可以xpath或css定位解决

检查发现126邮箱id=”x-URS-iframexxxxxx” 是动态id, 所以,我们不能直接通过id定位

我们用之前学过的css定位,代码如下:

selenium 处理iframe_selenium_05

邮箱或手机号输入框写入了vivi,表示切换iframe,定位成功

这里再补充下xpath其他的三种方法

1.contains(a, b) 如果a中含有字符串b,则返回true,否则返回false

 driver.find_element_by_xpath(“//div[contains(@id, ‘btn-attention’)]”)

2.starts-with(a, b) 如果a是以字符串b开头,返回true,否则返回false

 driver.find_element_by_xpath(“//div[starts-with(@id, ‘btn-attention’)]”)

3.ends-with(a, b) 如果a是以字符串b结尾,返回true,否则返回false

  driver.find_element_by_xpath(“//div[ends-with(@id, ‘btn-attention’)]”)

selenium 处理iframe_css_06

二、从iframe切回到主文档

切换到iframe框架内后,就不能直接定位主文档元素了,比如切换到iframe之后,再定位126邮箱页面的企业邮箱链接。

selenium 处理iframe_css_07

代码如下:

selenium 处理iframe_css_08

结果报错,因为在iframe框架内,没有切换到主文档,不能直接定位到主文档的元素

selenium 处理iframe_selenium_09

处理办法是,需回主文档,进行定位,使用:driver.switch_to.default_content()

selenium 处理iframe_iframe_10

运行之后,切换到iframe框架,然后再切回主文档,定位企业邮箱链接

三、嵌多层套iframe的操作

但时候页面会有多层嵌套iframe,这时候我们需要层层切换iframe

  1. <iframe id="Editor1" src="" frameborder="0" scrolling="no" >
  2. <iframe id="eWebEditor" width="100%" height="100%" scrolling="yes" frameborder="0" src="">
  3. <input type="text" id="TeacherTxt" name="Teacher" size="12" maxlength="12" >
  4. </iframe>
  5. </iframe>

比如这个源码中,有三层iframe嵌套,如果我们想定位到id=”TeWebEditor这一层,代码如下:

selenium 处理iframe_css_11

那么如果我们又想切换到上一层呢,driver.switch_to.parent_frame(),表示从当前的子iframe切换到父iframe,即上级iframe

selenium 处理iframe_selenium_12

总结:遇到iframe时,需要先切换到iframe框架内,再进行定位;多层嵌套的,层层切换iframe;在iframe框架内,定位主文档的元素,需切回到主文档再定位

标签:定位,处理,driver,selenium,文档,切换,iframe,id
From: https://blog.51cto.com/u_16304318/7916327

相关文章

  • 软件测试|解决‘pip‘ 不是内部或外部命令,也不是可运行的程序或批处理文件
    前言很多Python初学者在使用Python时,会遇到环境的问题,比如无法使用pip命令安装第三方库的问题,如下图:当出现错误信息"'pip'不是内部或外部命令,也不是可运行的程序或批处理文件"时,这通常意味着在命令行中输入pip命令时,系统无法找到pip可执行文件的位置。本文将介绍解决这个问......
  • python 处理异步物化视图同时执行导致内存溢出问题
    python处理异步物化视图同时执行导致内存溢出问题一、前提:因为物化视图过多,同时物化视图到时间同时爆发,导致CPU爆满,所以采用datax自带的调度服务来执行python命令二、直接看代码:importpymysqlimportpymssqlimportdatetimeimporttimeclassMaterialized_plan:d......
  • 数据采集IO卡 软件无线电处理平台:136-KC705E增强版基于FMC接口的 Kintex-7 XC7K325T P
    一、板卡概述   本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持各种接口输入,软件支持windows,Linux驱动。   二、功能和技术指标: 板卡功能参数内容主处理器Xi......
  • 使用bito处理数据
    通过数据库找出只有一个还款类型的借据SELECTdue_bill_no,COUNT(due_bill_no)fromacc_repay.receipt_detailrdWHEREproject_no='WS10043190001'ANDdue_bill_noIN(SELECTdue_bill_noFROMacc_cus.cus_user_base)ANDrepay_date='2023-09-12'......
  • 界面组件DevExpress WPF v23.1 - 全面升级文档处理功能
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • 【问题记录】自定义注解处理程序 AbstractProcessor,总是提示版本不匹配
    1  前言最近在看注解处理程序,自己写一个 AbstractProcessor,发现有个莫名的提示:2 解决加上支持的版本即可,唉,折腾人。......
  • 动手动脑 异常处理
    1. 异常处理:Try{//可能发生运行错误的代码;}        catch(异常类型    异常对象引用){//用于处理异常的代码;}        finally{//用于“善后”的代码;}(1)把可能会发生错误的代码放进try语句块中。(2)当程序检测到出现了一个错误时会抛出一个异常对......
  • 异常处理
    当在Java项目中编写代码时,异常处理是一个至关重要的方面。异常是在程序执行过程中可能出现的问题或错误的表示。在Java中,异常处理是一种机制,用于识别、处理和解决这些问题,以确保程序能够正常运行。本文将总结Java项目中常见的异常处理情况,以帮助开发人员更好地理解如何处理异常并......
  • Java项目中常用的异常处理
    1.空指针异常(java.lang.nullpointerexception)发生该情况一般是字符串变量未初始化,数组未初始化,类对象未初始化等。还有一种情况是当该对象为空时你并没有判断是否为空值,这个错误我在之前的web习题上犯过,因此为了避免这种情况,除了检查是否初始化之外,如有必要则要加上判断是否为nul......
  • 资源消耗类应急处理方法oracle
    1.高资源消耗进程应急处理现象描述某个oracleprocessCPU使用率非常高。某个oracleprocessMEM使用率非常高。影响因素暂无解决方法1、使用TOPAS观察哪个进程CPU使用率高,找出相关进程号,通过以下命令定位数据库SID号.Selectsid,sql_id,event,statusfromv$sessionwherepaddri......