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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ab847fdc76365d1ffd7c7fb59a4088b87cfaa5b66745051e644905ef836be483
4
- data.tar.gz: 459b3d3fea8f2ebcad887c082742100d994fc0cceb66e319bd986f28bb9057dd
3
+ metadata.gz: 44333331ba09a124b736b5ed176f43b35090ceeded473e6e81b0656d35d962e5
4
+ data.tar.gz: 114e74733a9d2750efe7adb8e4122b74178fa54515f287283d47641083d5e161
5
5
  SHA512:
6
- metadata.gz: 7110393c893d10dd01cfeef086b9e8565ce20fbff1b16fc2d4eeee7474352317bb3420e6f7d630f2326dd0a631fac14422d44dea238596e73153f07093aa04a5
7
- data.tar.gz: fb9cf871cf2c2f8f468208acb16eaff57734e40946bb8fe79811cb8361fb5d2fc00212b44ad268d32d39b4d8c2ebc9468b51c0814b90c1637a741c3697c39cb0
6
+ metadata.gz: a109add0a1cfc701c6f717950b4327ce8b2c93a92a07802c85502577cdb8b2f9ea46dada96803aeeda8d52bfc2d523245c7925216c869fb0061dac5be6e35b72
7
+ data.tar.gz: 0b5d748859aafa12be5cbaafbe5e79a94687813c6109a6ec591ced13c71cce3d46b0ffcd9dbe04d68441cf2ceecd1b6fbd772ea00ad3e3e10c4a19ffc4a9e82f
@@ -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
@@ -9,5 +9,12 @@ module SeleniumPage
9
9
  "Only 'String' are accepted"
10
10
  end
11
11
  end
12
+
13
+ # UnexpectedWaitTime
14
+ class UnexpectedWaitTime < StandardError
15
+ def message
16
+ "Only 'Numeric' are accepted"
17
+ end
18
+ end
12
19
  end
13
20
  end
@@ -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
- @page = driver
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
- @page.get scheme_and_authority + self.class.url
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.1.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-03-16 00:00:00.000000000 Z
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.8.0
19
+ version: 3.9.0
20
20
  - - ">="
21
21
  - !ruby/object:Gem::Version
22
- version: 3.8.0
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.8.0
29
+ version: 3.9.0
30
30
  - - ">="
31
31
  - !ruby/object:Gem::Version
32
- version: 3.8.0
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.5.0
59
+ version: 3.6.0
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
- version: 3.5.0
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.5.0
69
+ version: 3.6.0
70
70
  - - ">="
71
71
  - !ruby/object:Gem::Version
72
- version: 3.5.0
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.53.0
99
+ version: 0.56.0
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
- version: 0.53.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.53.0
109
+ version: 0.56.0
110
110
  - - ">="
111
111
  - !ruby/object:Gem::Version
112
- version: 0.53.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