【问题标题】:Headless operations don't work inside Sinatra route无头操作在 Sinatra 路线内不起作用
【发布时间】:2016-11-04 09:01:18
【问题描述】:

我正在使用 headlessselenium-webdriver gem 来启动无头 Firefox 浏览器:

headless = Headless.new(
  video: {
    frame_rate: 12,
    codec: 'libx264'
  }
)
headless.start
driver = Selenium::WebDriver.for(:firefox)

使用此代码,我可以编写以下内容:

driver.navigate.to("http://google.com")

然而,在我在浏览器中访问“/”后,以下内容会引发错误:

get '/' do
  driver.navigate.to("http://google.com")
  erb :root
end

错误如下:

*** Errno::ECONNREFUSED Exception: Failed to open TCP connection to 127.0.0.1:7055 (Connection refused - connect(2) for "127.0.0.1" port 7055)

我很确定这是因为 driver.navigate 没有在无头范围内被调用,因此它无法连接到 Firefox 实例。

我也尝试过使用模块化 sinatra 样式,但发生了同样的错误。


解决方法

我最终做的是在一个单独的脚本中分离无头服务器。该脚本具有loop 并获取输入,打印在无头范围内运行命令的输出。然后从 sinatra 服务器,我使用 PTY.spawn 实例化服务器并传递它的标准输入和标准输出,以便我可以在我的 Sinatra 应用程序中使用它。这样,无头脚本只运行一次(因此没有启动多个无头服务器),我可以从我的 Sinatra 路由连接到它。我不能直接与无头脚本的变量或方法交互——我只需要使用 i/o。

我希望得到一个如何使原始代码工作的答案(当 sinatra 应用程序的路由在无头范围内调用时)

【问题讨论】:

    标签: ruby selenium sinatra headless


    【解决方案1】:

    一个可能有帮助的技巧:

    this = self
    get '/' do
      this.driver.navigate.to("http://google.com")
      erb :root
    end
    

    【讨论】:

    • 我很欣赏这个建议,但是当它在无头范围内运行时,我根本无法连接到我的 Sinatra 服务器。这可能是我的代码运行的云环境 Nitrous 特有的问题。我将不得不尝试不同的环境。
    • :(那么我会在1天内删除这条评论。
    • 酷,我确实让它工作了。不需要使用this = self 技巧。重要的是我只有在 sinatra 路由命中时才启动无头浏览器。所以我在一个单独的类上创建了start_headlessstart_driver 方法。
    • 太棒了!这里的奖励有点不公平。我会用对未来读者真正有帮助的东西来更新答案。
    【解决方案2】:

    我最终得到了这个工作。

    起初我认为修复它的是在 sinatra 路由范围内进行无头环境初始化,即

    get '/' { do_initialization_here }

    真正的解决方法可能是我调用Headless.new 的方式(我最初添加了一堆选项,但我删除了所有选项)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2017-10-02
      • 2013-05-03
      • 2014-09-08
      相关资源
      最近更新 更多