我们在使用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---基于python的更多相关文章

  1. selenium元素定位不到之iframe

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

  2. selenium元素定位陷阱规避

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

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

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

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

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

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

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

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

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

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

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

  8. 史上最全!Selenium元素定位的30种方式

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

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

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

随机推荐

  1. Hibernate基础入门

    Hibernate是一个开放源代码的对象关系映射框架,它将POJO与数据库表之间建立映射关系.是全自动的ORM框架,可以自动生成SQL语句并自动执行.它对JDBC进行了非常轻量级的封装,使程序员可以随 ...

  2. HDFS原理

    1 . NameNode 概述 a. NameNode 是 HDFS 的核心. b. NameNode 也称为 Master. c. NameNode 仅存储 HDFS 的元数据:文件系统中所有文件的 ...

  3. centos7安装mysql5.7.18笔记

    重装了一下系统,装了centos7,但是centos7下默认没有安装mysql,有MariaDB数据库,网上的解释是: “MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用 ...

  4. gem install tiny_tds失败

    解决: brew install freetds gem install tiny_tds -v '2.1.0'

  5. burp实时获取token

    在一些web网站里 会加入token来限制用户的一些操作 如果用户的请求里面没有这个token  那么我们的一些操作就会很麻烦 现在 我来演示一下burp如何自动更新token 首先 需要dvwa  ...

  6. 指针小白:修改*p与p会对相应的地址的变量产生什么影响?各个变量指针的长度为多少?

    这两天敲代码碰到了一个这样的问题 代码如下: #include <stdio.h> #include <stdlib.h> int main() { ; int* p=& ...

  7. Spark入门(Python版)

    Hadoop是对大数据集进行分布式计算的标准工具,这也是为什么当你穿过机场时能看到”大数据(Big Data)”广告的原因.它已经成为大数据的操作系统,提供了包括工具和技巧在内的丰富生态系统,允许使用 ...

  8. (转)Ruby On Rails 推荐 Gem 列表

    作者:尘缘,QQ:130775,来源:http://www.4wei.cn/archives/1002157 PHP的包管理Composer还在刚刚兴起的阶段,Ruby社区已经有很多成熟的Gem了,R ...

  9. 全新Ubuntu-13.04安装配置redmine

    1. apt-get install  vim  apache2 libapache2-mod-passenger ruby rubygems libruby ruby-dev  libmagickc ...

  10. 【原创】linux命令-Axel命令 - linux多线程下载 - 费元星 - 未来星开发团队

    [费元星版权Q:9715234] Axel 是 Linux 下一个不错的HTTP/FTP高速下载工具.支持多线程下载.断点续[费元星版权Q:9715234]传,且可以从多个地址或者从一个地址的多个连接 ...