有时候发现元素定位没问题,但执行过程中会提示“找不到该元素”,对于这样的问题如何解决将是本篇文章的重点。本篇主要就webdriver切换frame的方法*用法进行展开,主要以“网易云音乐排行榜”为例。希望感兴趣的小伙伴可以坚持看下去同时欢迎提出宝贵的意见让我们一起进步!
01:问题引入
(1)需求描述:找出云音乐飙升榜歌曲
(2)通过id将元素定位出来再把里面所有的文本内容打印出来
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://music.163.com/#/discover/toplist?id=19723756')
div=driver.find_element_by_id('song-list-pre-cache')
print(div.text)
driver.quit()
(3)运行代码后报错信息如下:
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element
(4)原因解释:用Selenium打开一个网页时,它查找范围是当前根html。如果html里面有个iframe,则iframe里面这个html元素会忽略不去查找。
02:frame介绍
1)概述:iframe 是一个特殊的html元素, 它在原来的html范围内,嵌套了一个完整的html开辟了一个新的html。
2)实例: iframe结构.png3)常见的frame:iframe和frameset
①iframe:用于在网页内显示网页,通常只能存放一个子html
②frameset:内置好几个子html
03:webdriver切换frame的方法
1)语法:driver.switch_to.frame(frame_reference)。其中frame_reference可以是:
①frame元素的name 属性值或者ID属性值(注意那些会变的id)。比如:contentFrame
②索引值 (从0开始):谁先出现就是第一个
③frame 所对应的WebElement :driver.find_element_by_tag_name("iframe")
④从里面的frame切换回主HTML:driver.switch_to.default_content()
2)注意:建议优先使用第一种方法,如果frame元素没有name /id属,再下面的两种方法。
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.get('https://music.163.com/#/discover/toplist?id=19723756')
#************webdriver切换到frame的方法1************
driver.switch_to.frame("contentFrame")
#************webdriver切换到frame的方法2************
driver.switch_to.frame("g_iframe")
#************webdriver切换到frame的方法3************
driver.switch_to.frame(0)
#************webdriver切换到frame的方法4************
driver.switch_to.frame(driver.find_element_by_tag_name("iframe"))
div=driver.find_element_by_id('song-list-pre-cache')
print(div.text)
driver.quit()
04:嵌套frame如何逐层切换(一层层切换)
(1)如果如果iframe里面又嵌套了一个iframe该怎么办呢?
driver.switch_to.frame('layer2')#先切换到layer2
driver.switch_to.frame('layer3')#再切换到layer3
或者
driver.switch_to.frame('layer2') driver.switch_to.frame('layer3')
(2)返回上一层frame
driver.switch_to.parent_frame()
(3)从里面的frame切换回主HTML
driver.switch_to.default_content()
网友评论