Selenium 元素定位正确,但始终报找不到元素错误

在定位元素时,始终都报找不到元素错误。可能的原因有一下几种:

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

  1. 今天我遇到的情况就是这种情况,一般出现在登录页面中,网页中内嵌了iframe(相当于嵌入了另一个页面),因为webdriver每次只能
        在一个页面识别,所以一直报错。
    
    解决办法:先进入相应的iframe页面,再进行定位
    如果没有id和name属性的话,可以直接通过传元素实现。我这边用的就是这种方法,因为下面的iframe虽然有name属性,但它的
        值是动态的。
  2.  
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。有些情况下它的值可能是部分动态的,也可以直接通过模糊匹配定位的。

 

 

Reference

          Selenium 元素定位正确,但始终报找不到元素错误

 

  1.  

你可能感兴趣的:(selenium,python)