无头操作在 Sinatra 路由中不起作用
Headless operations don't work inside Sinatra route
我正在使用 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 实例。
我也试过使用modular sinatra style,但是还是出现了同样的错误。
解决方法
我最终做的是将无头服务器分离到一个单独的脚本中。此脚本具有 loop
并获取输入,在无头范围内打印 运行ning 命令的输出。然后从 sinatra 服务器,我使用 PTY.spawn
来实例化服务器并传递它的标准输入和标准输出,这样我就可以在我的 Sinatra 应用程序中使用它。这样无头脚本只有 运行 一次(因此没有启动多个无头服务器),我可以从我的 Sinatra 路由连接到它。我不能直接与无头脚本的变量或方法交互——我只需要使用 i/o。
不过(当在无头范围内调用 sinatra 应用程序的路由时),我希望得到一个如何使原始代码工作的答案
一个可能有用的技巧:
this = self
get '/' do
this.driver.navigate.to("http://google.com")
erb :root
end
我最终成功了。
起初我认为修复它的是在 sinatra 路由范围内进行无头环境初始化,即
get '/' { do_initialization_here }
真正的解决方法可能是我调用 Headless.new
的方式(我最初添加了很多选项,但我将它们全部删除了)。
我正在使用 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 实例。
我也试过使用modular sinatra style,但是还是出现了同样的错误。
解决方法
我最终做的是将无头服务器分离到一个单独的脚本中。此脚本具有 loop
并获取输入,在无头范围内打印 运行ning 命令的输出。然后从 sinatra 服务器,我使用 PTY.spawn
来实例化服务器并传递它的标准输入和标准输出,这样我就可以在我的 Sinatra 应用程序中使用它。这样无头脚本只有 运行 一次(因此没有启动多个无头服务器),我可以从我的 Sinatra 路由连接到它。我不能直接与无头脚本的变量或方法交互——我只需要使用 i/o。
不过(当在无头范围内调用 sinatra 应用程序的路由时),我希望得到一个如何使原始代码工作的答案
一个可能有用的技巧:
this = self
get '/' do
this.driver.navigate.to("http://google.com")
erb :root
end
我最终成功了。
起初我认为修复它的是在 sinatra 路由范围内进行无头环境初始化,即
get '/' { do_initialization_here }
真正的解决方法可能是我调用 Headless.new
的方式(我最初添加了很多选项,但我将它们全部删除了)。