解决js动态刷新,导致dom树重新渲染,旧dom树上的ele过期的问题
一 、 问题
在项目中使用selenium驱动js执行点击事件时,产生如下错误:
selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document
通过字面意思,我们可以知道元素不再附属于页面。官方文档中关于这个异常给了两个常见的原因。
1 |
|
结合项目中遇到的场景,在上一个点击指令执行完毕后,页面局部刷新,此时dom也位于局部区域内。然后执行当前指令,首先会根据计算出的xpath获取dom元素对象,然后模拟人为操作,最后驱动js执行click。
上述场景出现该问题的时机满足,根据xpath获取dom元素是在dom数重新渲染前执行的,这里记作旧dom树,而在一段拟人操作后,可能刷新完毕,dom树重新渲染了,这里记作新dom树,因此此时如果用旧dom树上的元素去新dom树上查找,就会出现上述问题。
二、 解决方案
在驱动js对dom元素进行操作前,重新定位元素对象。这种解决方法可以解决很大一部分场景,但不能做到百分百,因为两条语句不是原子性的,dom树完全是有可能在两条语句中间渲染完毕,这样的话仍会报错,但是概率发生非常非常小,同时不涉及高并发,可以忽略不计。部分代码如下:
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!