如何编程检测Looker仪表板完全加载?Selenium适配问题
关于window.awaitPerformanceObservation("rendered")的有效性
这个方法属于Looker未公开的内部API,没有官方文档支撑,其行为会随Looker版本迭代发生变化。你遇到的控制台可用但Selenium中失效的情况,大概率是因为Looker更新后修改了该方法的触发逻辑,或是Selenium执行脚本的上下文与浏览器控制台存在差异(比如页面加载阶段的时机问题)。目前该方法已不具备稳定性,不建议继续依赖。
替代的加载状态检测方式
以下是几种可靠的、基于DOM或事件的检测方案,适配多数Looker版本:
等待加载指示器消失:每个仪表板tile在加载时会显示加载动画,对应DOM元素通常带有
.loading、.looker-loader或类似类名。可通过Selenium等待所有这类元素完全不可见,示例逻辑:from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait # 等待所有tile的加载指示器消失 WebDriverWait(driver, 30).until( EC.invisibility_of_element_located((By.CSS_SELECTOR, ".looker-dashboard-tile .loading")) )注意:具体CSS选择器需根据你使用的Looker版本调整,可通过浏览器开发者工具查看加载中tile的元素类名。
监听自定义加载事件:部分Looker版本会在仪表板或单个tile加载完成时触发自定义事件,比如
dashboard:loaded(全局仪表板加载完成)或tile:loaded(单个tile加载完成)。你可以注入脚本监听这些事件,并标记加载状态:// 注入到页面的脚本 let loadedTiles = 0; const totalTiles = document.querySelectorAll('.looker-dashboard-tile').length; document.addEventListener('tile:loaded', () => { loadedTiles++; if (loadedTiles === totalTiles) { document.body.setAttribute('data-all-tiles-loaded', 'true'); } });然后在Selenium中等待标记状态:
WebDriverWait(driver, 30).until( lambda d: d.execute_script('return document.body.getAttribute("data-all-tiles-loaded") === "true"') )检查tile内容元素存在性:每个tile加载完成后会渲染实际内容(比如图表的
<canvas>、表格的<table>)。可等待所有tile对应的内容元素可见,示例:# 等待所有图表tile的canvas元素可见 tiles = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".looker-dashboard-tile")) ) for tile in tiles: WebDriverWait(driver, 30).until( EC.visibility_of(tile.find_element(By.CSS_SELECTOR, "canvas")) )结合Performance API验证:如果需要更精准的性能检测,可使用浏览器原生
PerformanceObserver监听渲染完成事件,再结合tile的DOM状态确认:// 注入脚本 new PerformanceObserver((list) => { const entries = list.getEntriesByName('dashboard-rendered'); if (entries.length > 0) { document.body.setAttribute('data-dashboard-rendered', 'true'); } }).observe({ entryTypes: ['measure'] });注:此方式需确认Looker是否会生成对应的performance measure条目,部分版本可能支持。
内容的提问来源于stack exchange,提问作者red888

