From 1dffa8410f1a7d9d9aa0d72f8e6896a849136dd0 Mon Sep 17 00:00:00 2001 From: Bruce Davidson Date: Wed, 6 Aug 2025 12:26:41 +0100 Subject: [PATCH] Add support for ferrum as a driver --- lib/teaspoon/driver.rb | 1 + lib/teaspoon/driver/ferrum.rb | 50 +++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 lib/teaspoon/driver/ferrum.rb diff --git a/lib/teaspoon/driver.rb b/lib/teaspoon/driver.rb index a1c696b3..65b060f8 100644 --- a/lib/teaspoon/driver.rb +++ b/lib/teaspoon/driver.rb @@ -13,3 +13,4 @@ module Driver Teaspoon::Driver.register(:phantomjs, "Teaspoon::Driver::Phantomjs", "teaspoon/driver/phantomjs", default: true) Teaspoon::Driver.register(:selenium, "Teaspoon::Driver::Selenium", "teaspoon/driver/selenium") Teaspoon::Driver.register(:browserstack, "Teaspoon::Driver::BrowserStack", "teaspoon/driver/browserstack") +Teaspoon::Driver.register(:ferrum, "Teaspoon::Driver::Ferrum", "teaspoon/driver/ferrum") diff --git a/lib/teaspoon/driver/ferrum.rb b/lib/teaspoon/driver/ferrum.rb new file mode 100644 index 00000000..50bb9d7f --- /dev/null +++ b/lib/teaspoon/driver/ferrum.rb @@ -0,0 +1,50 @@ +# :nocov: +begin + require "ferrum" +rescue LoadError + Teaspoon.abort("Could not find Ferrum. Install the ferrum gem.") +end +# :nocov: + +require "teaspoon/driver/base" + +module Teaspoon + module Driver + class Ferrum < Base + def initialize(options = nil) + options ||= {} + case options + when Hash then @options = options + when String then @options = JSON.parse(options) + else raise Teaspoon::DriverOptionsError.new(types: "hash or json string") + end + rescue JSON::ParserError + raise Teaspoon::DriverOptionsError.new(types: "hash or json string") + end + + def run_specs(runner, url) + driver = ::Ferrum::Browser.new(driver_options) + driver.go_to(url) + + if driver.evaluate("window.Teaspoon") + until driver.evaluate("window.Teaspoon.finished") + sleep 0.01 + end + driver.evaluate("window.Teaspoon.getMessages() || []").each do |line| + runner.process("#{line}\n") + end + end + ensure + driver.quit if driver + end + + protected + + def driver_options + @driver_options ||= HashWithIndifferentAccess.new( + timeout: Teaspoon.configuration.driver_timeout.to_i + ).merge(@options) + end + end + end +end