selenium定位:出现Message: element not interactable 元素不可交互的问题解决方案

元素不可交互原因有多种,不同的原因有不同的解决方案。

原因1:点击速度过快,页面没有加载出来就需要点击页面上的元素

设置等待时间即可。

import time
time.sleep(2)

 

原因2:需要定位的元素在页面中被隐藏了

比如:定位百度账号退出按钮,由于退出按钮被隐藏,只有当鼠标移动到用户账号时,才显示出退出按钮

 

 

 解决方法:添加鼠标悬浮定位功能

代码如下:

# 鼠标悬停
def hover(self,by,value):
    element = self.findElement(by,value)
    ActionChains(self.driver).move_to_element(element).perform()

# 通过不同的方式查找界面元素
def findElement(self,by,value):
    if(by == "id"):
        element = self.driver.find_element_by_id(value)
        return element
    elif(by == "name"):
        element = self.driver.find_element_by_name(value)
        return element
    elif(by == "xpath"):
        element = self.driver.find_element_by_xpath(value)
        return element
    elif(by == "classname"):
        element = self.driver.find_element_by_class_name(value)
        return element
    elif(by == "css"):
        element = self.driver.find_element_by_css_selector(value)
        return element
    elif(by == "link_text"):
        element = self.driver.find_element_by_link_text(value)
        return element
    else:
        print("无对应方法,请检查")
        return None

 # 检查是否存在用户退出按钮,存在,登录成功,否则登录失败
self.driver.hover(by='xpath',value='//*[@id="s_username_top"]/span')
close = self.driver.findElement(by='xpath',value='//[@id="s_user_name_menu"]/div/a[4]')
print(close)
if close != None:
    self.assertEqual(1,1)
else:
    self.assertEqual(1,0)
    time.sleep(3)

 

原因3:需要定位的元素的位置在变化

比如:某项目登录功能密码输入框的id、xpath在变

 

打开显示如下图

 

密码输入显示如下图

 

 代码首先先点击密码输入框,再执行输入操作

driver.find_element_by_id("cPwdMsg_0").click()
driver.find_element_by_id("passwd").send_keys("123456")

 

posted @ 2020-04-23 17:03  弦歌雅意  阅读(10988)  评论(0编辑  收藏  举报