aranha-selenium 0.4.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/aranha/selenium/defaults/option.rb +49 -0
- data/lib/aranha/selenium/defaults.rb +41 -0
- data/lib/aranha/selenium/driver_factory/base.rb +5 -35
- data/lib/aranha/selenium/session/downloads.rb +21 -0
- data/lib/aranha/selenium/session/find.rb +21 -0
- data/lib/aranha/selenium/session/select.rb +23 -0
- data/lib/aranha/selenium/session/wait.rb +49 -0
- data/lib/aranha/selenium/session.rb +6 -70
- data/lib/aranha/selenium/version.rb +1 -1
- metadata +12 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 7aceb03be8d423ca084646615d2869147f8ae89137f8c753732dabebde6032f5
|
|
4
|
+
data.tar.gz: f39cd164dd36c4f333693a8d33ebadce8a5a13de0a70c25ce039714ace68c8b3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 6caca3383682a545705954abbc971b07aa3a259ca03bc1c9be2d29b26274cf410d31fb67bf87ea408d1361a3bc9d748a2b0dcc90416662b91c63bf1d9794a218
|
|
7
|
+
data.tar.gz: 35a436b59edc41e266a5553ea8ffb495329d3b74ccd2ea4634a034a8cd8a659d39adaccf77bf14f5671bbb431a8feedded5f2c06926345b3aaa8bb81b1f21f10
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'aranha/selenium/driver_factory'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
|
|
6
|
+
module Aranha
|
|
7
|
+
module Selenium
|
|
8
|
+
class Defaults
|
|
9
|
+
class Option
|
|
10
|
+
common_constructor :owner, :key, :sanitizer, default: [nil] do
|
|
11
|
+
self.key = key.to_sym
|
|
12
|
+
end
|
|
13
|
+
attr_accessor :user_value
|
|
14
|
+
|
|
15
|
+
# @return [String]
|
|
16
|
+
def constant_name
|
|
17
|
+
"default_#{key}".upcase
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# @return [Object]
|
|
21
|
+
def default_value
|
|
22
|
+
owner.class.const_get(constant_name)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [String]
|
|
26
|
+
def envvar_name
|
|
27
|
+
"aranha_selenium_#{key}".upcase
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Object]
|
|
31
|
+
def value
|
|
32
|
+
sanitized_value do
|
|
33
|
+
next ENV.fetch(envvar_name) if ENV.key?(envvar_name)
|
|
34
|
+
next user_value unless user_value.nil?
|
|
35
|
+
|
|
36
|
+
default_value
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def sanitized_value(&block)
|
|
43
|
+
r = block.call
|
|
44
|
+
sanitizer.present? ? sanitizer.call(r) : r
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'eac_ruby_utils/boolean'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
5
|
+
require 'tmpdir'
|
|
6
|
+
|
|
7
|
+
module Aranha
|
|
8
|
+
module Selenium
|
|
9
|
+
class Defaults
|
|
10
|
+
include ::Singleton
|
|
11
|
+
|
|
12
|
+
DEFAULT_DOWNLOADS_DIR = ::File.join(::Dir.tmpdir, 'aranha_downloads_dir')
|
|
13
|
+
DEFAULT_ACCEPT_INSECURE_CERTS = false
|
|
14
|
+
DEFAULT_HEADLESS = false
|
|
15
|
+
DEFAULT_USER_AGENT = nil
|
|
16
|
+
|
|
17
|
+
%w[accept_insecure_certs downloads_dir headless user_agent].each do |key|
|
|
18
|
+
define_method(key) { send("#{key}_option").value }
|
|
19
|
+
define_method("#{key}=") { |user_value| send("#{key}_option").user_value = user_value }
|
|
20
|
+
define_method("#{key}_option") do
|
|
21
|
+
options[key] ||= ::Aranha::Selenium::Defaults::Option.new(self, key)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [Aranha::Selenium::Defaults::Option]
|
|
26
|
+
def headless_option
|
|
27
|
+
options['headless'] ||= ::Aranha::Selenium::Defaults::Option.new(
|
|
28
|
+
self, 'headless', ->(v) { ::EacRubyUtils::Boolean.parse(v) }
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def options
|
|
35
|
+
@options ||= {}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
require_sub __FILE__
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -1,44 +1,14 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require '
|
|
4
|
-
require '
|
|
5
|
-
require 'selenium-webdriver'
|
|
6
|
-
require 'tmpdir'
|
|
3
|
+
require 'aranha/selenium/defaults'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
7
5
|
|
|
8
6
|
module Aranha
|
|
9
7
|
module Selenium
|
|
10
8
|
class DriverFactory
|
|
11
9
|
class Base
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
DEFAULT_HEADLESS = false
|
|
15
|
-
DEFAULT_USER_AGENT = nil
|
|
16
|
-
|
|
17
|
-
class << self
|
|
18
|
-
attr_writer :default_accept_insecure_certs, :default_downloads_dir, :default_headless,
|
|
19
|
-
:default_user_agent
|
|
20
|
-
|
|
21
|
-
def default_downloads_dir
|
|
22
|
-
@default_downloads_dir || DEFAULT_DOWNLOADS_DIR
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def default_accept_insecure_certs
|
|
26
|
-
@default_accept_insecure_certs || DEFAULT_ACCEPT_INSECURE_CERTS
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def default_headless
|
|
30
|
-
@default_headless || DEFAULT_HEADLESS
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def default_user_agent
|
|
34
|
-
@default_user_agent || DEFAULT_USER_AGENT
|
|
35
|
-
end
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
attr_reader :options
|
|
39
|
-
|
|
40
|
-
def initialize(options)
|
|
41
|
-
@options = options.with_indifferent_access.freeze
|
|
10
|
+
common_constructor :options do
|
|
11
|
+
self.options = options.with_indifferent_access.freeze
|
|
42
12
|
end
|
|
43
13
|
|
|
44
14
|
def build
|
|
@@ -75,7 +45,7 @@ module Aranha
|
|
|
75
45
|
if options.key?(key)
|
|
76
46
|
options.fetch(key)
|
|
77
47
|
else
|
|
78
|
-
::Aranha::Selenium::
|
|
48
|
+
::Aranha::Selenium::Defaults.instance.send(key)
|
|
79
49
|
end
|
|
80
50
|
end
|
|
81
51
|
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'tmpdir'
|
|
4
|
+
|
|
5
|
+
module Aranha
|
|
6
|
+
module Selenium
|
|
7
|
+
class Session < ::SimpleDelegator
|
|
8
|
+
class Downloads
|
|
9
|
+
attr_reader :dir
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
@dir = ::Dir.mktmpdir
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def current
|
|
16
|
+
Dir.glob("#{dir}/**/*")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aranha
|
|
4
|
+
module Selenium
|
|
5
|
+
class Session < ::SimpleDelegator
|
|
6
|
+
module Find
|
|
7
|
+
# @return [Selenium::WebDriver::Element, nil]
|
|
8
|
+
def find_element(*args, &block)
|
|
9
|
+
return args.first if args.count >= 1 && args.first.is_a?(::Selenium::WebDriver::Element)
|
|
10
|
+
|
|
11
|
+
__getobj__.find_element(*args, &block)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def find_or_not_element(find_element_args)
|
|
15
|
+
r = find_elements(find_element_args)
|
|
16
|
+
r.any? ? r.first : nil
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aranha
|
|
4
|
+
module Selenium
|
|
5
|
+
class Session < ::SimpleDelegator
|
|
6
|
+
module Select
|
|
7
|
+
def select_option(field, value, *find_element_args)
|
|
8
|
+
select = find_element(*find_element_args)
|
|
9
|
+
option = ::Selenium::WebDriver::Support::Select.new(select)
|
|
10
|
+
option.select_by(field, value)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def select_option_by_text(text, *find_element_args)
|
|
14
|
+
select_option(:text, text, *find_element_args)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def select_option_by_value(value, *find_element_args)
|
|
18
|
+
select_option(:value, value, *find_element_args)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Aranha
|
|
4
|
+
module Selenium
|
|
5
|
+
class Session < ::SimpleDelegator
|
|
6
|
+
module Wait
|
|
7
|
+
WAIT_DEFAULT_TIMEOUT = 15
|
|
8
|
+
|
|
9
|
+
def wait(timeout = nil)
|
|
10
|
+
timeout ||= wait_default_timeout
|
|
11
|
+
::Selenium::WebDriver::Wait.new(timeout: timeout)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def wait_default_timeout
|
|
15
|
+
WAIT_DEFAULT_TIMEOUT
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def wait_for_click(find_element_args, timeout = nil)
|
|
19
|
+
wait(timeout).until do
|
|
20
|
+
element = find_element(find_element_args)
|
|
21
|
+
element ? element_click(element) : nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def wait_for_element(find_element_args)
|
|
26
|
+
wait.until { find_element(find_element_args) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def wait_for_download
|
|
30
|
+
initial_downloads = downloads.current
|
|
31
|
+
yield
|
|
32
|
+
new_downloads = []
|
|
33
|
+
wait.until do
|
|
34
|
+
new_downloads = downloads.current - initial_downloads
|
|
35
|
+
new_downloads.any?
|
|
36
|
+
end
|
|
37
|
+
new_downloads.first
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def wait_for_url_change(&block)
|
|
41
|
+
previous_url = current_url
|
|
42
|
+
block&.call
|
|
43
|
+
|
|
44
|
+
wait.until { current_url != previous_url }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
require 'aranha/selenium/driver_factory'
|
|
4
|
+
require 'eac_ruby_utils/core_ext'
|
|
4
5
|
|
|
5
6
|
module Aranha
|
|
6
7
|
module Selenium
|
|
7
8
|
class Session < ::SimpleDelegator
|
|
8
|
-
|
|
9
|
+
require_sub __FILE__, include_modules: true
|
|
10
|
+
enable_simple_cache
|
|
11
|
+
attr_reader :downloads
|
|
9
12
|
|
|
10
13
|
def initialize(options = {})
|
|
11
14
|
@downloads = Downloads.new
|
|
12
|
-
@wait = ::Selenium::WebDriver::Wait.new(timeout: 15)
|
|
13
15
|
super(
|
|
14
16
|
::Aranha::Selenium::DriverFactory.create_driver(
|
|
15
17
|
options.merge(download_dir: @downloads.dir)
|
|
@@ -17,61 +19,6 @@ module Aranha
|
|
|
17
19
|
)
|
|
18
20
|
end
|
|
19
21
|
|
|
20
|
-
# @return [Selenium::WebDriver::Element, nil]
|
|
21
|
-
def find_element(*args, &block)
|
|
22
|
-
return args.first if args.count >= 1 && args.first.is_a?(::Selenium::WebDriver::Element)
|
|
23
|
-
|
|
24
|
-
__getobj__.find_element(*args, &block)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def find_or_not_element(find_element_args)
|
|
28
|
-
r = find_elements(find_element_args)
|
|
29
|
-
r.any? ? r.first : nil
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def select_option(field, value, *find_element_args)
|
|
33
|
-
select = find_element(*find_element_args)
|
|
34
|
-
option = ::Selenium::WebDriver::Support::Select.new(select)
|
|
35
|
-
option.select_by(field, value)
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def select_option_by_text(text, *find_element_args)
|
|
39
|
-
select_option(:text, text, *find_element_args)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def select_option_by_value(value, *find_element_args)
|
|
43
|
-
select_option(:value, value, *find_element_args)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def wait_for_click(find_element_args)
|
|
47
|
-
wait.until do
|
|
48
|
-
element = find_element(find_element_args)
|
|
49
|
-
element ? element_click(element) : nil
|
|
50
|
-
end
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def wait_for_element(find_element_args)
|
|
54
|
-
wait.until { find_element(find_element_args) }
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
def wait_for_download
|
|
58
|
-
initial_downloads = downloads.current
|
|
59
|
-
yield
|
|
60
|
-
new_downloads = []
|
|
61
|
-
wait.until do
|
|
62
|
-
new_downloads = downloads.current - initial_downloads
|
|
63
|
-
new_downloads.any?
|
|
64
|
-
end
|
|
65
|
-
new_downloads.first
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def wait_for_url_change(&block)
|
|
69
|
-
previous_url = current_url
|
|
70
|
-
block&.call
|
|
71
|
-
|
|
72
|
-
wait.until { current_url != previous_url }
|
|
73
|
-
end
|
|
74
|
-
|
|
75
22
|
def current_source
|
|
76
23
|
element = find_element(xpath: '/html[1]')
|
|
77
24
|
raise 'Root element not found' unless element
|
|
@@ -80,25 +27,14 @@ module Aranha
|
|
|
80
27
|
"<html>\n#{s}\n</html>\n"
|
|
81
28
|
end
|
|
82
29
|
|
|
83
|
-
class Downloads
|
|
84
|
-
attr_reader :dir
|
|
85
|
-
|
|
86
|
-
def initialize
|
|
87
|
-
@dir = ::Dir.mktmpdir
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def current
|
|
91
|
-
Dir.glob("#{dir}/**/*")
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
|
|
95
30
|
private
|
|
96
31
|
|
|
97
32
|
def element_click(element)
|
|
98
33
|
element.click
|
|
99
34
|
element
|
|
100
35
|
rescue ::Selenium::WebDriver::Error::ElementClickInterceptedError,
|
|
101
|
-
::Selenium::WebDriver::Error::ElementNotInteractableError
|
|
36
|
+
::Selenium::WebDriver::Error::ElementNotInteractableError,
|
|
37
|
+
::Selenium::WebDriver::Error::StaleElementReferenceError
|
|
102
38
|
nil
|
|
103
39
|
end
|
|
104
40
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: aranha-selenium
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Esquilo Azul Company
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2023-05-28 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: eac_ruby_utils
|
|
@@ -16,20 +16,20 @@ dependencies:
|
|
|
16
16
|
requirements:
|
|
17
17
|
- - "~>"
|
|
18
18
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '0.
|
|
19
|
+
version: '0.117'
|
|
20
20
|
- - ">="
|
|
21
21
|
- !ruby/object:Gem::Version
|
|
22
|
-
version: 0.
|
|
22
|
+
version: 0.117.1
|
|
23
23
|
type: :runtime
|
|
24
24
|
prerelease: false
|
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
|
26
26
|
requirements:
|
|
27
27
|
- - "~>"
|
|
28
28
|
- !ruby/object:Gem::Version
|
|
29
|
-
version: '0.
|
|
29
|
+
version: '0.117'
|
|
30
30
|
- - ">="
|
|
31
31
|
- !ruby/object:Gem::Version
|
|
32
|
-
version: 0.
|
|
32
|
+
version: 0.117.1
|
|
33
33
|
- !ruby/object:Gem::Dependency
|
|
34
34
|
name: selenium-webdriver
|
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -72,12 +72,18 @@ extra_rdoc_files: []
|
|
|
72
72
|
files:
|
|
73
73
|
- Gemfile
|
|
74
74
|
- lib/aranha/selenium.rb
|
|
75
|
+
- lib/aranha/selenium/defaults.rb
|
|
76
|
+
- lib/aranha/selenium/defaults/option.rb
|
|
75
77
|
- lib/aranha/selenium/driver_factory.rb
|
|
76
78
|
- lib/aranha/selenium/driver_factory/base.rb
|
|
77
79
|
- lib/aranha/selenium/driver_factory/chrome.rb
|
|
78
80
|
- lib/aranha/selenium/driver_factory/firefox.rb
|
|
79
81
|
- lib/aranha/selenium/driver_factory/firefox_auto_download_mime_types
|
|
80
82
|
- lib/aranha/selenium/session.rb
|
|
83
|
+
- lib/aranha/selenium/session/downloads.rb
|
|
84
|
+
- lib/aranha/selenium/session/find.rb
|
|
85
|
+
- lib/aranha/selenium/session/select.rb
|
|
86
|
+
- lib/aranha/selenium/session/wait.rb
|
|
81
87
|
- lib/aranha/selenium/version.rb
|
|
82
88
|
homepage:
|
|
83
89
|
licenses: []
|