C# Selenium实现等待页面body类从loading变为空的方法
等待Body移除Loading类的实现方案
没问题,这事儿我熟!要实现等待body的loading类从存在变为空的逻辑,咱们有两种靠谱的方式,按需选择就行:
方法一:轮询检查(简单直接)
这种方式适合场景不复杂的情况,用setInterval定期检查body的class状态,直到目标状态出现:
function waitForLoadingEnd() { // 设置轮询定时器,每隔100ms检查一次 const checkInterval = setInterval(() => { const body = document.body; // 检查body是否没有loading类 if (!body.classList.contains('loading')) { clearInterval(checkInterval); // 清除定时器 // 这里写loading结束后要执行的逻辑 console.log('加载完成,body的loading类已移除!'); // 比如初始化玩家物品页面的逻辑 initPlayerItemsPage(); } }, 100); // 可选:设置超时保护,防止无限等待 setTimeout(() => { clearInterval(checkInterval); console.warn('等待超时,强制结束监听'); }, 10000); // 10秒超时 } // 调用函数开始等待 waitForLoadingEnd();
方法二:MutationObserver监听DOM变化(更优雅高效)
如果想要更高效的实现,推荐用MutationObserver,它能直接监听body的class属性变化,不用定期轮询,性能更好:
function waitForLoadingEnd() { const body = document.body; // 先检查初始状态,如果已经没有loading类,直接执行逻辑 if (!body.classList.contains('loading')) { console.log('初始状态已加载完成'); initPlayerItemsPage(); return; } // 创建观察者实例,监听属性变化 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { // 只关注class属性的变化 if (mutation.attributeName === 'class') { const currentClass = body.getAttribute('class'); // 检查是否移除了loading类 if (!currentClass || !currentClass.includes('loading')) { observer.disconnect(); // 断开观察者 console.log('加载完成,body的loading类已移除!'); initPlayerItemsPage(); } } }); }); // 配置观察选项:监听属性变化,只监听class属性 observer.observe(body, { attributes: true, attributeFilter: ['class'] }); // 可选:超时保护 setTimeout(() => { observer.disconnect(); console.warn('等待超时,强制结束监听'); }, 10000); } // 调用函数开始等待 waitForLoadingEnd();
注意事项
- 别忘了处理初始状态:如果页面启动时body已经没有
loading类,要直接执行后续逻辑,避免无意义的等待。 - 加上超时保护很重要,防止因为某些异常情况导致代码一直处于等待状态。
initPlayerItemsPage()是我假设的后续逻辑函数,你可以替换成自己的玩家物品加载初始化代码。
内容的提问来源于stack exchange,提问作者refactorcoding
相关产品推荐
相关产品推荐

