【发布时间】:2016-11-04 09:01:18
【问题描述】:
我正在使用 headless 和 selenium-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