Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 无头操作不';不要在西纳特拉路线内工作_Ruby_Selenium_Sinatra_Headless - Fatal编程技术网

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。届时,我将用对未来读者真正有帮助的内容更新答案。