我们在使用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翻译为(父亲或母亲),也就是返回父节点