在定位元素时,始终都报找不到元素错误。可能的原因有一下几种:
1、元素定位错误
第一种情况就是你的元素定位表达式错误,根本就没有你表达式定位的这个元素,这时候就需要检查一下自己的表达式有没有写错了。当然这种情况出现的可能性不大,所以最有可能的原因还是以下几种
2、定位表达式不唯一
定位表达式不唯一,不能准确的定位到唯一的元素。比如下方通过find_element_by_class_name("top")来定位的话,就会发现有很多个元素的class值都为top。
解决办法:可以尝试换一种定位表达式,如果有id的话可以通过id来定位(一般情况下id都是唯一的),没有id也可以通过XPATH这些方式来定位
3、未切换窗口句柄
当前窗口的句柄还处在上一个窗口中,导致无法定位新窗口的元素。则需要在无法定位到的元素进行定位之前,先进行切换句柄,再进行定位操作。
num=driver.window_handles #获取当前页的所有句柄
driver.switch_to_window(num[1]) #跳到新的标签页;因为当前只有一个主页面和新的标签页,所以num[1]表示新标签
页,num[0]表示主页面
driver.switch_to_window(num[0])#回到主页面的句柄
当有很多个新弹出的页面时,需要定位到最新的标签页时,可以采用循环遍历num的方式,让其一直获取当前的句柄。大致如下:
#循环遍历句柄
for handle in num:
driver.switch_to_window(handle)
4、有内嵌的iframe
-
今天我遇到的情况就是这种情况,一般出现在登录页面中,网页中内嵌了iframe(相当于嵌入了另一个页面),因为webdriver每次只能
在一个页面识别,所以一直报错。
解决办法:先进入相应的iframe页面,再进行定位
如果没有id和name属性的话,可以直接通过传元素实现。我这边用的就是这种方法,因为下面的iframe虽然有name属性,但它的
值是动态的。
-
driver.switch_to.frame(driver.find_element_by_class_name("ifr2")) #进入iframe中
当然可以直接通过id和name及frame的index来定位。
driver.switch_to.frame("name值") #通过name
driver.switch_to.frame("id值") #通过id
driver.switch_to.frame(0) #通过frame的index,第一个是0.这种方式没有尝试过是否生效
如果有嵌套的iframe的话,需要一层一层的从主页面逐层进入了
切进入了iframe页面以后,也要记得切回主页面,否则对主页面执行的元素定位操作也就报错啦。
退出iframe页面,返回主页面
driver.switch_to.default_content() #退出iframe页面,返回主页面
5、元素还未生成或者页面还没有加载出来就执行了定位操作
比如说进入了一个新的页面去获取某个元素,这个时候页面还在加载过程中,元素还没有生成就去执行了定位操作,自然是找不到要报错的。
解决办法:等待元素生成后再执行定位操作。等待方式有sleep()、implicitly_wait() 、WebDriverWait()三种,可根据情况选择最佳的方式。如果对等待方式不了解的,可以参照这篇博客:
https://blog.csdn.net/qq_16555103/article/details/108130558
6、属性是动态生成的
还是第四种情况里面我举的例子,因为name值是动态的所以我选择了通过定位元素的方式进入iframe。如果我们直接通过name值来进行定位的,每一次重新进入该页面,它的name值都不一样,自然通过name值去定位就找不到元素了。
解决办法:使用其他的定位方式,可以选择xpath。有些情况下它的值可能是部分动态的,也可以直接通过模糊匹配定位的。
在定位元素时,始终都报找不到元素错误。可能的原因有一下几种:1、元素定位错误 第一种情况就是你的元素定位表达式错误,根本就没有你表达式定位的这个元素,这时候就需要检查一下自己的表达式有没有写错了。当然这种情况出现的可能性不大,所以最有可能的原因还是以下几种2、定位表达式不唯一定位表达式不唯一,不能准确的定位到唯一的元素。比如下方通过find_element_by_class_name("top")来定位的话,就会发现有很多个元素的class值都为top。解决办法:可以尝试换一种定位表..
selenium
.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:“xpath”,“selector”:“.//div[contains(@class,“c-goods-item__market-price”)]/text()”}(Session info: chrome=99.0.4844.51)
抓取唯品会页面内容,以“小皮鞋”字段为例,代码如图
当然这里说的是css或者XPath都没写错,
定位
准确,也并非使用了不稳定的
定位
语句。
情况一:(StaleElementReferenceException: Message: Element not found in the cache...)
原因:页面被刷新了。
在当前页面
找
不到
这个
元素
了,但是你自己手...
这是一个
selenium
的异常信息,意思是在使用 css 选择器时
找
不到
对应的
元素
。具体原因可能是你使用的 css 选择器不
正确
或者页面上没有这个
元素
。建议你检查你的 css 选择器是否
正确
,或者检查页面是否已经加载完成,是否有这个
元素
。
在用
Python
写一些自动登录脚本的时候,发现老是
定位
元素
失败,仔细检查了xpath没有
错误
,运行报错
selenium
.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div/div/div/div/div[4]/button[1]"},换用css
定位
器等等都还是无法解决
关键代码如
在使用
selenium
+爬虫的时候,经常会遇到一个问题,就是NoSuchElementException,
定位
不到
元素
的问题
一,打开了新页面,一般
selenium
点击新链接跳转打开了一个新页面,那么
定位
不到
元素
就很正常了,这种情况一般我们使用driver.get(url)来代替click(),dirver.get(url)就不会打开信的界面,而是在原来的浏览器上刷新了页面
二,fr...
switch_to.frame()默认可以直接取表单的id或name属性。如果没有可用的id和name属性,可以先
定位
到frame/iframe,再将
定位
对象传给switch_to.frame(对象)方法。
xf = driver.fin
如果
Selenium
无法
定位
到
元素
,可以尝试以下方法来解决问题:
1. 确保页面已完全加载:在尝试
定位
元素
之前,需要等待页面完全加载。可以使用 WebDriver 的 `ExpectedConditions` 类来等待
元素
出现。
2. 检查
元素
的
定位
方式是否
正确
:
元素
定位
有多种方式,如 id、name、classname、css selector、xpath 等。如果使用的
定位
方式不
正确
,则可能会导致
定位
失败。
3. 检查
元素
的
定位
属性是否
正确
:如果使用 id 或 name 等
元素
定位
属性
定位
失败,可能是因为属性值不
正确
。可以使用浏览器的开发者工具来查看
元素
的实际属性值。
4. 尝试等待
元素
出现:在尝试
定位
元素
之前,可以使用 WebDriver 的 `ExpectedConditions` 类来等待
元素
出现。
5. 尝试调整
元素
定位
的超时时间:如果
元素
的加载时间较长,可以尝试调整
元素
定位
的超时时间。可以使用 WebDriver 的 `timeouts` 方法来设置超时时间。
6. 尝试刷新页面:如果页面
元素
加载不完整或有
错误
,则可以尝试刷新页面。
7. 尝试使用其他的
# 在支持的平台上使用 torch.compile 加速模型推理
# TODO peft 与 torch.compile 似乎不匹配, 是否注释
if torch.__version__ >= "2" and sys.platform != "win32":
model = torch.compile(model)
M1 芯片mac搭建环境遇到的问题
lucy_189:
微调alpaca-lora遇到的一些问题
旅行ottffsse:
基础知识_Scikit-learn(一)
自学AI的鲨鱼儿:
flash attention 参数(笔记)
自学AI的鲨鱼儿: