require_relative '../client' module TrueAutomation class RecordNotFound < StandardError; end module Driver class Capybara < Capybara::Selenium::Driver def initialize(app, **options) @port = options.delete(:port) || 9515 @driver = options.delete(:driver) @driver_version = options.delete(:driver_version) super(app, options) @ta_client = TrueAutomation::Client.new @remote = '' options ||= {} ta_url = options[:ta_url] || "http://localhost:#{@port}/" capabilities = options[:desired_capabilities] capabilities ||= {} if options and options[:browser] == :remote raise 'Remote driver URL is not specified' unless options[:url] capabilities[:taRemoteUrl] = options[:url] @remote = ' --remote' else capabilities[:browser] = options[:browser] || :chrome end @options.merge!(browser: :remote, url: ta_url, desired_capabilities: capabilities) end def browser unless @browser @ta_client.start(port: @port, remote: @remote, driver: @driver, driver_version: @driver_version) @ta_client.wait_until_start at_exit do @ta_client.stop end super end @browser end def find_css(selector) res = super check_selector(selector) if !res || res.empty? res end def find_xpath(selector) res = super check_selector(selector) if !res || res.empty? res end private def check_selector(selector) if ta_selector_match = selector.match(/__taonly__(.+)__taonly__/) error_text = "Element '#{ta_selector_match[1]}' was not found in database. " + 'Please provide a selector to find and initialize element.' raise TrueAutomation::RecordNotFound, error_text end end end end end