page-object 2.1.1 → 2.2

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