如何避免具有相同名称的 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()
这是我非常简单的 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 andtabsetPanel
has anid
, 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()