许多人在执行脚本的时候会发现,明明本身的元素路径没写错啊!怎么仍是报元素未找到的异常呢?是的,没错,你多是赶上iframe啦!下面将介绍关于iframe的相关操做。web
例子:以163邮箱登陆页面为例框架
若是你直接去定位帐号输入框元素的话是定位不成功的,看到上图标红处的箭头没,原来这个元素在iframe框架里面,要想定位这个元素,必须先切换到这个iframe内才行。咱们先找到iframe这层。以下图:ui
代码:spa
from selenium import webdriver # 导入webdriver
import time
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
time.sleep(1)
iframe = driver.find_element_by_xpath('//div[@id="loginDiv"]/iframe') # 定位iframe
driver.switch_to.frame(iframe) # 切换iframe框架里面
a = driver.find_element_by_xpath('//input[@name="email"]') # 定位输入框元素
a.send_keys('不知不觉多少好时光') # 输入文本
print(a.get_attribute('value')) # 获取输入的value值
driver.quit()
结果:blog
注意:element
1.driver.switch_to.frame()为新方法,而driver.switch_to_frame()为老方法。get
2.其实iframe的切换是默认支持id和name的方法的,也就是说假如iframe元素中有id和name属性(固然,要确保是惟一的,而且不是动态值),你能够直接使用driver.switch_to.frame('id')或者driver.switch_to.frame('name')进行切换,实际状况中会遇到没有id属性和name属性为空的状况,这时候就须要先定位iframe,把iframe当成一个元素来定位就好了input
3.我这里因为iframe的id是动态值,且name为空,因此就把iframe当成一个元素来处理了iframe
当咱们切换了iframe以后,想要回到上一层框架,怎么办呢?webdriver也提供了不错的方法selenium
1.driver.switch_to.parent_frame() # 回到上一层框架
2.driver.switch_to.default_content() # 一次性回到主框架(当切换了多层iframe以后,用这个太方便了)