page-object 2.1.1 → 2.2

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.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/ChangeLog +14 -2
  4. data/Gemfile +0 -5
  5. data/lib/page-object.rb +6 -11
  6. data/lib/page-object/elements/button.rb +0 -11
  7. data/lib/page-object/elements/check_box.rb +0 -6
  8. data/lib/page-object/elements/div.rb +0 -7
  9. data/lib/page-object/elements/element.rb +13 -119
  10. data/lib/page-object/elements/file_field.rb +0 -6
  11. data/lib/page-object/elements/form.rb +0 -6
  12. data/lib/page-object/elements/hidden_field.rb +0 -6
  13. data/lib/page-object/elements/image.rb +0 -6
  14. data/lib/page-object/elements/label.rb +0 -6
  15. data/lib/page-object/elements/link.rb +0 -10
  16. data/lib/page-object/elements/list_item.rb +0 -6
  17. data/lib/page-object/elements/ordered_list.rb +2 -6
  18. data/lib/page-object/elements/radio_button.rb +0 -6
  19. data/lib/page-object/elements/select_list.rb +1 -5
  20. data/lib/page-object/elements/span.rb +0 -6
  21. data/lib/page-object/elements/table.rb +3 -3
  22. data/lib/page-object/elements/table_cell.rb +0 -6
  23. data/lib/page-object/elements/table_row.rb +3 -3
  24. data/lib/page-object/elements/text_area.rb +0 -6
  25. data/lib/page-object/elements/text_field.rb +0 -6
  26. data/lib/page-object/elements/unordered_list.rb +2 -6
  27. data/lib/page-object/indexed_properties.rb +2 -2
  28. data/lib/page-object/javascript_framework_facade.rb +1 -1
  29. data/lib/page-object/locator_generator.rb +152 -148
  30. data/lib/page-object/page_populator.rb +15 -0
  31. data/lib/page-object/platforms/watir.rb +3 -5
  32. data/lib/page-object/platforms/watir/page_object.rb +12 -20
  33. data/lib/page-object/version.rb +1 -1
  34. data/lib/page-object/widgets.rb +1 -13
  35. data/page-object.gemspec +6 -6
  36. metadata +27 -29
  37. data/lib/page-object/loads_platform.rb +0 -45
  38. data/lib/page-object/platforms.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c7edeb443a2ae4b8e0c752a4fa82fbb542684b22
4
- data.tar.gz: 200d7628d5d45d22936487972e0c7e8499ce9a33
3
+ metadata.gz: 0a9026e5a1dfab04ad9562d3e2c1ff46224809d3
4
+ data.tar.gz: b64e10f88d26956b50be3feb5a41627f40dc2378
5
5
  SHA512:
6
- metadata.gz: 3b1fb48e00b12e3c24e11b8b3c50399339585e0ea3a75d750f975b315885143a425cad12a59f4b6baf7d78ec1d2dda3f50caf734772d5025d9ef550c67f7c1ef
7
- data.tar.gz: bb6e4eed2a1246dfd12c3913e052607d673ee862118caa59148f9c3b22a8c058daba3cca0279d12a6c37c8a667520f9f4d761a7f34178583f7c0396eb56f1df8
6
+ metadata.gz: d780f2a594808da6f2bc24a6560c6a56bff7868600a6d025d91c98e68571c9bb85626c42a47a46983dd213ec9f84576f390f1dec987ee8dcc817d337131d1be7
7
+ data.tar.gz: 5af925dc3bcdf8d3bca259d53f4e88b75b258e7f0601004a02b8f55d533a82eebc25292c016dc5751bd488d303aef25fa96d0cd6dfc661a6c86a2833314733e5
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- ruby-2.3.1
1
+ ruby-2.4.0
data/ChangeLog CHANGED
@@ -1,3 +1,15 @@
1
+ Version 2.2 / 2017-8-4
2
+ * Enhancements
3
+ * when_visible and when_not_visible now wait for element to be present before checking
4
+ * populate_page_with can populate select_list using values (Thanks vveliev)
5
+ * Removed all custom locator mappings
6
+ * Removed platform loading
7
+ * Fixes
8
+ * Moved net-http-persistent to a development dependency
9
+ * Fixed issue with frames, sections, and indexed properties
10
+ * Fixed issue impacting rspec be_visible/be_present DSL
11
+ * Fixed issue with getting content of empty multi-select
12
+
1
13
  Version 2.1.1 / 2017-3-7
2
14
  * Fixes
3
15
  * Fixed issue with import ordering
@@ -60,7 +72,7 @@ Version 1.2.0 / 2016-6-15
60
72
 
61
73
  === Version 1.1.0 / 2015-5-2
62
74
  * Enhancements
63
- * Performance enhancements when initializing elements (Thanks Dane Andersen)
75
+ * Performance enhancements when initializing elements (Thanks Alexis Andersen)
64
76
  * Enabled button elements to return text when using selenium-webdriver.
65
77
  * Added support for :index identifier in indexed properties.
66
78
  * Added page_section and page_sections accessor methods which can specify a page object of elements on another page object.
@@ -75,7 +87,7 @@ Version 1.2.0 / 2016-6-15
75
87
  * Added hashes method to Table to return table contents as a Hash (Thanks Tobi)
76
88
  * Fixed wait_for_expected_title so it detects if the title changes (Thanks Levi Wilson)
77
89
  * Fixes
78
- * Fixed issue that allows access to elements on other indexed properties (Thanks Dane Andersen)
90
+ * Fixed issue that allows access to elements on other indexed properties (Thanks Alexis Andersen)
79
91
  * Removed the method to clear radio buttons. It didn't work on selenium and threw an exception on watir. (Thanks Justin Ko)
80
92
 
81
93
  === Version 1.0.2 / 2014-7-21
data/Gemfile CHANGED
@@ -7,12 +7,7 @@ gem 'growl'
7
7
  gem 'guard-rspec'
8
8
  gem 'listen', '3.0.8' #Last version that supports ruby 2.0
9
9
  gem 'guard-cucumber'
10
- gem 'net-http-persistent'
11
10
  gem 'coveralls', require: false
12
11
 
13
- if ENV['WATIR_BRANCH']
14
- gem 'watir', :git => 'https://github.com/watir/watir.git', :branch => ENV['WATIR_BRANCH']
15
- end
16
-
17
12
 
18
13
  gemspec
data/lib/page-object.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  require 'watir'
2
2
  require 'page-object/version'
3
3
  require 'page-object/accessors'
4
- require 'page-object/platforms'
5
4
  require 'page-object/element_locators'
6
5
  require 'page-object/nested_elements'
7
6
  require 'page-object/page_factory'
@@ -11,6 +10,7 @@ require 'page-object/indexed_properties'
11
10
  require 'page-object/section_collection'
12
11
  require 'page-object/widgets'
13
12
 
13
+ require 'page-object/platforms/watir'
14
14
  require 'page-object/platforms/watir/page_object'
15
15
 
16
16
  #
@@ -42,7 +42,6 @@ require 'page-object/platforms/watir/page_object'
42
42
  # @see PageObject::Accessors to see what class level methods are added to this module at runtime.
43
43
  #
44
44
  module PageObject
45
- include LoadsPlatform
46
45
  include ElementLocators
47
46
  include PagePopulator
48
47
 
@@ -70,14 +69,14 @@ module PageObject
70
69
  def initialize(root, visit=false)
71
70
  initialize_accessors if respond_to?(:initialize_accessors)
72
71
  initialize_browser(root)
73
- goto if visit && respond_to?(:goto)
72
+ goto if visit && self.class.instance_methods(false).include?(:goto)
74
73
  initialize_page if respond_to?(:initialize_page)
75
74
  end
76
75
 
77
76
  def initialize_browser(root)
78
- @root_element = root_element_for root, PageObject::Platforms.get
79
- @browser = browser_for root, PageObject::Platforms.get
80
- include_platform_driver(root)
77
+ @root_element = PageObject::Platforms::Watir.root_element_for root
78
+ @browser = root
79
+ @platform = PageObject::Platforms::Watir::PageObject.new @browser
81
80
  end
82
81
 
83
82
  # @private
@@ -412,11 +411,7 @@ module PageObject
412
411
  private
413
412
 
414
413
  def root
415
- @root_element || browser_root_for(browser, PageObject::Platforms.get)
416
- end
417
-
418
- def include_platform_driver(browser)
419
- @platform = load_platform(browser, PageObject::Platforms.get)
414
+ @root_element || PageObject::Platforms::Watir.browser_root_for(browser)
420
415
  end
421
416
 
422
417
  def call_block(&block)
@@ -3,17 +3,6 @@ module PageObject
3
3
  module Elements
4
4
  class Button < Element
5
5
 
6
- def initialize(element, platform)
7
- @element = element
8
- include_platform_for platform
9
- end
10
-
11
- protected
12
-
13
- def self.watir_finders
14
- super + [:text, :value, :src, :alt, :css]
15
- end
16
-
17
6
  end
18
7
 
19
8
  ::PageObject::Elements.type_to_class[:submit] = ::PageObject::Elements::Button
@@ -23,12 +23,6 @@ module PageObject
23
23
  element.set?
24
24
  end
25
25
 
26
- protected
27
-
28
- def self.watir_finders
29
- super + [:value, :label]
30
- end
31
-
32
26
  end
33
27
 
34
28
  ::PageObject::Elements.type_to_class[:checkbox] = ::PageObject::Elements::CheckBox
@@ -1,13 +1,6 @@
1
1
  module PageObject
2
2
  module Elements
3
3
  class Div < Element
4
-
5
- protected
6
-
7
- def self.watir_finders
8
- super + [:text, :title]
9
- end
10
-
11
4
  end
12
5
 
13
6
  ::PageObject::Elements.tag_to_class[:div] = ::PageObject::Elements::Div
@@ -6,16 +6,16 @@ module PageObject
6
6
  #
7
7
  # Contains functionality that is common across all elements.
8
8
  #
9
- # @see PageObject::Platforms::WatirWebDriver::Element for the Watir version of all common methods
9
+ # @see PageObject::Platforms::Watir::Element for the Watir version of all common methods
10
10
  #
11
11
  class Element
12
12
  include ::PageObject::NestedElements
13
13
 
14
14
  attr_reader :element
15
15
 
16
- def initialize(element, platform)
16
+ def initialize(element)
17
17
  @element = element
18
- include_platform_for platform
18
+ @platform = PageObject::Platforms::Watir::PageObject.new(@element)
19
19
  end
20
20
 
21
21
  #
@@ -42,8 +42,8 @@ module PageObject
42
42
  #
43
43
  def self.plural_form
44
44
  "#{self.to_s.split('::')[-1].
45
- gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
46
- gsub(/([a-z\d])([A-Z])/,'\1_\2').
45
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
46
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
47
47
  tr("-", "_").
48
48
  downcase}s"
49
49
  end
@@ -125,7 +125,7 @@ module PageObject
125
125
  parent = element.parent
126
126
  type = element.type if parent.tag_name.to_sym == :input
127
127
  cls = ::PageObject::Elements.element_class_for(parent.tag_name, type)
128
- cls.new(parent, :platform => :watir)
128
+ cls.new(parent)
129
129
  end
130
130
 
131
131
  #
@@ -134,7 +134,7 @@ module PageObject
134
134
  # @param [Integer] (defaults to: 5) seconds to wait before timing out
135
135
  #
136
136
  def when_present(timeout=::PageObject.default_element_wait)
137
- element.wait_until(timeout: timeout, message: "Element not present in #{timeout} seconds", &:present?)
137
+ element.wait_until(timeout: timeout, message: "Element not present in #{timeout} seconds", &:present?)
138
138
  self
139
139
  end
140
140
 
@@ -154,6 +154,7 @@ module PageObject
154
154
  # @param [Integer] (defaults to: 5) seconds to wait before timing out
155
155
  #
156
156
  def when_visible(timeout=::PageObject.default_element_wait)
157
+ when_present(timeout)
157
158
  element.wait_until(timeout: timeout, message: "Element not visible in #{timeout} seconds", &:visible?)
158
159
  self
159
160
  end
@@ -164,7 +165,8 @@ module PageObject
164
165
  # @param [Integer] (defaults to: 5) seconds to wait before timing out
165
166
  #
166
167
  def when_not_visible(timeout=::PageObject.default_element_wait)
167
- element.wait_while(timeout: timeout, message: "Element still visible after #{timeout} seconds", &:visible?)
168
+ when_present(timeout)
169
+ element.wait_while(timeout: timeout, message: "Element still visible after #{timeout} seconds", &:visible?)
168
170
  end
169
171
 
170
172
  #
@@ -222,22 +224,6 @@ module PageObject
222
224
  {'y' => (location['y'] + (size['height']/2)), 'x' => (location['x'] + (size['width']/2))}
223
225
  end
224
226
 
225
- # @private
226
- def self.watir_identifier_for identifier
227
- if should_build_watir_xpath(identifier)
228
- how = :xpath
229
- what = build_xpath_for(identifier)
230
- return how => what
231
- end
232
- all_identities = {}
233
- identifier.each do |key, value|
234
- each = {key => value}
235
- ident = identifier_for each, watir_finders, watir_mapping
236
- all_identities[ident.keys.first] = ident.values.first
237
- end
238
- all_identities
239
- end
240
-
241
227
  # @private
242
228
  # delegate calls to driver element
243
229
  def method_missing(*args, &block)
@@ -245,99 +231,11 @@ module PageObject
245
231
  element.send m, *args, &block
246
232
  end
247
233
 
248
- protected
249
-
250
- def self.should_build_watir_xpath identifier
251
- ['table', 'span', 'div', 'td', 'li', 'ul', 'ol', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'label', 'area', 'canvas', 'audio', 'video', 'b', 'i'].include? identifier[:tag_name] and identifier[:name]
234
+ def respond_to_missing?(m,*args)
235
+ element.respond_to?(m) || super
252
236
  end
253
237
 
254
- def self.build_xpath_for identifier
255
- tag_locator = identifier.delete(:tag_name)
256
- idx = identifier.delete(:index)
257
- if tag_locator == 'input' and identifier[:type] == 'submit'
258
- identifier.delete(:type)
259
- btn_ident = identifier.clone
260
- if btn_ident[:value]
261
- btn_ident[:text] = btn_ident[:value]
262
- btn_ident.delete(:value)
263
- end
264
- xpath = ".//button"
265
- xpath << "[#{attribute_expression(btn_ident)}]" unless btn_ident.empty?
266
- xpath = "(#{xpath})[#{idx+1}]" if idx
267
- identifier[:type] = %w[button reset submit image]
268
- xpath << " | .//input"
269
- else
270
- xpath = ".//#{tag_locator}"
271
- end
272
- xpath << "[#{attribute_expression(identifier)}]" unless identifier.empty?
273
- xpath = "(#{xpath})[#{idx+1}]" if idx
274
- xpath
275
- end
276
-
277
- def self.attribute_expression(identifier)
278
- identifier.map do |key, value|
279
- if value.kind_of?(Array)
280
- "(" + value.map { |v| equal_pair(key, v) }.join(" or ") + ")"
281
- else
282
- equal_pair(key, value)
283
- end
284
- end.join(" and ")
285
- end
286
-
287
- def self.equal_pair(key, value)
288
- if key == :label
289
- "@id=//label[normalize-space()=#{xpath_string(value)}]/@for"
290
- else
291
- "#{lhs_for(key)}=#{xpath_string(value)}"
292
- end
293
- end
294
-
295
- def self.lhs_for(key)
296
- case key
297
- when :text, 'text'
298
- 'normalize-space()'
299
- when :href
300
- 'normalize-space(@href)'
301
- else
302
- "@#{key.to_s.gsub("_", "-")}"
303
- end
304
- end
305
-
306
- def self.xpath_string(value)
307
- if value.include? "'"
308
- parts = value.split("'", -1).map { |part| "'#{part}'" }
309
- string = parts.join(%{,"'",})
310
- "concat(#{string})"
311
- else
312
- "'#{value}'"
313
- end
314
- end
315
-
316
- def self.identifier_for identifier, find_by, find_by_mapping
317
- how, what = identifier.keys.first, identifier.values.first
318
- return how => what if find_by.include? how or how == :tag_name
319
- return find_by_mapping[how] => what if find_by_mapping[how]
320
- identifier
321
- end
322
-
323
- def self.watir_finders
324
- [:class, :id, :index, :name, :xpath]
325
- end
326
-
327
- def self.watir_mapping
328
- {}
329
- end
330
-
331
- def include_platform_for platform
332
- platform_information = PageObject::Platforms.get
333
- raise ArgumentError,"Expected hash with at least a key :platform for platform information! (#{platform.inspect})" unless platform.class == Hash && platform.has_key?(:platform)
334
- platform_name = platform[:platform]
335
-
336
- raise ArgumentError, "Unknown platform #{platform_name}! Expect platform to be one of the following: #{platform_information.keys.inspect}" unless platform_information.keys.include?(platform_name)
337
- base_platform_class = "#{platform_information[platform_name]}::"
338
-
339
- @platform = constantize_classname(base_platform_class+ "PageObject").new(@element)
340
- end
238
+ protected
341
239
 
342
240
  def to_ary
343
241
  nil
@@ -355,10 +253,6 @@ module PageObject
355
253
  false
356
254
  end
357
255
 
358
- def constantize_classname name
359
- name.split("::").inject(Object) { |k,n| k.const_get(n) }
360
- end
361
-
362
256
  end
363
257
  end
364
258
  end
@@ -10,12 +10,6 @@ module PageObject
10
10
  element.set(new_value)
11
11
  end
12
12
 
13
- protected
14
-
15
- def self.watir_finders
16
- super + [:title, :label]
17
- end
18
-
19
13
  end
20
14
 
21
15
  ::PageObject::Elements.type_to_class[:file] = ::PageObject::Elements::FileField
@@ -3,12 +3,6 @@ module PageObject
3
3
  module Elements
4
4
  class Form < Element
5
5
 
6
- protected
7
-
8
- def self.watir_finders
9
- super + [:action]
10
- end
11
-
12
6
  end
13
7
 
14
8
  ::PageObject::Elements.tag_to_class[:form] = ::PageObject::Elements::Form
@@ -6,12 +6,6 @@ module PageObject
6
6
  raise "click is not available on the hidden field element"
7
7
  end
8
8
 
9
- protected
10
-
11
- def self.watir_finders
12
- super + [:text, :value]
13
- end
14
-
15
9
  end
16
10
 
17
11
  ::PageObject::Elements.type_to_class[:hidden] = ::PageObject::Elements::HiddenField
@@ -16,12 +16,6 @@ module PageObject
16
16
  element.height
17
17
  end
18
18
 
19
- protected
20
-
21
- def self.watir_finders
22
- super + [:alt, :src]
23
- end
24
-
25
19
  end
26
20
 
27
21
  ::PageObject::Elements.tag_to_class[:img] = ::PageObject::Elements::Image
@@ -2,12 +2,6 @@ module PageObject
2
2
  module Elements
3
3
  class Label < Element
4
4
 
5
- protected
6
-
7
- def self.watir_finders
8
- super + [:text]
9
- end
10
-
11
5
  end
12
6
 
13
7
  ::PageObject::Elements.tag_to_class[:label] = ::PageObject::Elements::Label
@@ -3,16 +3,6 @@ module PageObject
3
3
  module Elements
4
4
  class Link < Element
5
5
 
6
- protected
7
-
8
- def self.watir_finders
9
- super + [:href, :text, :css, :title]
10
- end
11
-
12
- def self.watir_mapping
13
- super.merge({:link => :text, :link_text => :text})
14
- end
15
-
16
6
  end
17
7
 
18
8
  ::PageObject::Elements.tag_to_class[:a] = ::PageObject::Elements::Link