watir_pump 0.2.1 → 0.3.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
  SHA1:
3
- metadata.gz: aabfc0131d87382783e34ce50c0d8d2d5300e4b3
4
- data.tar.gz: 893135fab092562d453dd8cf8896dcd1de4e0b8a
3
+ metadata.gz: 7ffaf36b627fe9a96a2e049a78722425468ab4c0
4
+ data.tar.gz: 22d9a1bab82fb13eb3b5b7e7a469c9fb10798da7
5
5
  SHA512:
6
- metadata.gz: 5f2da34a3a1c0955dae1303c30566441973e110241e0346e1e1dd57d8e592fc1ed04aebb51f78df3ede6fd6419915065b53413d42c59a041d2c3ccacde99b9c6
7
- data.tar.gz: 05cb2d72b0540aad1848dfa42ca080407efadda83800615942d3dcd426eab80253e4821d52b51383b18a46b2332d7376bb76708781eec4a106a8619a5443b484
6
+ metadata.gz: f0ba097dc075aeb94799110920f644fc890fc712c101997eb53e209b647fa74ea4a95e93277d3ae6156553e270b8c157f8baa4e4e1d7729c5d9b897d1fca5461
7
+ data.tar.gz: e80ed1f00a227ef55b67137788e2782a25192f24b3c85915d7897dcff5ba063b2befac8c69160ac59c82870acec82c8a0d0b68b20cb7a832b8cb29cbb4ac68ee
@@ -1,12 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'set'
4
+ require 'forwardable'
5
+
3
6
  require_relative 'component_collection'
4
7
  require_relative 'decorated_element'
5
8
  require_relative 'constants'
6
- require 'forwardable'
9
+ require_relative 'components/radio_group'
10
+ require_relative 'components/checkbox_group'
11
+ require_relative 'components/dropdown_list'
7
12
 
8
13
  module WatirPump
9
- class Component
14
+ class Component # rubocop:disable Metrics/ClassLength
10
15
  extend Forwardable
11
16
 
12
17
  include Constants
@@ -20,39 +25,73 @@ module WatirPump
20
25
  # Proxy methods for HTML tags
21
26
  Watir::Container.instance_methods(false).each do |watir_method|
22
27
  define_method watir_method do |name, *args|
28
+ return if public_methods.include? name
23
29
  define_method(name) do |*loc_args|
24
- if args&.first.is_a? Proc
25
- instance_exec(*loc_args, &args.first)
26
- else
27
- root.send(watir_method, *args)
28
- end
30
+ find_element(watir_method, args, loc_args)
29
31
  end
30
32
  end
31
33
  end
32
34
 
33
- # Methods for element content readers
34
- # span_reader, :title, id: asd
35
- # will create methods :title and :title_element
36
- # where :title is a shortcut for :title_element.text
37
- Constants::READABLES.each do |watir_method|
35
+ include Components::RadioGroup
36
+ include Components::CheckboxGroup
37
+ include Components::DropdownList
38
+
39
+ def self.define_reader(watir_method)
38
40
  define_method "#{watir_method}_reader" do |name, *args|
39
41
  send(watir_method, "#{name}_element", *args)
40
42
  define_method(name) do
41
- send("#{name}_element").text
43
+ @form_fields << name
44
+ el = send("#{name}_element")
45
+ %w[input textarea].include?(el.tag_name) ? el.value : el.text
42
46
  end
43
47
  end
44
48
  end
45
49
 
46
- # Methods for element content writers
47
- Constants::WRITABLES.each do |watir_method|
50
+ def self.define_writer(watir_method)
48
51
  define_method "#{watir_method}_writer" do |name, *args|
49
52
  send(watir_method, "#{name}_element", *args)
50
53
  define_method("#{name}=") do |value|
54
+ @form_fields << name
51
55
  send("#{name}_element").set value
52
56
  end
53
57
  end
54
58
  end
55
59
 
60
+ def self.define_accessor(watir_method)
61
+ define_method "#{watir_method}_accessor" do |name, *args|
62
+ send(watir_method, "#{name}_element", *args)
63
+ # reader, TODO: DRY it up
64
+ define_method(name) do
65
+ @form_fields << name
66
+ el = send("#{name}_element")
67
+ %w[input textarea].include?(el.tag_name) ? el.value : el.text
68
+ end
69
+ # writer, TODO: DRY it up
70
+ define_method("#{name}=") do |value|
71
+ @form_fields << name
72
+ send("#{name}_element").set value
73
+ end
74
+ end
75
+ end
76
+
77
+ # Methods for element content readers
78
+ # span_reader, :title, id: asd
79
+ # will create methods :title and :title_element
80
+ # where :title is a shortcut for :title_element.text
81
+ Constants::READABLES.each do |watir_method|
82
+ define_reader(watir_method)
83
+ end
84
+
85
+ # Methods for element content writers
86
+ Constants::WRITABLES.each do |watir_method|
87
+ define_writer(watir_method)
88
+ end
89
+
90
+ # Methods for element content accessors
91
+ (Constants::WRITABLES & Constants::READABLES).each do |watir_method|
92
+ define_accessor(watir_method)
93
+ end
94
+
56
95
  # Methods for element clickers
57
96
  Constants::CLICKABLES.each do |watir_method|
58
97
  define_method "#{watir_method}_clicker" do |name, *args|
@@ -68,6 +107,8 @@ module WatirPump
68
107
  instance_exec(*args, &p)
69
108
  end
70
109
  end
110
+ alias element query
111
+ alias elements query
71
112
 
72
113
  def region(name, loc_method = nil, *loc_args, &blk)
73
114
  klass = Class.new(Component) { instance_exec(&blk) }
@@ -76,22 +117,20 @@ module WatirPump
76
117
 
77
118
  def component(name, klass, loc_method = nil, *loc_args)
78
119
  define_method(name) do |*args|
79
- node = if loc_method.is_a? Proc
80
- instance_exec(*args, &loc_method)
81
- else
82
- loc_method.nil? ? root : root.send(loc_method, *loc_args)
83
- end
120
+ node = find_element_raw(watir_method: loc_method,
121
+ watir_method_args: loc_args,
122
+ code: loc_method,
123
+ code_args: args)
84
124
  klass.new(browser, self, node)
85
125
  end
86
126
  end
87
127
 
88
128
  def components(name, klass, loc_method = nil, *loc_args)
89
129
  define_method(name) do |*args|
90
- nodes = if loc_method.is_a? Proc
91
- instance_exec(*args, &loc_method)
92
- else
93
- root.send(loc_method, *loc_args)
94
- end
130
+ nodes = find_element_raw(watir_method: loc_method,
131
+ watir_method_args: loc_args,
132
+ code: loc_method,
133
+ code_args: args)
95
134
  ComponentCollection.new(nodes.map { |n| klass.new(browser, self, n) })
96
135
  end
97
136
  end
@@ -111,6 +150,7 @@ module WatirPump
111
150
  @browser = browser
112
151
  @parent = parent
113
152
  @root_node = root_node
153
+ @form_fields = Set.new
114
154
  end
115
155
 
116
156
  def root
@@ -121,6 +161,33 @@ module WatirPump
121
161
  end
122
162
  alias node root
123
163
 
164
+ def fill_form(data)
165
+ data.to_h.each_pair do |k, v|
166
+ send("#{k}=", v)
167
+ end
168
+ end
169
+
170
+ def form_data
171
+ {}.tap do |h|
172
+ @form_fields.map { |field| h[field] = send(field) }
173
+ end
174
+ end
175
+
176
+ def find_element(watir_method, args, loc_args = nil)
177
+ find_element_raw(watir_method: watir_method,
178
+ watir_method_args: args,
179
+ code: args.first,
180
+ code_args: loc_args)
181
+ end
182
+
183
+ def find_element_raw(watir_method: nil, watir_method_args: nil, code: nil, code_args: nil) # rubocop:disable Metrics/LineLength
184
+ if code.is_a? Proc
185
+ instance_exec(*code_args, &code)
186
+ elsif watir_method
187
+ root.send(watir_method, *watir_method_args)
188
+ end
189
+ end
190
+
124
191
  def method_missing(name, *args)
125
192
  # delegate missing methods to current RSpec example if set
126
193
  example = WatirPump.config.current_example
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WatirPump
4
+ module Components
5
+ module CheckboxGroup
6
+ def checkbox_writer(name, *args) # rubocop:disable Metrics/AbcSize
7
+ define_method "#{name}=" do |values|
8
+ @form_fields << name
9
+ values = Array(values)
10
+ # <label>value<input /></label>
11
+ list = find_element(:checkboxes, args)
12
+ values.each do |value|
13
+ if list.first.parent.tag_name == 'label'
14
+ list.find { |el| el.parent.text == value }.set
15
+ else
16
+ # <label for='a'>value</label><input id='a' />
17
+ list.find { |el| el.id == root.label(text: value).for }.set
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def checkbox_reader(name, *args) # rubocop:disable Metrics/AbcSize
24
+ define_method name do
25
+ @form_fields << name
26
+ selected = find_element(:checkboxes, args).select(&:set?)
27
+ return [] unless selected
28
+ if selected.first&.parent&.tag_name == 'label'
29
+ return selected.map { |el| el.parent.text }
30
+ end
31
+ selected.map { |el| root.label(for: el.id).text }
32
+ end
33
+ end
34
+
35
+ def checkbox_accessor(name, *args)
36
+ checkbox_reader(name, *args)
37
+ checkbox_writer(name, *args)
38
+ end
39
+ alias checkbox_group checkbox_accessor
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WatirPump
4
+ module Components
5
+ module DropdownList
6
+ def select_reader(name, *args)
7
+ define_method(name) do
8
+ @form_fields << name
9
+ select = find_element(:select, args)
10
+ selected = select.selected_options
11
+ return select.multiple? ? selected.map(&:text) : selected.first.text
12
+ end
13
+ end
14
+
15
+ def select_writer(name, *args)
16
+ define_method("#{name}=") do |values|
17
+ @form_fields << name
18
+ select = find_element(:select, args)
19
+ return select.select(*values)
20
+ end
21
+ end
22
+
23
+ def select_accessor(name, *args)
24
+ select_reader(name, *args)
25
+ select_writer(name, *args)
26
+ end
27
+ alias dropdown_list select_accessor
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WatirPump
4
+ module Components
5
+ module RadioGroup
6
+ def radio_reader(name, *args)
7
+ define_method name do |*loc_args|
8
+ @form_fields << name
9
+ list = find_element(:radios, args, loc_args)
10
+ selected = list.find(&:set?)
11
+ if selected
12
+ return selected.parent.text if selected&.parent&.tag_name == 'label'
13
+ return root.label(for: selected.id).text
14
+ end
15
+ end
16
+ end
17
+
18
+ def radio_writer(name, *args) # rubocop:disable Metrics/AbcSize
19
+ define_method "#{name}=" do |value|
20
+ @form_fields << name
21
+ list = find_element(:radios, args)
22
+ # <label>value<input /></label>
23
+ if list.first.parent.tag_name == 'label'
24
+ list.find { |el| el.parent.text == value }.set
25
+ else
26
+ # <label for='a'>value</label><input id='a' />
27
+ list.find { |el| el.id == root.label(text: value).for }.set
28
+ end
29
+ end
30
+ end
31
+
32
+ def radio_accessor(name, *args)
33
+ radio_reader(name, *args)
34
+ radio_writer(name, *args)
35
+ end
36
+ alias radio_group radio_accessor
37
+ end
38
+ end
39
+ end
@@ -16,7 +16,7 @@ module WatirPump
16
16
 
17
17
  WRITABLES = %i[
18
18
  text_field
19
- text_area
19
+ textarea
20
20
  ].freeze
21
21
 
22
22
  READABLES = %i[
@@ -25,6 +25,8 @@ module WatirPump
25
25
  p
26
26
  link
27
27
  td
28
+ text_field
29
+ textarea
28
30
  h1
29
31
  h2
30
32
  h3
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: watir_pump
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartek Wilczek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-14 00:00:00.000000000 Z
11
+ date: 2018-05-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -131,6 +131,9 @@ files:
131
131
  - lib/watir_pump.rb
132
132
  - lib/watir_pump/component.rb
133
133
  - lib/watir_pump/component_collection.rb
134
+ - lib/watir_pump/components/checkbox_group.rb
135
+ - lib/watir_pump/components/dropdown_list.rb
136
+ - lib/watir_pump/components/radio_group.rb
134
137
  - lib/watir_pump/constants.rb
135
138
  - lib/watir_pump/decorated_element.rb
136
139
  - lib/watir_pump/page.rb