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 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