Ruby 无头操作不';不要在西纳特拉路线内工作
我正在使用Ruby 无头操作不';不要在西纳特拉路线内工作,ruby,selenium,sinatra,headless,Ruby,Selenium,Sinatra,Headless,我正在使用headless和selenium webdrivergems启动无头Firefox浏览器: headless=headless.new( 视频:{ 帧速率:12, 编解码器:“libx264” } ) 无头启动 driver=Selenium::WebDriver.for(:firefox) 使用此代码,我可以编写以下内容: driver.navigate.to(“http://google.com") 但是,在我访问浏览器中的“/”后,以下内容会引发错误: get'/'do 驱
headless
和selenium webdriver
gems启动无头Firefox浏览器:
headless=headless.new(
视频:{
帧速率:12,
编解码器:“libx264”
}
)
无头启动
driver=Selenium::WebDriver.for(:firefox)
使用此代码,我可以编写以下内容:
driver.navigate.to(“http://google.com")
但是,在我访问浏览器中的“/”后,以下内容会引发错误:
get'/'do
驱动程序。导航到(“http://google.com")
根
结束
错误如下:
*** 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)
我很确定这是因为没有在headless作用域中调用driver.navigate
,因此它无法连接到Firefox实例
我也尝试过使用模块化的sinatra风格,但同样的错误也发生了
解决方法 我最后做的是在一个单独的脚本中分离无头服务器。此脚本具有
循环
并获取输入,打印在headless作用域中运行命令的输出。然后从sinatra服务器,我使用PTY.spawn
实例化服务器并传递其stdin和stdout,以便在我的sinatra应用程序中使用它。这样,headless脚本只运行一次(因此多个headless服务器不会启动),我可以通过我的Sinatra路由连接到它。我不能直接与headless脚本的变量或方法交互——我只需要使用I/o
我希望能找到一个如何使原始代码工作的答案(当sinatra应用程序的路由在headless范围内调用时)一个可能的技巧可以帮助:
this = self
get '/' do
this.driver.navigate.to("http://google.com")
erb :root
end
我最终让它工作了 起初,我认为修复它的是在sinatra路由范围内进行无头环境初始化,即
get'/'{do\u initialization\u here}
真正的解决方法可能是我调用Headless.new的方式(我最初添加了一系列选项,并将它们全部删除) 我很感谢你的建议,但当我的Sinatra服务器在headless范围内运行时,我根本无法连接到它。这可能是Nitrous特有的问题,Nitrous是运行代码的云环境。我得换个环境试试(我会在一天内删除这条评论。很酷,我确实让它工作了。不需要使用
this=self
技巧。重要的是,我只在sinatra路线到达后才启动headless浏览器。所以我在一个单独的类上创建了start\u headless
和start\u driver
方法。太棒了!这里的奖励有点像你。)nfair。届时,我将用对未来读者真正有帮助的内容更新答案。