【问题标题】:Rselenium can't connect to running shiny appRselenium 无法连接到运行闪亮的应用程序
【发布时间】:2018-02-01 16:00:26
【问题描述】:

我在 docker 中配置了 selenium 服务器。它工作正常 - 我可以连接到它,但是当我想与正在运行的本地闪亮应用程序交互时,Rselenium 看不到它。详情如下:

我一步一步做了:

  • 我运行 selenium 服务器:

    docker run -d -p 4445:4444 selenium/standalone-chrome

  • 成功连接到 selenium 服务器:

remDr <- remoteDriver(remoteServerAddr = "localhost" , port = 4445L , browserName = "chrome" , platform = "MAC")

> remDr$open() [1] "Connecting to remote server"

  • 从终端运行闪亮的应用程序(在单独的 r 会话中):

> shiny::runApp(file.path(find.package("RSelenium"), "apps", "shinytestapp"), port = 6012) Listening on http://127.0.0.1:6012

  • 然后尝试做一些测试:

remDr$navigate("localhost:6012") appTitle <- remDr$getTitle()[[1]] expect_equal(appTitle, "Shiny Test App")

得到错误:

Error: 'appTitle' not equal to "Shiny Test App". 1/1 mismatches x[1]: "localhost" y[1]: "Shiny Test App"

  • 毕竟我做了截图:

remDr$screenshot(display = TRUE)

它看起来像这样:

你知道为什么 RSelenium 看不到在本地运行的闪亮应用吗?

【问题讨论】:

  • @jdharrison 我使用你的命令安装了 docker,它看起来像这样:PORTS: 0.0.0.0:6012-&gt;6012/tcp, 0.0.0.0:4445-&gt;4444/tcp 但 RSelenium 仍然看不到闪亮的应用程序。还有其他想法吗?

标签: r macos selenium shiny rselenium


【解决方案1】:

我在@jdharrison 的很多帮助 的帮助下想通了。

首先制作 docker compose 文件(注意缩进 - 一个缩进必须是 2 个空格)并保存为 docker-compose.yml:

version: '2'
services:
  ropensci:
    image: rocker/ropensci
    ports:
      - "8788:8787"
    links:
      - selenium:selenium
      - shiny:shiny
  selenium:
    image: selenium/standalone-chrome
    ports:
      - "4445:4444"
    links:
      - shiny:shiny
  shiny:
    image: rocker/shiny
    container_name: shiny
    volumes:
      - ~/Users/username/services/volumes/shiny/apps:/srv/shiny-server/
      - ~/Users/username/services/volumes/shiny/logs:/var/log/
      - ~/Users/username/services/volumes/shiny/packages:/home/shiny/

或下载:https://codeshare.io/2j4yLB

然后从docker-compose.yml 文件所在的文件夹运行docker-compose up

  • 将您的应用添加到/home/username/services/volumes/shiny/apps
  • 要从 selenium 导航到您的应用程序,请使用 http://shiny:3838/myapp

要检查它是否有效,您可以将以下代码另存为app.R~/Users/username/services/volumes/shiny/apps/example/

library(shiny)
server <- function(input, output) {
  output$distPlot <- renderPlot({
    hist(rnorm(input$obs), col = 'darkgray', border = 'white')
  })
}
ui <- fluidPage(
  sidebarLayout(
    sidebarPanel(
      sliderInput("obs", "Number of observations:", min = 10, max = 500, value = 100)
    ),
    mainPanel(plotOutput("distPlot"))
  )
)
shinyApp(ui = ui, server = server)

然后运行:

library(RSelenium) 
remDr <- remoteDriver(remoteServerAddr = "selenium", port = 4444L, browser = "chrome") 
remDr$open()
remDr$navigate(url = "http://shiny:3838/example")
remDr$screenshot(display = TRUE)

如果一切正常,您应该会看到屏幕截图:

【讨论】:

  • 是的,docker compose 就是这样做的方式?。
【解决方案2】:

有多种方法可以实现这一目标。最简单的方法是在--net=host 模式下运行 docker。这意味着 selenium 服务器在默认端口 4444 上运行

docker run -d --net=host selenium/standalone-chrome&

您的 docker 容器现在可以访问 HOST localhost。

要在非默认端口上运行,您可以向 docker 传递一个 selenium 环境变量:

docker run -d --net=host -e SE_OPTS="-port 4445" selenium/standalone-chrome

【讨论】:

  • 当我像这样运行 docker 时,我无法连接到端口 4444 上的 docker:Failed to connect to localhost port 4444: Connection refuse。我在 mac osx 上工作 - 这有关系吗?
  • 是的,端口 4444 有时似乎是 MAC 上的问题。您可以将 docker 容器设置为在上述替代方案上运行。
  • 还是同样的错误:Undefined error in httr call. httr output: Failed to connect to localhost port 4445: Connection refused。也许我应该重新配置一些东西?也许我应该对代理设置做些什么?还是别的什么?
  • 是的,MAC 和 --net=host github.com/docker/for-mac/issues/1031 似乎存在问题。首选的选项是将闪亮的服务器作为容器运行,然后网络就很简单了。
  • 但是我已经使用 rstudio 运行 docker 容器,如果我尝试:remDr$navigate(url = "localhost:8787"); remDr$getTitle()[[1]] 我也会得到:localhost。看起来-p 映射不起作用。为什么?
猜你喜欢
  • 2013-07-08
  • 2016-06-15
  • 2023-03-04
  • 1970-01-01
  • 2016-02-09
  • 2017-02-11
  • 2018-04-12
  • 1970-01-01
  • 2015-03-28
相关资源
最近更新 更多