selenium_page 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|