我正在使用headless
和selenium-webdriver
宝石推出无头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实例。
我也尝试使用模块化的sinatra样式,但发生了同样的错误。
解决方法
我最终做的是在一个单独的脚本中分离无头服务器。此脚本具有loop
并获取输入,在无头范围内打印运行命令的输出。然后从sinatra服务器,我使用PTY.spawn
实例化服务器并传递其stdin和stdout,以便我可以在我的Sinatra应用程序中使用它。这样无头脚本只运行一次(因此多个无头服务器都没有启动),我可以从我的Sinatra路由连接到它。我无法直接与无头脚本的变量或方法进行交互 - 我只需要使用i / o。
我希望得到一个答案,该答案如何使原始代码工作(尽管sinatra应用程序的路径在无头范围内被调用)
答案 0 :(得分:2)
一个可能有用的技巧:
this = self
get '/' do
this.driver.navigate.to("http://google.com")
erb :root
end
答案 1 :(得分:0)
我最终得到了这个。
起初我认为解决它的问题是在sinatra路线范围内进行无头环境初始化,即
get '/' { do_initialization_here }
真正的修复方式可能与我调用Headless.new
的方式有关(我最初选择了一系列选项并删除了所有选项)。