ruby – 无头操作在Sinatra路线内不起作用

我使用无头和selenium-webdriver宝石推出无头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样式,但发生了同样的错误.

解决方法

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

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

最佳答案 一个可能有用的技巧:

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