ruby - headless (headless)操作在 Sinatra 路由中不起作用

标签 ruby selenium sinatra headless

我正在使用 headlessselenium-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/

相关文章:

ruby - 如何在 XMPP (Jabber) 消息中发送 Web 上的图像?

javascript - Json(/hash) 到 ruby​​ 对象?

java - Selenium 从 WebDriver 获取 HTML(或 JSON)响应

javascript - Protractor - 无法通过CSS获取嵌套元素

java - 从 Selenium 测试 onbeforeunload 事件

ruby - 类内的路由处理程序

ruby - 使用 Sinatra 开发一个完整的网站有什么问题吗?

ruby-on-rails - rails : How can you access session variables using multiple controllers?

ruby-on-rails - 字符串转换为 ActionDispatch::Http::UploadedFile

ruby - 模块化 Sinatra 应用程序在 Passenger 下返回 404