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

shinytest2截图显示加载动画,应用空闲却未显示图表

问题背景与环境

环境设置:我有一个包含ggplot的Shiny应用,同时使用shinytest2编写测试脚本。

UI代码片段

shinycssloaders::withSpinner(
  plotOutput(outputId = 'summ_display_hist')
)

服务器代码片段

output$summ_display_hist <- renderPlot({
  ggplot(some_data) +
  geom_histogram(aes(x = indicator), fill = '#005ea2',
                 breaks = seq(0,100, length.out = 11)
  ) +
  ...
})
问题现象

运行测试时,app$expect_values()对应的截图始终显示活跃的加载动画;尽管在执行该方法前已调用app$wait_for_idle(timeout = 1e+06)确保应用处于空闲状态,本应显示底层图表。

期望结果

截图显示图表而非加载动画。

已尝试操作
  • 检查对应JSON文件,其中包含底层图表的所有信息,未提及加载动画;
  • 正常运行应用并执行相同步骤,加载动画会在内容加载完成后消失,且已在renderPlot末尾添加print语句确认图表已加载完成;
  • 手动执行测试代码(在RStudio控制台逐块运行),仍出现相同问题;
  • 尝试用极简UI和服务器代码创建可复现示例,但未能重现问题。
解决思路建议
  1. 针对shinycssloaders的显式等待:wait_for_idle()仅检测Shiny后端的空闲状态,shinycssloaders的加载动画由前端CSS类控制。可尝试等待加载容器的hidden类出现:
    app$wait_for_selector(selector = ".shiny-spinner-container.hidden", timeout = 1e6)
    
  2. 强制延迟或触发DOM更新:测试环境可能存在渲染时序差,可在wait_for_idle()后添加短暂延迟验证:
    Sys.sleep(2)
    
    或在renderPlot末尾添加session$flushReact()确保输出完全推送至前端。
  3. JS条件等待:通过JS判断加载动画是否隐藏,确保截图时机正确:
    app$wait_for_js("document.getElementById('summ_display_hist').closest('.shiny-spinner-container').classList.contains('hidden')")
    
  4. 测试模式下禁用加载动画:通过shiny::isTesting()在测试时跳过加载动画:
    if (shiny::isTesting()) {
      plotOutput(outputId = 'summ_display_hist')
    } else {
      shinycssloaders::withSpinner(plotOutput(outputId = 'summ_display_hist'))
    }
    
  5. 调整无头浏览器参数:无X Server的Chrome无头模式可能存在渲染异常,启动浏览器时添加参数:
    options(shinytest2.browser.args = c("--no-sandbox", "--disable-gpu", "--headless=new"))
    

内容的提问来源于stack exchange,提问作者Alex Silverman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 14:20:10