selenium iframe元素定位

不知道大家有没有这样一个经历,就是在定位元素时,怎么都定位不到,但是id等标签并没有错,真是让人摸不着头脑。其实,这就是iframe在作怪咯!

本篇详细介绍 iframe 相关的切换
http://mail.163.com/ 的登录页面为案例,详细介绍 switch_to_frame 使用方法。

一、frame 和 和 iframe 区别

frame 与 iframe 两者可以实现的功能基本相同,不过 iframe 比 frame 具
有更多的灵活性。 frame 是整个页面的框架,iframe 是内嵌的网页元素,也可以说是内嵌的框架。

iframe 标记又叫浮动帧标记,可以用它将一个 HTML 文档嵌入在一个 HTML中显示。它和 Frame 标记的最大区别是在网页中嵌入 的<iframe></iframe>所包含的内容与整个页面是一个整体,而<frame>< /frame>所包含的内容是一个独立的个体,是可以独立显示的。另外,应用iframe 还可以在同一个页面中多次显示同一内容,而不必重复这段内容的代码。

二、登录界面

1.打开 http://mail.163.com/

2.用 firebug 定位登录框

3.鼠标停留在左下角(定位到 iframe 位置)时,右上角整个登录框显示
灰色,说明 iframe 区域是整个登录框区域

4.左下角箭头位置显示 iframe 属性

<iframe id="x-URS-iframe" frameborder="0" name=""

三、切换 iframe

1.由于登录按钮是在 iframe 上,所以第一步需要把定位器切换到 iframe上。

2.用 switch_to_frame 方法切换,此处有 id 属性,可以直接用 id 定位切换。

#coding:utf-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get('http://mail.163.com/')
driver.implicitly_wait(10)
#切换iframe
driver.switch_to_frame('x-URS-iframe')
driver.find_element_by_name('email').send_keys('123')
driver.find_element_by_name('password').send_keys('456')

四、如果 iframe 没有 id 怎么办?

1.这里 iframe 的切换是默认支持 id 和 name 的方法的,当然实际情况中
会遇到没有 id 属性和 name 属性为空的情况,这时候就需要先定位 iframe
2.定位元素还是之前的八种方法同样适用,这里我可以通过 tag 先定位到,
也能达到同样效果

#coding:utf-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get('http://mail.163.com/')
driver.implicitly_wait(10)
#切换iframe
iframe = driver.find_elements_by_tag_name('iframe')
driver.switch_to_frame(iframe)
#driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name('email').send_keys('123')
driver.find_element_by_name('password').send_keys('456')

五、释放 iframe

1.当 iframe 上的操作完后,想重新回到主页面上操作元素,这时候,就
可以用 switch_to_default_content()方法返回到主页面

#coding:utf-8
from selenium import webdriver
import time

driver = webdriver.Firefox()
driver.get('http://mail.163.com/')
driver.implicitly_wait(10)
#切换iframe
# iframe = driver.find_elements_by_tag_name('iframe')
# driver.switch_to_frame(iframe)
driver.switch_to_frame('x-URS-iframe')
driver.find_element_by_name('email').send_keys('123')
driver.find_element_by_name('password').send_keys('456')
#释放iframe,回到主页面上
driver.switch_to_default_content()

六、如何判断元素是否在 iframe 上?

1.定位到元素后,切换到 firepath 界面;

2.看 firebug 工具左上角,如果显示 Top Window 说明没有 iframe;

3.如果显示 iframe#xxx 这样的,说明在 iframe 上,#后面就是它的 id;

这里写图片描述

七、如何解决 switch_to_frame 上的横线呢?

大家看一下我写的代码

这里写图片描述

发现这两个函数上面都被画了横线,这是为什么呢?

1.先找到官放的文档介绍

这里写图片描述

2.官方已经不推荐上面的写法了,用这个写法就好了
driver.switch_to.frame()

这里写图片描述

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值