报错信息如下:

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。有些情况下它的值可能是部分动态的,也可以直接通过模糊匹配定位的。




本文借鉴

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:1 个月前 )
c345bb45 5 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐