2016-07-01 30 views
4

我使用的headlessselenium-webdriver宝石推出了无头的Firefox浏览器内工作然后,我在浏览器中访问'/'后发生错误:无头操作不西纳特拉路线

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。

我希望它怎么样了如何使原代码工作,但(当西纳特拉应用程序的路由是在无头的范围内)的答案

回答

2

一个可能的绝招,可以帮助:

this = self 
get '/' do 
    this.driver.navigate.to("http://google.com") 
    erb :root 
end 
+0

我很欣赏这个建议,但是我无法连接到我的Sinatra服务器,因为它在无头的范围内运行。这可能是Nitrous的特定问题,我的代码正在运行的云环境。我将不得不尝试不同的环境。 –

+0

:(我会在1天内删除这条评论,然后 – mudasobwa

+0

很酷,我确实得到了它的工作,不需要使用'this = self'技巧,重要的是我只启动了一次无头浏览器所以我在一个单独的课上做了'start_headless'和'start_driver'方法 –

0

我最终得到了这个工作。

起初我还以为是什么固定它是做一个西纳特拉路线范围内的无头环境初始化,即

get '/' { do_initialization_here }

真正的修复可能已经在我打电话Headless.new的方式(我原本有一堆选项,我删除了所有的)。