Python Selenium 元素定位正确,但始终报找不到元素错误Message: no such element: Unable to locate element: {“method“:xxx}

报错信息如下:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]/div[3]/div[1]/div/ul[1]/li[2]"}

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嵌套了需要进入到iframe里面

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页面,返回主页面

# 切换tap页面 比如新的页面 就是tap1,tap2 打开了两个页面的意思
num = driver.window_handles
driver.switch_to_window(num[1]) #切换到第二个页面 因为数组默认从0开始第0个就是第一个页面

5、元素还未生成或者页面还没有加载出来就执行了定位操作

比如说进入了一个新的页面去获取某个元素,这个时候页面还在加载过程中,元素还没有生成就去执行了定位操作,自然是找不到要报错的。
解决办法:等待元素生成后再执行定位操作。等待方式有sleep()、implicitly_wait() 、WebDriverWait()三种方法设置延时。

6、属性是动态生成的

还是第四种情况里面我举的例子,因为name值是动态的所以我选择了通过定位元素的方式进入iframe。如果我们直接通过name值来进行定位的,每一次重新进入该页面,它的name值都不一样,自然通过name值去定位就找不到元素了。
解决办法:使用其他的定位方式,可以选择xpath。有些情况下它的值可能是部分动态的,也可以直接通过模糊匹配定位的。




本文借鉴

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
根据引用\[1\]中提供的信息,错"Message: no such element: Unable to locate element"表示无法定位元素。你已经确认了xpath路径没有问题,但仍然遇到了这个错误。根据引用\[2\]的建议,你可以检查是否有iframe嵌入页面,如果有的话,需要使用`switch_to.frame('frame的id')`来切换到iframe中进行操作。另外,根据引用\[3\]的解决办法,你可以检查当前所有页面的句柄,如果联系人修改页面的句柄和当前句柄不是同一个,应将页面句柄切换到当前需要执行操作的页面。你可以使用`driver.window_handles`来获取所有页面的句柄,并使用`driver.switch_to.window(handles\[1\])`来切换到需要操作的页面。这些方法可能有助于解决你遇到的问题。 #### 引用[.reference_title] - *1* [Message: no such element: Unable to locate element:selenium错](https://blog.csdn.net/qq_40300123/article/details/124016128)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Python自动化测试错no such element: Unable to locate element几个解决办法](https://blog.csdn.net/quzhen97/article/details/115346622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令人作呕的溏心蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值