lib/aranha/selenium/session.rb in aranha-selenium-0.4.2 vs lib/aranha/selenium/session.rb in aranha-selenium-0.5.0
- old
+ new
@@ -1,105 +1,41 @@
# frozen_string_literal: true
require 'aranha/selenium/driver_factory'
+require 'eac_ruby_utils/core_ext'
module Aranha
module Selenium
class Session < ::SimpleDelegator
- attr_reader :downloads, :wait
+ require_sub __FILE__, include_modules: true
+ enable_simple_cache
+ attr_reader :downloads
def initialize(options = {})
@downloads = Downloads.new
- @wait = ::Selenium::WebDriver::Wait.new(timeout: 15)
super(
::Aranha::Selenium::DriverFactory.create_driver(
options.merge(download_dir: @downloads.dir)
)
)
end
- # @return [Selenium::WebDriver::Element, nil]
- def find_element(*args, &block)
- return args.first if args.count >= 1 && args.first.is_a?(::Selenium::WebDriver::Element)
-
- __getobj__.find_element(*args, &block)
- end
-
- def find_or_not_element(find_element_args)
- r = find_elements(find_element_args)
- r.any? ? r.first : nil
- end
-
- def select_option(field, value, *find_element_args)
- select = find_element(*find_element_args)
- option = ::Selenium::WebDriver::Support::Select.new(select)
- option.select_by(field, value)
- end
-
- def select_option_by_text(text, *find_element_args)
- select_option(:text, text, *find_element_args)
- end
-
- def select_option_by_value(value, *find_element_args)
- select_option(:value, value, *find_element_args)
- end
-
- def wait_for_click(find_element_args)
- wait.until do
- element = find_element(find_element_args)
- element ? element_click(element) : nil
- end
- end
-
- def wait_for_element(find_element_args)
- wait.until { find_element(find_element_args) }
- end
-
- def wait_for_download
- initial_downloads = downloads.current
- yield
- new_downloads = []
- wait.until do
- new_downloads = downloads.current - initial_downloads
- new_downloads.any?
- end
- new_downloads.first
- end
-
- def wait_for_url_change(&block)
- previous_url = current_url
- block&.call
-
- wait.until { current_url != previous_url }
- end
-
def current_source
element = find_element(xpath: '/html[1]')
raise 'Root element not found' unless element
s = element.attribute('innerHTML')
"<html>\n#{s}\n</html>\n"
end
- class Downloads
- attr_reader :dir
-
- def initialize
- @dir = ::Dir.mktmpdir
- end
-
- def current
- Dir.glob("#{dir}/**/*")
- end
- end
-
private
def element_click(element)
element.click
element
rescue ::Selenium::WebDriver::Error::ElementClickInterceptedError,
- ::Selenium::WebDriver::Error::ElementNotInteractableError
+ ::Selenium::WebDriver::Error::ElementNotInteractableError,
+ ::Selenium::WebDriver::Error::StaleElementReferenceError
nil
end
end
end
end