我正在使用 headless
和 selenium-webdriver
gems 启动 headless (headless) 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
没有在 headless (headless)范围内被调用,因此它无法连接到 Firefox 实例。
我也尝试过使用模块化的sinatra风格,但出现了同样的错误。
解决方法
我最终做的是将 headless (headless)服务器分离到一个单独的脚本中。此脚本具有 loop
并获取输入,打印在 headless (headless)范围内运行命令的输出。然后从 sinatra 服务器,我使用 PTY.spawn
来实例化服务器并传递它的标准输入和标准输出,这样我就可以在我的 Sinatra 应用程序中使用它。这样 headless (headless)脚本只运行一次(因此不会启动多个 headless (headless)服务器),我可以从我的 Sinatra 路由连接到它。我不能直接与 headless (headless)脚本的变量或方法交互——我只需要使用 i/o。
不过,我希望得到有关如何使原始代码正常工作的答案(当在 headless (headless)范围内调用 sinatra 应用程序的路由时)
最佳答案
一个可能有用的技巧:
this = self
get '/' do
this.driver.navigate.to("http://google.com")
erb :root
end
关于ruby - headless (headless)操作在 Sinatra 路由中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38154053/