网页有一个元素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
| driver.switch_to_frame(driver.find_element_by_id('id的值'))
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
| driver.switch_to_frame('f1')
driver.switch_to_frame('f2')
driver.switch_to.parent_frame()
|
退出iframe
1 2 3 4
| driver.switch_to_default_content()
driver.switch_to.parent_frame()
|