selenium库的使用(八):切换iframe

网页有一个元素iframe,它的结构与外部网页的结构完全一样,可以理解为页面的子页面。selenium默认在父级iframe里面操作,但如果元素在子级iframe,此时selenium是无法定位到元素的,为了定位该元素,需要切换到子iframe后再定位元素

切入iframe(非嵌套)

通过唯一id或name

1
driver.switch_to_frame('id或name的值')

通过index索引

索引从0开始

1
2
# 传入整数
driver.switch_to_frame(2)

通过WebElement

1
2
3
4
# find_element
driver.switch_to_frame(driver.find_element_by_id('id的值'))
# find_elements
driver.switch_to_frame(driver.find_elements_by_id('id的值')[0])

实例

按下练习网址的腾讯验证码按钮并移动(该网址有时没有验证码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import time
from selenium import webdriver
from selenium.webdriver import ActionChains

driver = webdriver.Chrome()

driver.get('https://ui.ptlogin2.qq.com/cgi-bin/login?appid=614038002&style=9&s_url=https%3A%2F%2Fdld.qzapp.z.qq.com%2Fqpet%2Fcgi-bin%2Fphonepk%3Fcmd%3Dindex%26channel%3D0')


# 输入账号
账号 = driver.find_element_by_id('u')
账号.send_keys('123456')
# 输入密码
密码 = driver.find_element_by_id('p')
密码.send_keys('zxcvbnm22344')
# 登录账号
driver.find_element_by_id('go').click()
time.sleep(2)

# 第一种
driver.switch_to_frame('tcaptcha_iframe')

'''
第二种
driver.switch_to_frame(2)

第三种
driver.switch_to_frame(driver.find_element_by_id('tcaptcha_iframe'))
driver.switch_to_frame(driver.find_elements_by_id('tcaptcha_iframe')[0])
'''


按钮 = driver.find_element_by_id('tcaptcha_drag_thumb')
ActionChains(driver).drag_and_drop_by_offset(按钮, 100, 0).perform()

time.sleep(5)
# 退出驱动并关闭浏览器
driver.quit()

切入嵌套iframe

如果iframe中的有子iframe,切入子iframe需一层一层切入
假如要切入f2:

1
2
3
4
5
<div>
<iframe id="f1">
<iframe id="f2"></iframe>
</iframe>
</div>
1
2
3
4
5
6
# 切入f1
driver.switch_to_frame('f1')
# 切入f2
driver.switch_to_frame('f2')
# 返回f1
driver.switch_to.parent_frame()

退出iframe

1
2
3
4
# 跳出所有iframe,返回主界面
driver.switch_to_default_content()
# 返回上一级iframe,当前是主界面时无效
driver.switch_to.parent_frame()