selenium_page 0.1.0 → 0.2.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/selenium_page.rb +13 -0
- data/lib/selenium_page/element.rb +98 -0
- data/lib/selenium_page/element/errors.rb +24 -0
- data/lib/selenium_page/errors.rb +7 -0
- data/lib/selenium_page/page.rb +74 -2
- data/lib/selenium_page/page/errors.rb +25 -0
- metadata +36 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44333331ba09a124b736b5ed176f43b35090ceeded473e6e81b0656d35d962e5
|
4
|
+
data.tar.gz: 114e74733a9d2750efe7adb8e4122b74178fa54515f287283d47641083d5e161
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a109add0a1cfc701c6f717950b4327ce8b2c93a92a07802c85502577cdb8b2f9ea46dada96803aeeda8d52bfc2d523245c7925216c869fb0061dac5be6e35b72
|
7
|
+
data.tar.gz: 0b5d748859aafa12be5cbaafbe5e79a94687813c6109a6ec591ced13c71cce3d46b0ffcd9dbe04d68441cf2ceecd1b6fbd772ea00ad3e3e10c4a19ffc4a9e82f
|
data/lib/selenium_page.rb
CHANGED
@@ -7,6 +7,9 @@ require 'selenium-webdriver'
|
|
7
7
|
module SeleniumPage
|
8
8
|
require_relative 'selenium_page/errors'
|
9
9
|
require_relative 'selenium_page/page'
|
10
|
+
require_relative 'selenium_page/element'
|
11
|
+
|
12
|
+
@wait_time = 10
|
10
13
|
|
11
14
|
def self.configure_scheme_and_authority(scheme_and_authority)
|
12
15
|
unless scheme_and_authority.is_a? String
|
@@ -19,4 +22,14 @@ module SeleniumPage
|
|
19
22
|
def self.scheme_and_authority
|
20
23
|
@scheme_and_authority
|
21
24
|
end
|
25
|
+
|
26
|
+
def self.configure_wait_time(wait_time)
|
27
|
+
raise Errors::UnexpectedWaitTime unless wait_time.is_a? Numeric
|
28
|
+
|
29
|
+
@wait_time = wait_time
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.wait_time
|
33
|
+
@wait_time
|
34
|
+
end
|
22
35
|
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SeleniumPage
|
4
|
+
# Element
|
5
|
+
class Element
|
6
|
+
require_relative 'element/errors'
|
7
|
+
|
8
|
+
def initialize(driver, base_element)
|
9
|
+
raise Errors::WrongDriver unless driver.is_a? Selenium::WebDriver::Driver
|
10
|
+
unless base_element.is_a? Selenium::WebDriver::Element
|
11
|
+
raise Errors::WrongBaseElement
|
12
|
+
end
|
13
|
+
|
14
|
+
@driver = driver
|
15
|
+
@base_element = base_element
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :driver
|
19
|
+
attr_reader :base_element
|
20
|
+
|
21
|
+
def method_missing(called_method, *args, &block)
|
22
|
+
# FIXME: should this catch some specific methods (to_s ?) ?
|
23
|
+
if base_element.respond_to?(called_method)
|
24
|
+
base_element.send(called_method, *args, &block)
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# this fix the calls to :respond_to? in case of delegation to base_element
|
31
|
+
# the method will stay private
|
32
|
+
# rubocop best practice suggestion
|
33
|
+
def respond_to_missing?(called_method, *)
|
34
|
+
base_element.respond_to?(called_method) || super
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_childrens(parent_selector, &block)
|
38
|
+
@parent_selector = parent_selector
|
39
|
+
instance_exec(&block) if block_given?
|
40
|
+
end
|
41
|
+
|
42
|
+
def element(element_name, element_selector, &block)
|
43
|
+
define_singleton_method(element_name) do
|
44
|
+
selector = @parent_selector + ' ' + element_selector
|
45
|
+
if block_given?
|
46
|
+
find_element(selector, &block)
|
47
|
+
else
|
48
|
+
find_element(selector)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def elements(collection_name, collection_selector, &block)
|
54
|
+
define_singleton_method(collection_name) do
|
55
|
+
selector = @parent_selector + ' ' + collection_selector
|
56
|
+
if block_given?
|
57
|
+
find_elements(selector, &block)
|
58
|
+
else
|
59
|
+
find_elements(selector)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def find_element(element_selector,
|
67
|
+
waiter = Selenium::WebDriver::Wait.new(
|
68
|
+
timeout: SeleniumPage.wait_time
|
69
|
+
), &block)
|
70
|
+
waiter.until do
|
71
|
+
result = SeleniumPage::Element.new(
|
72
|
+
@driver, @driver.find_element(:css, element_selector)
|
73
|
+
)
|
74
|
+
result.add_childrens(element_selector, &block)
|
75
|
+
result
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# rubocop:disable Metrics/MethodLength
|
80
|
+
def find_elements(collection_selector,
|
81
|
+
waiter = Selenium::WebDriver::Wait.new(
|
82
|
+
timeout: SeleniumPage.wait_time
|
83
|
+
), &block)
|
84
|
+
waiter.until do
|
85
|
+
selenium_result = @driver.find_elements(:css, collection_selector)
|
86
|
+
result = []
|
87
|
+
selenium_result.each do |selenium_element|
|
88
|
+
result << SeleniumPage::Element.new(@driver, selenium_element)
|
89
|
+
end
|
90
|
+
result.each do |selenium_page_element|
|
91
|
+
selenium_page_element.add_childrens(collection_selector, &block)
|
92
|
+
end
|
93
|
+
result
|
94
|
+
end
|
95
|
+
end
|
96
|
+
# rubocop:enable Metrics/MethodLength
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module SeleniumPage
|
4
|
+
# Page
|
5
|
+
class Element
|
6
|
+
# Errors
|
7
|
+
class Errors
|
8
|
+
# WrongBaseElement
|
9
|
+
class WrongBaseElement < StandardError
|
10
|
+
def message
|
11
|
+
"Only 'Selenium::WebDriver::Element' are accepted " \
|
12
|
+
'as base_element parameter'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# WrongDriver
|
17
|
+
class WrongDriver < StandardError
|
18
|
+
def message
|
19
|
+
"Only 'Selenium::WebDriver::Driver' are accepted as driver parameter"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/selenium_page/errors.rb
CHANGED
data/lib/selenium_page/page.rb
CHANGED
@@ -15,10 +15,48 @@ module SeleniumPage
|
|
15
15
|
@url
|
16
16
|
end
|
17
17
|
|
18
|
+
# rubocop:disable Metrics/MethodLength
|
19
|
+
def self.element(element_name, element_selector, &block)
|
20
|
+
raise Errors::UnexpectedElementName unless element_name.is_a? Symbol
|
21
|
+
unless element_selector.is_a? String
|
22
|
+
raise Errors::UnexpectedElementSelector
|
23
|
+
end
|
24
|
+
if instance_methods.include?(element_name)
|
25
|
+
raise Errors::AlreadyDefinedElementName, element_name
|
26
|
+
end
|
27
|
+
|
28
|
+
define_method(element_name) do
|
29
|
+
if block_given?
|
30
|
+
find_element(element_selector, &block)
|
31
|
+
else
|
32
|
+
find_element(element_selector)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.elements(collection_name, collection_selector, &block)
|
38
|
+
raise Errors::UnexpectedElementName unless collection_name.is_a? Symbol
|
39
|
+
unless collection_selector.is_a? String
|
40
|
+
raise Errors::UnexpectedElementSelector
|
41
|
+
end
|
42
|
+
if instance_methods.include?(collection_name)
|
43
|
+
raise Errors::AlreadyDefinedElementName, collection_name
|
44
|
+
end
|
45
|
+
|
46
|
+
define_method(collection_name) do
|
47
|
+
if block_given?
|
48
|
+
find_elements(collection_selector, &block)
|
49
|
+
else
|
50
|
+
find_elements(collection_selector)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
# rubocop:enable Metrics/MethodLength
|
55
|
+
|
18
56
|
def initialize(driver)
|
19
57
|
raise Errors::WrongDriver unless driver.is_a? Selenium::WebDriver::Driver
|
20
58
|
|
21
|
-
@
|
59
|
+
@driver = driver
|
22
60
|
end
|
23
61
|
|
24
62
|
def url
|
@@ -31,7 +69,41 @@ module SeleniumPage
|
|
31
69
|
scheme_and_authority = SeleniumPage.scheme_and_authority
|
32
70
|
raise Errors::SchemeAndAuthorityNotSet unless scheme_and_authority
|
33
71
|
|
34
|
-
@
|
72
|
+
@driver.get scheme_and_authority + self.class.url
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def find_element(element_selector,
|
78
|
+
waiter = Selenium::WebDriver::Wait.new(
|
79
|
+
timeout: SeleniumPage.wait_time
|
80
|
+
), &block)
|
81
|
+
waiter.until do
|
82
|
+
result = SeleniumPage::Element.new(
|
83
|
+
@driver, @driver.find_element(:css, element_selector)
|
84
|
+
)
|
85
|
+
result.add_childrens(element_selector, &block)
|
86
|
+
result
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# rubocop:disable Metrics/MethodLength
|
91
|
+
def find_elements(collection_selector,
|
92
|
+
waiter = Selenium::WebDriver::Wait.new(
|
93
|
+
timeout: SeleniumPage.wait_time
|
94
|
+
), &block)
|
95
|
+
waiter.until do
|
96
|
+
selenium_result = @driver.find_elements(:css, collection_selector)
|
97
|
+
result = []
|
98
|
+
selenium_result.each do |selenium_element|
|
99
|
+
result << SeleniumPage::Element.new(@driver, selenium_element)
|
100
|
+
end
|
101
|
+
result.each do |selenium_page_element|
|
102
|
+
selenium_page_element.add_childrens(collection_selector, &block)
|
103
|
+
end
|
104
|
+
result
|
105
|
+
end
|
35
106
|
end
|
107
|
+
# rubocop:enable Metrics/MethodLength
|
36
108
|
end
|
37
109
|
end
|
@@ -5,6 +5,17 @@ module SeleniumPage
|
|
5
5
|
class Page
|
6
6
|
# Errors
|
7
7
|
class Errors
|
8
|
+
# AlreadyDefinedElementName
|
9
|
+
class AlreadyDefinedElementName < StandardError
|
10
|
+
def initialize(element_name)
|
11
|
+
@element_name = element_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def message
|
15
|
+
"The element '#{@element_name}' is already defined"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
8
19
|
# SchemeAndAuthorityNotSet
|
9
20
|
class SchemeAndAuthorityNotSet < StandardError
|
10
21
|
def message
|
@@ -13,6 +24,20 @@ module SeleniumPage
|
|
13
24
|
end
|
14
25
|
end
|
15
26
|
|
27
|
+
# UnexpectedElementName
|
28
|
+
class UnexpectedElementName < StandardError
|
29
|
+
def message
|
30
|
+
"Only 'Symbol' are accepted as element_name parameter"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# UnexpectedElementSelector
|
35
|
+
class UnexpectedElementSelector < StandardError
|
36
|
+
def message
|
37
|
+
"Only 'String' are accepted as element_selector parameter"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
16
41
|
# UnexpectedUrl
|
17
42
|
class UnexpectedUrl < StandardError
|
18
43
|
def message
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium_page
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Massimiliano De Vivo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: selenium-webdriver
|
@@ -16,20 +16,20 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.
|
19
|
+
version: 3.9.0
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 3.
|
22
|
+
version: 3.9.0
|
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: 3.
|
29
|
+
version: 3.9.0
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 3.
|
32
|
+
version: 3.9.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: chromedriver-helper
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
@@ -56,20 +56,20 @@ dependencies:
|
|
56
56
|
requirements:
|
57
57
|
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: 3.
|
59
|
+
version: 3.6.0
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version: 3.
|
62
|
+
version: 3.6.0
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: 3.
|
69
|
+
version: 3.6.0
|
70
70
|
- - ">="
|
71
71
|
- !ruby/object:Gem::Version
|
72
|
-
version: 3.
|
72
|
+
version: 3.6.0
|
73
73
|
- !ruby/object:Gem::Dependency
|
74
74
|
name: rspec
|
75
75
|
requirement: !ruby/object:Gem::Requirement
|
@@ -96,20 +96,40 @@ dependencies:
|
|
96
96
|
requirements:
|
97
97
|
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
version: 0.
|
99
|
+
version: 0.56.0
|
100
100
|
- - ">="
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 0.
|
102
|
+
version: 0.56.0
|
103
103
|
type: :development
|
104
104
|
prerelease: false
|
105
105
|
version_requirements: !ruby/object:Gem::Requirement
|
106
106
|
requirements:
|
107
107
|
- - "~>"
|
108
108
|
- !ruby/object:Gem::Version
|
109
|
-
version: 0.
|
109
|
+
version: 0.56.0
|
110
110
|
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
|
-
version: 0.
|
112
|
+
version: 0.56.0
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: rubocop-rspec
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - "~>"
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: 1.27.0
|
120
|
+
- - ">="
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: 1.27.0
|
123
|
+
type: :development
|
124
|
+
prerelease: false
|
125
|
+
version_requirements: !ruby/object:Gem::Requirement
|
126
|
+
requirements:
|
127
|
+
- - "~>"
|
128
|
+
- !ruby/object:Gem::Version
|
129
|
+
version: 1.27.0
|
130
|
+
- - ">="
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: 1.27.0
|
113
133
|
- !ruby/object:Gem::Dependency
|
114
134
|
name: simplecov
|
115
135
|
requirement: !ruby/object:Gem::Requirement
|
@@ -160,6 +180,8 @@ files:
|
|
160
180
|
- LICENSE.md
|
161
181
|
- README.md
|
162
182
|
- lib/selenium_page.rb
|
183
|
+
- lib/selenium_page/element.rb
|
184
|
+
- lib/selenium_page/element/errors.rb
|
163
185
|
- lib/selenium_page/errors.rb
|
164
186
|
- lib/selenium_page/page.rb
|
165
187
|
- lib/selenium_page/page/errors.rb
|