You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编程检测Looker仪表板完全加载?Selenium适配问题

Looker仪表板加载状态检测方案

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:41:16