element click intercepted
2022-10-08 17:22:18
103
{{single.collect_count}}

自动化测试记录--element click intercepted

问题描述:我实现一个循环点击和校验弹出框内容信息是否正确的时候。代码跑起来有时候pass有时候fail,fail的时候会报错:

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: 
Element <span role="presentation" id="button-1082-btnIconEl" class="x-btn-icon-el help_sys_icon" unselectable="on" style="">
...</span> is not clickable at point (1347, 68). Other element would receive the click: <div role="presentation" class="x-mask x-mask-fixed" style="top: 0px; left: 0px; z-index: 90001;" id="ext-gen4119"></div>

自我探索后对现象的解释:

说是一个元素被点击的时候被另一个元素打断了,然后我发现是因为点击这个元素的时候页面是未加载完全的,有遮罩,所以这个元素无法被点击。所以当直接使用diver.find_element().click()方法去点击一个元素,这个时候如果这个dom元素已经存在就不会以未找到元素的形式来报错,而是有可能会出现我遇到的这种情况(点击的这个元素的上一个元素存在页面加载时就会大概率出现)。

解决之路:

1.我先是在每一个点击操作后面加time.sleep(3),后来还是不稳定抛出异常,然后我增加睡眠时间5,还是会抛出异常。这时候运行速度大大降低了,但是好像还是不稳定的抛出上面的异常。

2.中间我还没理解那个报错的原因,我一直以为是没找到元素,所以弄了一个循环找,但是根据控制显示元素是找到了,可是还是被打断了,所以我就理解了dom里面能找到元素,不等同页面上显示出来了

3.最后解决问题的方法是:我使用了显示等待。在尝试用了好几种显示等待的方法后,如下,我用上了第三和四种实现了我的功能,第一种和第二种调用click方法没有生效但是也没有报错,不知道什么原因。

  • WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,'su')))'''判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大于0'''
  • WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//*[@id='u1']/a[8]"))).click()'''判断某个元素中是否可见并且是enable的,代表可点击'''
  • WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(by=By.ID,value='kw')))'''判断元素是否可见,如果可见就返回这个元素'''
  • WebDriverWait(driver,10).until(EC.visibility_of_any_elements_located((By.CSS_SELECTOR,'.mnav')))'''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''

 

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}