lib/true_automation/driver/capybara.rb in true_automation-0.5.9 vs lib/true_automation/driver/capybara.rb in true_automation-0.6.0

- old
+ new

@@ -66,10 +66,14 @@ module Driver class Capybara < Capybara::Selenium::Driver def initialize(app, **options) options = fetch_options(options) + if options[:browser].to_s != 'remote' + default_options = Selenium::WebDriver::Options.send(options[:browser] || :chrome) + end + options[:capabilities] ||= default_options @port = options.delete(:port) || find_available_port('localhost') @driver = options.delete(:driver) @driver_version = options.delete(:driver_version) if options && options[:ta_debug] @@ -89,21 +93,15 @@ options ||= {} ta_url = options[:ta_url] || "http://localhost:#{@port}/" capabilities = options[:capabilities] || {} - if options and options[:browser] == :remote + if options && options[:browser] == :remote raise 'Remote driver URL is not specified' unless options[:url] - input_caps = options[:capabilities]&.as_json || {} - input_caps = options[:capabilities]&.as_json || {} - browser = opts_browser(options[:capabilities] || Selenium::WebDriver::Chrome::Capabilities.new) - browser_class_name = browser.to_s.slice(0,1).capitalize + browser.to_s.slice(1..-1) - capabilities = browser.to_s == 'remote' ? - Selenium::WebDriver::Remote::Options.new : - self.class.class_eval("Selenium::WebDriver::#{browser_class_name}::Options").send(browser) - copy_options(capabilities, input_caps) - + input_caps = opts_to_json(options[:capabilities]) || {} + browser = opts_browser(options[:capabilities] || Selenium::WebDriver::Options.chrome) + capabilities = options_class(browser).new(**input_caps) capabilities.add_preference(:taRemoteUrl, options[:url]) @remote = ' --remote' end @options.merge!(browser: :remote, @@ -116,11 +114,12 @@ @ta_client.start(port: @port, remote: @remote, ta_debug: @ta_debug, driver: @driver, ta_service_path: @ta_service&.executable_path, - driver_version: @driver_version) + driver_version: @driver_version, + ta_recorder: @ta_recorder) @ta_client.wait_until_start at_exit do @ta_client.stop @@ -148,29 +147,47 @@ end end private + def options_class(browser) + browser.to_s == 'remote' ? + Selenium::WebDriver::Remote::Options : + eval("Selenium::WebDriver::#{browser_class_name(browser)}::Options") + end + + def browser_class_name(browser) + browser.to_s.slice(0,1).capitalize + browser.to_s.slice(1..-1) + end + def opts_browser(opts) opts.class.name.split('::')[2].downcase.to_sym end + def opts_to_json(opts) + opts.is_a?(Selenium::WebDriver::Options) ? + opts&.options : + opts&.as_json + end + def fetch_options(options) + if options.delete(:ta_recorder) + @ta_recorder = ' --ta-recorder' + end if options.key?(:options) browser = opts_browser(options[:options]) - desCaps = Selenium::WebDriver::Remote::Capabilities.send(browser.downcase) - opts = options[:options].as_json - copy_options(desCaps, opts) + opts = opts_to_json(options[:options]) + desCaps = options_class(browser).new(**opts) options[:capabilities] = desCaps options.delete(:options) end options end def copy_options(caps, opts) # Add options to capabilities mapping if required opts.keys.each do |key| - caps.add_preference(key, opts[key]) + caps.add_option(key, opts[key]) end end def find_available_port(host) server = TCPServer.new(host, rand(9515..65515))