在shinyapps.io部署含RSelenium的Shiny应用时无法打开Chrome浏览器
问题分析
shinyapps.io的容器环境不允许直接在应用内启动本地Selenium服务进程,你当前使用rsDriver尝试在平台内启动ChromeDriver服务,这种操作在受限环境下无法执行,因此出现连接被拒绝的错误。
解决方案
方案1:改用外部Selenium Grid服务
不在应用内启动Selenium服务,转而连接到外部的Selenium Grid(自行搭建或使用云服务),修改代码如下:
library(shiny) library(RSelenium) ui <- fluidPage( actionButton("btn", "Click Me!"), textOutput("txt"), ) server <- function(input, output, session) { observeEvent(input$btn, { # 配置连接外部Selenium Grid remDr <- remoteDriver( remoteServerAddr = "你的Selenium Grid地址", # 替换为实际服务地址 port = 4444, # 对应Grid服务端口 browserName = "chrome", extraCapabilities = list( chromeOptions = list( args = c('--headless', '--disable-gpu', '--window-size=1280,800') ) ) ) remDr$open() remDr$navigate("http://www.google.com") title <- remDr$getTitle() output$txt <- renderText(as.character(title)) remDr$close() remDr$quit() }) } shinyApp(ui, server)
注意:需确保shinyapps.io的IP能访问你搭建/使用的Selenium Grid服务。
方案2:换用chromote包替代RSelenium
chromote是轻量的Chrome远程控制工具,无需启动额外Selenium Server,更适配shinyapps.io环境,修改代码如下:
library(shiny) library(chromote) ui <- fluidPage( actionButton("btn", "Click Me!"), textOutput("txt"), ) server <- function(input, output, session) { observeEvent(input$btn, { # 初始化chromote会话 b <- ChromoteSession$new( opts = list( args = c('--headless', '--disable-gpu', '--window-size=1280,800') ) ) b$Page$navigate(url = "http://www.google.com") b$Page$loadEventFired(wait_ = TRUE) title <- b$Page$getTitle()$result$title output$txt <- renderText(title) # 关闭会话 b$close() }) } shinyApp(ui, server)
部署前需在项目的DESCRIPTION文件中添加chromote依赖,确保平台安装该包。
额外注意事项
- shinyapps.io环境已预装Chrome,无需额外安装,但需确保使用的包版本与平台兼容;
- 避免使用
wdman这类启动本地服务的工具,平台不允许在应用容器内运行额外服务进程; - 新代码需先在本地测试正常后,再部署到shinyapps.io。
内容的提问来源于stack exchange,提问作者Sale Forecast
相关产品推荐
相关产品推荐

