问题描述:我实现一个循环点击和校验弹出框内容信息是否正确的时候。代码跑起来有时候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'))) '''判断是否至少有一个元素在页面中可见,如果定位到就返回列表'''