Selenium/Python:调用EC.invisibility后Loader加载器仍未消失问题求助
问题排查与解决方法
相关参考代码
触发点击的业务代码
def create_ep(self): a = WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='btn btn-primary mr-1']"))) self.driver.execute_script("arguments[0].click();", a)
加载层对应的DOM结构
<!-- #1 带透明度的遮罩层 --> <div class="position-absolute" style="inset: 0px; opacity: 0.7; background-color: rgb(255, 255, 255); backdrop-filter: blur(2px);"></div> <!-- #2 小型加载动画 --> <div class="position-absolute" style="top: 50%; left: 50%; transform: translateX(-50%) translateY(-50%);"><span aria-hidden="true" class="spinner-border text-primary"><!----></span></div>
排查步骤
- 先手动复现操作流程:手动在第二页点击对应按钮跳转到第三页,确认加载器是否会正常消失。如果手动操作也出现加载器卡住的情况,属于前端本身的逻辑bug,直接用JS移除加载层即可。
- 如果手动操作正常,优先检查点击触发逻辑:当前用
execute_script执行点击会跳过浏览器原生的元素交互校验,也可能无法完整触发按钮绑定的事件链(比如hover、mousedown、mouseup等前置事件),导致前端没有注册加载器关闭的回调逻辑。 - 检查等待逻辑的定位是否准确:加载层包含遮罩和动画两个独立元素,如果只监听其中一个元素的消失状态,会出现等待超时的问题,需要两个元素都确认不可见才算加载完成。
- 检查页面请求状态:打开浏览器控制台的网络面板,点击按钮后查看是否有长时间pending的请求,部分前端的加载器逻辑会等待所有接口请求完成后才关闭,若有无效请求卡住可以主动取消或者跳过等待。
解决方法
方案1:修复点击触发逻辑
将JS点击替换为原生点击,点击前先滚动到元素可见位置,保证完整触发前端事件链:
def create_ep(self): a = WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='btn btn-primary mr-1']"))) # 滚动到元素可视区域中心,避免被其他元素遮挡 self.driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", a) # 使用原生点击替代JS点击 a.click() # 等待两个加载层都消失 WebDriverWait(self.driver, 15).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, 'div[style*="backdrop-filter: blur"]'))) WebDriverWait(self.driver, 15).until(EC.invisibility_of_element_located((By.CSS_SELECTOR, 'span.spinner-border')))
方案2:直接移除加载层(适合前端本身存在bug的场景)
如果确认是前端加载逻辑卡住,不需要纠结触发流程,可以直接执行JS删除两个加载层,不影响后续操作:
def create_ep(self): a = WebDriverWait(self.driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='btn btn-primary mr-1']"))) self.driver.execute_script("arguments[0].click();", a) # 等待加载层渲染完成 WebDriverWait(self.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.spinner-border'))) # 执行JS移除两个加载元素 self.driver.execute_script(""" document.querySelector('div[style*="opacity: 0.7"][style*="backdrop-filter: blur"]')?.remove(); document.querySelector('span.spinner-border')?.parentElement.remove(); """)
内容的提问来源于stack exchange,提问作者Theoldadam
相关产品推荐
相关产品推荐

