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和服务器代码创建可复现示例,但未能重现问题。
解决思路建议
- 针对shinycssloaders的显式等待:
wait_for_idle()仅检测Shiny后端的空闲状态,shinycssloaders的加载动画由前端CSS类控制。可尝试等待加载容器的hidden类出现:app$wait_for_selector(selector = ".shiny-spinner-container.hidden", timeout = 1e6) - 强制延迟或触发DOM更新:测试环境可能存在渲染时序差,可在
wait_for_idle()后添加短暂延迟验证:
或在Sys.sleep(2)renderPlot末尾添加session$flushReact()确保输出完全推送至前端。 - JS条件等待:通过JS判断加载动画是否隐藏,确保截图时机正确:
app$wait_for_js("document.getElementById('summ_display_hist').closest('.shiny-spinner-container').classList.contains('hidden')") - 测试模式下禁用加载动画:通过
shiny::isTesting()在测试时跳过加载动画:if (shiny::isTesting()) { plotOutput(outputId = 'summ_display_hist') } else { shinycssloaders::withSpinner(plotOutput(outputId = 'summ_display_hist')) } - 调整无头浏览器参数:无X Server的Chrome无头模式可能存在渲染异常,启动浏览器时添加参数:
options(shinytest2.browser.args = c("--no-sandbox", "--disable-gpu", "--headless=new"))
内容的提问来源于stack exchange,提问作者Alex Silverman
相关产品推荐
相关产品推荐

