我们在使用selenium的18中定位方式的时候,有时会遇到定位不上的问题,今天我们就来说说导致定位不上的其中一个原因---iframe

问题描述:通过firebug查询到相应元素的id或name等,但在定位此元素的时候就是报错,提示:

selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element

问题原因:元素定位不到

问题分析:通过firebug可以看到,但就是定位不到,这时候很有可能是iframe搞得鬼了

########################################################################

那在解决问题之前,首先让我们了解一下iframe

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

<iframe> 标签规定一个内联框架。

一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。

从以上描述就很好理解了,就比如我们在一个word文档中插入一个txt的文档,那我们如果直接访问txt里的内容,当然会访问不到

那咋办捏?

#########################################################################

frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作。

1.  切换到frame(也就是前面比喻中的txt)

  switch_to.frame(name_or_id_or_frame_element)

  (1.切换到iframe,参数是他的id  ,2. 如果没有id,name是唯一的,参数是name 。  3.iframe既没有id,也没有name,把iframe当成元素对象,先定位iframe这个元素,然后切换

  4.还可以通过iframe的index进行定位,此方法用firepath中查看)

  举例1:

  # coding:utf-8
from selenium import webdriver
driver=webdriver.Firefox()
driver.get("http://mail.126.com")
driver.implicitly_wait(10)
driver.switch_to.frame("x-URS-iframe") #切换frame
driver.find_element_by_name("email").send_keys("abcdef")   #使用name定位
driver.find_element_by_id("password").send_keys("123456")   #使用id定位
driver.find_element_by_id("dologin").click() 

举例2:针对iframe没有id和name情况 

#本例使用find_element方式

举例3:通过页面上iframe的索引定位 

#使用index索引方式定位

定位箭头指向的这个就是第4个,索引从0开始,所以是3, driver.switch_to.frame(3)

      

2.  切换回主文档

  switch_to.default_content()

  举例(接上面的例子):driver.switch_to.default_content() #返回到主文档

3.  对于多级iframe(word里面插入excel,excel里面插入txt)

  3.1  进入多级iframe

    举例:

     #进入excel中

      driver.switch_to_frame("excel")

     #进入txt中

      driver.switch_to_frame("excel") #首先进入excel

      driver.switch_to_frame("txt")  #然后进入txt

    这个例子表面,frame需要一级一级逐级进入

  3.2  返回到主文档

    同第二节中的一样使用switch_to.default_content()

  3.3  返回上一级文档(即从txt返回到excel)

    举例:driver.switch_to.parent_frame()   #这个地方很好理解,parent翻译为(父亲或母亲),也就是返回父节点

  

  

       

  

selenium元素定位不到之iframe的更多相关文章

  1. selenium元素定位陷阱规避

    为什么selenium可以在各个浏览器上运行?因为selenium在与各个浏览器驱动执行前,会先把脚本转化成webdriver, webdriver wire协议(一种json格式的协议),这样就与脚 ...

  2. 自动化测试基础篇--Selenium元素定位

    摘自https://www.cnblogs.com/sanzangTst/p/7457111.html 一.Selenium元素定位的重要性: Web自动化测试的操作:获取UI页面的元素,对元素进行操 ...

  3. Selenium3 + Python3自动化测试系列二——selenium元素定位

    一.selenium元素定位 Selenium对网页的控制是基于各种前端元素的,在使用过程中,对于元素的定位是基础,只有准去抓取到对应元素 才能进行后续的自动化控制,我在这里将对selenium8种元 ...

  4. selenium元素定位之css选择器

    在selenium元素定位时会用到css选择器选取元素,虽说xpath在定位元素时能解决大部分问题,但使用css选择器选取元素也是一种不错的选择. css相较与xpath选择元素优点如下: 表达式更加 ...

  5. Java + selenium 元素定位(6)之iframe切换(即对富文本框的操作)

    在元素定位中,对富文本框的元素定位是特别的,当我们使用普通的元素定位方法对富文本框进行操作时,我们会发现不管我们之前介绍的八种方法中的任何方法,我们都不能成功定位到富文本框,并对其进行操作.那是因为富 ...

  6. python+selenium 元素定位--iframe

    1. 一般webdriver要操作页面元素需要在Top Window的状态下,如下: 2.当浏览器显示iframe时,用正常的元素定位是没有效果的,需要将页面装换到iframe下再对页面元素进行操作 ...

  7. selenium元素定位不到之iframe---基于python

    我们在使用selenium的18中定位方式的时候,有时会遇到定位不上的问题,今天我们就来说说导致定位不上的其中一个原因---iframe 问题描述:通过firebug查询到相应元素的id或name等, ...

  8. java+selenium元素定位和元素操作

    1.元素定位 ID定位元素: findElement(By.id(“”)); 通过元素的名称定位元素: findElement(By.name(“”)); 通过元素的html中的位置定位元素: fin ...

  9. python+selenium元素定位——8种方法

    定位元素,selenium提供了8中元素定位方法: (1)find_element_by_id() :html规定,id在html中必须是唯一的,有点类似于身份证号 (2)find_element_b ...

随机推荐

  1. ASP.NET MVC 开发微信支付H5(外置浏览器支付)

    H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付. 主要用于触屏版的手机浏览器请求微信支付的场景.可以方便的从外部浏览器 ...

  2. Git时光机穿梭之管理修改

    现在,假定你已经完全掌握了暂存区的概念.下面,我们要讨论的就是,为什么Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件. 你会问,什么是修改?比如你新增了一行,这就是一个修改 ...

  3. 搭建hadoop、hdfs环境--ubuntu

    最近在学习hadoop相关知识,就在本机上安装了hadoop,遇到了一些坑,也学到了不少.仅此记录我的安装过程,及可能遇到的问题.供参考.交流沟通见页末. 软件准备 >  虚拟机(VMware) ...

  4. JavaScript中的EcMAScript学习笔记

    一.Javascript概述(知道)    a.一种基于对象和事件驱动的脚本语言    b.作用: 给页面添加动态效果    c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAs ...

  5. [算法题] Two Sum

    题目内容 题目来源:LeetCode Given an array of integers, return indices of the two numbers such that they add ...

  6. gulp前端自动化工作流

    gulp前端自动化工作流 为什么要有自动化的流程? 在我们的开发过程中有大量的重复操作 DRY Don't repeat yourself 开发人员的精力应放在哪? 创造,新的一切前端开发的编译操作 ...

  7. 一步一步学多线程-Timer

    在执行定时任务的时候可以用Timer来实现,现在小编对学到的进行一次总结,先来看一个demo 1 public class TimerTest { 2 3 public static void mai ...

  8. 【社交系统研发日记五】ThinkSNS+如何计算字符显示长度?

    今天我们来聊一下可能很多人都会头疼的东西:显示长度. 需求是这样的,在字符的显示上,两个英文单词才占一个中文或者其他语言的显示长度.如下: 上面排的是两个英文字母,一个汉字,一个Emoji.你会发现, ...

  9. 【MySQL源码】源码安装和启动mysql

    --[MySQL源码]源码安装和启动mysql --------------------------------------2014/08/19 本机环境:ubuntu12.04,fedora-17 ...

  10. Swoole笔记(四)

    Process Process是swoole内置的进程管理模块,用来替代PHP的pcntl扩展. swoole_process支持重定向标准输入和输出,在子进程内echo不会打印屏幕,而是写入管道,读 ...