如何避免具有相同名称的 navbarMenu 条目的 shinytest 歧义?

How to avoid shinytest ambiguities with navbarMenu entries having identical names?

这是我非常简单的 Shiny app.R。如您所见,在两个顶级菜单条目下有具有相同名称的子菜单条目:

library(shiny)
ui <- basicPage(
  navbarPage("App", id = "nav",
    navbarMenu("Top 1", # id = "top1",
      tabPanel("Sub 1", "Top 1, Sub 1"),
      tabPanel("Sub 2", "Top 1, Sub 2")
    ),
    navbarMenu("Top 2", # id = "top2",
      tabPanel("Sub 1", "Top 2, Sub 1"),
      tabPanel("Sub 2", "Top 2, Sub 2")
    )
  )
)
server <- function(input, output, session) {}
shinyApp(ui = ui, server = server)

我可以 运行 这个应用程序并使用 shiny::shinyAppDir(".") 访问所有子菜单条目。

但是,当使用 shinytest::recordTest(".") 记录所有选项卡的测试时,记录的脚本如下所示:

app <- ShinyDriver$new("../../")
app$snapshotInit("mytest")

app$setInputs(nav = "Sub 2")
app$setInputs(nav = "Sub 1")
app$setInputs(nav = "Sub 2")
app$snapshot()

您会立即看到问题:从调用中,我不清楚我选择了哪个顶级菜单条目(为了记录,我选择了 Top 1、Top 2、Top 2)。

如何在不重命名子菜单条目的情况下处理这个问题?我尝试在 navbarMenu 中添加一个 id,如您在上面所见,但这只会导致

Tabs should all be unnamed arguments, but some are named: id

经过一番挖掘,我发现了这个:

value The value that should be sent when tabsetPanel reports that this tab is selected. If omitted and tabsetPanel has an id, then the title will be used.

https://shiny.rstudio.com/reference/shiny/0.14/tabPanel.html

所以一种解决方案是:

library(shiny)
ui <- basicPage(
  navbarPage("App", id = "nav",
    navbarMenu("Top 1",
      tabPanel("Sub 1", "Top 1, Sub 1", value = "top1/sub1"),
      tabPanel("Sub 2", "Top 1, Sub 2", value = "top1/sub2")
    ),
    navbarMenu("Top 2",
      tabPanel("Sub 1", "Top 2, Sub 1", value = "top2/sub1"),
      tabPanel("Sub 2", "Top 2, Sub 2", value = "top2/sub2")
    )
  )
)
server <- function(input, output, session) {}
shinyApp(ui = ui, server = server)

这给出了

app <- ShinyDriver$new("../../")
app$snapshotInit("mytest")

app$setInputs(nav = "top1/sub2")
app$setInputs(nav = "top2/sub1")
app$setInputs(nav = "top2/sub2")
app$snapshot()