selenium自动化之切换iframe

时间:2021-05-09 08:47:32

    许多人在执行脚本的时候会发现,明明自己的元素路径没写错啊!怎么还是报元素未找到的异常呢?是的,没错,你可能是遇上iframe啦!下面将介绍关于iframe的相关操作

    例子:以163邮箱登录页面为例

 

selenium自动化之切换iframe

 

 

 

如果你直接去定位账号输入框元素的话是定位不成功的,看到上图标红处的箭头没,原来这个元素在iframe框架里面,要想定位这个元素,必须先切换到这个iframe内才行。我们先找到iframe这层。如下图:

selenium自动化之切换iframe

 

 代码:

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()

结果:

selenium自动化之切换iframe

 

注意:

1.driver.switch_to.frame()为新方法,而driver.switch_to_frame()为老方法。

2.其实iframe的切换是默认支持id和name的方法的,也就是说假如iframe元素中有id和name属性(当然,要确保是唯一的,并且不是动态值),你可以直接使用driver.switch_to.frame('id')或者driver.switch_to.frame('name')进行切换,实际情况中会遇到没有id属性和name属性为空的情况,这时候就需要先定位iframe,把iframe当成一个元素来定位就行了

3.我这里由于iframe的id是动态值,且name为空,所以就把iframe当成一个元素来处理了

 

当我们切换了iframe之后,想要回到上一层框架,怎么办呢?webdriver也提供了不错的方法

1.driver.switch_to.parent_frame()     # 回到上一层框架

2.driver.switch_to.default_content()  # 一次性回到主框架(当切换了多层iframe之后,用这个太方便了)