page-object 1.1.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/ChangeLog +9 -0
  4. data/Gemfile +1 -0
  5. data/features/section.feature +4 -0
  6. data/features/step_definitions/section_steps.rb +10 -1
  7. data/lib/page-object.rb +16 -8
  8. data/lib/page-object/accessors.rb +2 -2
  9. data/lib/page-object/elements/button.rb +0 -7
  10. data/lib/page-object/elements/canvas.rb +1 -13
  11. data/lib/page-object/elements/check_box.rb +0 -12
  12. data/lib/page-object/elements/element.rb +52 -9
  13. data/lib/page-object/elements/file_field.rb +0 -12
  14. data/lib/page-object/elements/form.rb +0 -12
  15. data/lib/page-object/elements/image.rb +0 -12
  16. data/lib/page-object/elements/link.rb +0 -12
  17. data/lib/page-object/elements/ordered_list.rb +0 -13
  18. data/lib/page-object/elements/radio_button.rb +0 -12
  19. data/lib/page-object/elements/select_list.rb +0 -13
  20. data/lib/page-object/elements/table.rb +0 -13
  21. data/lib/page-object/elements/table_row.rb +0 -13
  22. data/lib/page-object/elements/text_area.rb +0 -14
  23. data/lib/page-object/elements/text_field.rb +0 -12
  24. data/lib/page-object/elements/unordered_list.rb +0 -12
  25. data/lib/page-object/elements/video.rb +0 -10
  26. data/lib/page-object/platforms/selenium_webdriver/element.rb +1 -1
  27. data/lib/page-object/platforms/selenium_webdriver/page_object.rb +26 -5
  28. data/lib/page-object/platforms/selenium_webdriver/select_list.rb +1 -1
  29. data/lib/page-object/platforms/selenium_webdriver/table.rb +1 -1
  30. data/lib/page-object/platforms/selenium_webdriver/table_row.rb +1 -1
  31. data/lib/page-object/platforms/watir_webdriver/element.rb +9 -2
  32. data/lib/page-object/platforms/watir_webdriver/ordered_list.rb +1 -1
  33. data/lib/page-object/platforms/watir_webdriver/page_object.rb +25 -4
  34. data/lib/page-object/platforms/watir_webdriver/select_list.rb +1 -1
  35. data/lib/page-object/platforms/watir_webdriver/table.rb +1 -1
  36. data/lib/page-object/platforms/watir_webdriver/table_row.rb +1 -1
  37. data/lib/page-object/platforms/watir_webdriver/unordered_list.rb +1 -1
  38. data/lib/page-object/section_collection.rb +16 -0
  39. data/lib/page-object/version.rb +1 -1
  40. data/lib/page-object/widgets.rb +14 -36
  41. data/spec/page-object/elements/canvas_spec.rb +3 -2
  42. data/spec/page-object/elements/ordered_list_spec.rb +2 -2
  43. data/spec/page-object/elements/select_list_spec.rb +2 -2
  44. data/spec/page-object/elements/unordered_list_spec.rb +2 -2
  45. data/spec/page-object/elements/video_spec.rb +12 -6
  46. data/spec/page-object/page-object_spec.rb +51 -23
  47. data/spec/page-object/page_section_spec.rb +9 -2
  48. data/spec/page-object/watir_accessors_spec.rb +1 -0
  49. metadata +4 -4
  50. data/lib/page-object/sections.rb +0 -29
@@ -22,17 +22,18 @@ describe PageObject::Elements::Canvas do
22
22
 
23
23
  context "implementation" do
24
24
  let(:canvas_element) { double('canvas_element') }
25
+ let(:wd) { double('wd') }
25
26
 
26
27
  context "when using selenium" do
27
28
  let(:selenium_canvas) { PageObject::Elements::Canvas.new(canvas_element, :platform => :selenium_webdriver) }
28
29
 
29
30
  it "should know its width" do
30
- expect(canvas_element).to receive(:attribute).with(:width).and_return("400")
31
+ expect(canvas_element).to receive(:size).and_return({'width' => 400})
31
32
  expect(selenium_canvas.width).to eql 400
32
33
  end
33
34
 
34
35
  it "should know its height" do
35
- expect(canvas_element).to receive(:attribute).with(:height).and_return("100")
36
+ expect(canvas_element).to receive(:size).and_return({'height' => 100})
36
37
  expect(selenium_canvas.height).to eql 100
37
38
  end
38
39
  end
@@ -30,14 +30,14 @@ describe PageObject::Elements::OrderedList do
30
30
  context "for watir" do
31
31
  it "should return a list item when indexed" do
32
32
  ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :watir_webdriver)
33
- expect(ol_element).to receive(:find_elements).
33
+ expect(ol_element).to receive(:ols).
34
34
  and_return([ol_element, ol_element])
35
35
  ol[1]
36
36
  end
37
37
 
38
38
  it "should know how many list items it contains" do
39
39
  ol = PageObject::Elements::OrderedList.new(ol_element, :platform => :watir_webdriver)
40
- expect(ol_element).to receive(:find_elements).and_return([ol_element])
40
+ expect(ol_element).to receive(:ols).and_return([ol_element])
41
41
  expect(ol.items).to eql 1
42
42
  end
43
43
 
@@ -43,12 +43,12 @@ describe PageObject::Elements::SelectList do
43
43
  let(:watir_sel_list) { PageObject::Elements::SelectList.new(sel_list, :platform => :watir_webdriver) }
44
44
 
45
45
  it "should return an option when indexed" do
46
- expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
46
+ expect(sel_list).to receive(:options).with(no_args).and_return(opts)
47
47
  expect(watir_sel_list[0]).to be_instance_of PageObject::Elements::Option
48
48
  end
49
49
 
50
50
  it "should return an array of options" do
51
- expect(sel_list).to receive(:find_elements).with(:xpath, ".//child::option").and_return(opts)
51
+ expect(sel_list).to receive(:options).with(no_args).and_return(opts)
52
52
  expect(watir_sel_list.options.size).to eql 2
53
53
  end
54
54
 
@@ -30,14 +30,14 @@ describe PageObject::Elements::UnorderedList do
30
30
  context "for watir" do
31
31
  it "should return a list item when indexed" do
32
32
  ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :watir_webdriver)
33
- allow(ul_element).to receive(:find_elements).and_return(ul_element)
33
+ allow(ul_element).to receive(:uls).and_return(ul_element)
34
34
  expect(ul_element).to receive(:[])
35
35
  ul[1]
36
36
  end
37
37
 
38
38
  it "should know how many items it contains" do
39
39
  ul = PageObject::Elements::UnorderedList.new(ul_element, :platform => :watir_webdriver)
40
- allow(ul_element).to receive(:find_elements).and_return([ul_element])
40
+ allow(ul_element).to receive(:uls).and_return([ul_element])
41
41
  expect(ul.items).to eql 1
42
42
  end
43
43
 
@@ -1,27 +1,33 @@
1
1
  require 'spec_helper'
2
2
  require 'page-object/elements'
3
3
 
4
- describe PageObject::Elements::ListItem do
4
+ describe PageObject::Elements::Video do
5
5
 
6
- let(:video) { PageObject::Elements::Video.new(double(''), :platform => :watir_webdriver) }
6
+ let(:video) { PageObject::Elements::Video.new(platform, :platform => :watir_webdriver) }
7
+ let(:platform) { double('platform')}
8
+ let(:wd) { double('wd') }
9
+
10
+ before do
11
+ allow(platform).to receive(:wd).and_return wd
12
+ end
7
13
 
8
14
  it "should return height when present" do
9
- expect(video).to receive(:attribute).with(:height).and_return("20")
15
+ expect(wd).to receive(:size).and_return('height' => 20)
10
16
  expect(video.height).to eq(20)
11
17
  end
12
18
 
13
19
  it "should not return height when not present" do
14
- expect(video).to receive(:attribute).with(:height).and_return(nil)
20
+ expect(wd).to receive(:size).and_return({})
15
21
  expect(video.height).to eq(nil)
16
22
  end
17
23
 
18
24
  it "should return width when present" do
19
- expect(video).to receive(:attribute).with(:width).and_return("20")
25
+ expect(wd).to receive(:size).and_return('width' => 20)
20
26
  expect(video.width).to eq(20)
21
27
  end
22
28
 
23
29
  it "should not return width when not present" do
24
- expect(video).to receive(:attribute).with(:width).and_return(nil)
30
+ expect(wd).to receive(:size).and_return({})
25
31
  expect(video.width).to eq(nil)
26
32
  end
27
33
  end
@@ -86,17 +86,17 @@ describe PageObject do
86
86
  expect(selenium_page_object.platform).to be_kind_of PageObject::Platforms::SeleniumWebDriver::PageObject
87
87
  end
88
88
  end
89
-
89
+
90
90
  context "when created with a non_bundled adapter" do
91
91
  let(:custom_adapter) { mock_adapter(:custom_browser, CustomPlatform) }
92
-
92
+
93
93
  it "should be an instance of whatever that objects adapter is" do
94
94
  mock_adapters({:custom_adapter=>custom_adapter})
95
95
  custom_page_object = PageObjectTestPageObject.new(:custom_browser)
96
96
  expect(custom_page_object.platform).to be custom_adapter.create_page_object
97
97
  end
98
98
  end
99
-
99
+
100
100
  context "when created with an object we do not understand" do
101
101
  it "should throw an error" do
102
102
  expect {
@@ -112,17 +112,17 @@ describe PageObject do
112
112
  expect(watir_page_object.platform).to receive(:attach_to_window)
113
113
  watir_page_object.attach_to_window("blah")
114
114
  end
115
-
115
+
116
116
  it "should call initialize_page if it exists" do
117
117
  class CallbackPage
118
118
  include PageObject
119
119
  attr_reader :initialize_page_called
120
-
120
+
121
121
  def initialize_page
122
122
  @initialize_page_called = true
123
123
  end
124
124
  end
125
-
125
+
126
126
  @page = CallbackPage.new(watir_browser)
127
127
  expect(@page.initialize_page_called).to be true
128
128
  end
@@ -165,8 +165,36 @@ describe PageObject do
165
165
  expect(watir_browser).to receive(:type).and_return(:submit)
166
166
  expect(watir_page_object.element_with_focus.class).to eql PageObject::Elements::Button
167
167
  end
168
+
169
+ context "when sent a missing method" do
170
+ it "should not respond to it if the @root_element doesn't exist" do
171
+ # nil responds to `to_i`, @root_element is nil, but the page object doesn't respond
172
+ expect(nil).to respond_to :to_i
173
+ expect(watir_page_object.instance_variable_get(:@root_element)).to be nil
174
+ expect(watir_page_object).not_to respond_to :to_i
175
+ expect { watir_page_object.to_i }.to raise_error NoMethodError
176
+ end
177
+
178
+ it "should respond to it if the @root_element exists and responds" do
179
+ # sanity checks
180
+ expect(watir_page_object.instance_variable_get(:@root_element)).to be nil
181
+ expect(watir_page_object).not_to respond_to :bar
182
+ expect(watir_page_object).not_to respond_to :baz
183
+ # set @root_element
184
+ class Foo; def bar; :bar_called; end; private; def baz; end; end
185
+ watir_page_object.instance_variable_set(:@root_element, Foo.new)
186
+ # test
187
+ expect(watir_page_object).to respond_to :bar
188
+ expect(watir_page_object).not_to respond_to :baz
189
+ expect(watir_page_object.bar).to eq :bar_called
190
+ expect { watir_page_object.baz }.to raise_error NoMethodError
191
+ # can't get to private methods
192
+ expect(watir_page_object.respond_to?(:baz, true)).to be false
193
+ expect { watir_page_object.send(:baz) }.to raise_error NoMethodError
194
+ end
195
+ end
168
196
  end
169
-
197
+
170
198
  context "when using WatirPageObject" do
171
199
  it "should display the page text" do
172
200
  expect(watir_browser).to receive(:element).and_return(watir_browser)
@@ -235,24 +263,24 @@ describe PageObject do
235
263
  expect(watir_browser).to receive(:execute_script).and_return("abc")
236
264
  expect(watir_page_object.execute_script("333")).to eql "abc"
237
265
  end
238
-
266
+
239
267
  it "should convert a modal popup to a window" do
240
268
  expect(watir_browser).to receive(:execute_script)
241
269
  watir_page_object.modal_dialog {}
242
270
  end
243
-
271
+
244
272
  it "should switch to a new window with a given title" do
245
273
  expect(watir_browser).to receive(:window).with(:title => /My\ Title/).and_return(watir_browser)
246
274
  expect(watir_browser).to receive(:use)
247
275
  watir_page_object.attach_to_window(:title => "My Title")
248
276
  end
249
-
277
+
250
278
  it "should switch to a new window with a given url" do
251
279
  expect(watir_browser).to receive(:window).with(:url => /success\.html/).and_return(watir_browser)
252
280
  expect(watir_browser).to receive(:use)
253
281
  watir_page_object.attach_to_window(:url => "success.html")
254
282
  end
255
-
283
+
256
284
  it "should refresh the page contents" do
257
285
  expect(watir_browser).to receive(:refresh)
258
286
  watir_page_object.refresh
@@ -267,18 +295,18 @@ describe PageObject do
267
295
  expect(watir_browser).to receive(:forward)
268
296
  watir_page_object.forward
269
297
  end
270
-
298
+
271
299
  it "should know its' current url" do
272
300
  expect(watir_browser).to receive(:url).and_return("cheezyworld.com")
273
301
  expect(watir_page_object.current_url).to eql "cheezyworld.com"
274
302
  end
275
-
303
+
276
304
  it "should know how to clear all of the cookies from the browser" do
277
305
  expect(watir_browser).to receive(:cookies).and_return(watir_browser)
278
306
  expect(watir_browser).to receive(:clear)
279
307
  watir_page_object.clear_cookies
280
308
  end
281
-
309
+
282
310
  it "should be able to save a screenshot" do
283
311
  expect(watir_browser).to receive(:wd).and_return(watir_browser)
284
312
  expect(watir_browser).to receive(:save_screenshot)
@@ -342,12 +370,12 @@ describe PageObject do
342
370
  selenium_page_object.prompt("blah") do
343
371
  end
344
372
  end
345
-
373
+
346
374
  it "should convert a modal popup to a window" do
347
375
  expect(selenium_browser).to receive(:execute_script)
348
376
  selenium_page_object.modal_dialog {}
349
377
  end
350
-
378
+
351
379
  it "should execute javascript on the browser" do
352
380
  expect(selenium_browser).to receive(:execute_script).and_return("abc")
353
381
  expect(selenium_page_object.execute_script("333")).to eql "abc"
@@ -360,7 +388,7 @@ describe PageObject do
360
388
  expect(selenium_browser).to receive(:title).and_return("My Title")
361
389
  selenium_page_object.attach_to_window(:title => "My Title")
362
390
  end
363
-
391
+
364
392
  it "should switch to a new window with a given url" do
365
393
  expect(selenium_browser).to receive(:window_handles).and_return(["win1"])
366
394
  expect(selenium_browser).to receive(:switch_to).twice.and_return(selenium_browser)
@@ -368,36 +396,36 @@ describe PageObject do
368
396
  expect(selenium_browser).to receive(:current_url).and_return("page.html")
369
397
  selenium_page_object.attach_to_window(:url => "page.html")
370
398
  end
371
-
399
+
372
400
  it "should refresh the page contents" do
373
401
  expect(selenium_browser).to receive(:navigate).and_return(selenium_browser)
374
402
  expect(selenium_browser).to receive(:refresh)
375
403
  selenium_page_object.refresh
376
404
  end
377
-
405
+
378
406
  it "should know how to go back" do
379
407
  expect(selenium_browser).to receive(:navigate).and_return(selenium_browser)
380
408
  expect(selenium_browser).to receive(:back)
381
409
  selenium_page_object.back
382
410
  end
383
-
411
+
384
412
  it "should know how to go forward" do
385
413
  expect(selenium_browser).to receive(:navigate).and_return(selenium_browser)
386
414
  expect(selenium_browser).to receive(:forward)
387
415
  selenium_page_object.forward
388
416
  end
389
-
417
+
390
418
  it "should know its' current url" do
391
419
  expect(selenium_browser).to receive(:current_url).and_return("cheezyworld.com")
392
420
  expect(selenium_page_object.current_url).to eql "cheezyworld.com"
393
421
  end
394
-
422
+
395
423
  it "should clear all of the cookies from the browser" do
396
424
  expect(selenium_browser).to receive(:manage).and_return(selenium_browser)
397
425
  expect(selenium_browser).to receive(:delete_all_cookies)
398
426
  selenium_page_object.clear_cookies
399
427
  end
400
-
428
+
401
429
  it "should be able to save a screenshot" do
402
430
  expect(selenium_browser).to receive(:save_screenshot)
403
431
  selenium_page_object.save_screenshot("test.png")
@@ -53,7 +53,14 @@ describe PageObject::SectionCollection do
53
53
  ContainedItem = Struct.new(:type, :name)
54
54
  let(:section_collection) do
55
55
  contained_items = [ContainedItem.new(:sandwich, :reuben), ContainedItem.new(:soup, :lobster_bisque), ContainedItem.new(:sandwich, :dagwood)]
56
- PageObject::SectionCollection.new(contained_items)
56
+ PageObject::SectionCollection[*contained_items]
57
+ end
58
+ it 'should inherit from Array' do
59
+ expect(PageObject::SectionCollection.superclass).to eq Array
60
+ end
61
+ it 'should have functioning array methods' do
62
+ expect(section_collection.methods).to include *Array.instance_methods
63
+ expect(section_collection.last.type).to eq :sandwich
57
64
  end
58
65
  it 'should be indexed to the sections' do
59
66
  expect(section_collection[0]).to be_an_instance_of ContainedItem
@@ -70,4 +77,4 @@ describe PageObject::SectionCollection do
70
77
  it 'should find all sections matching a value' do
71
78
  expect(section_collection.select_by(type: :sandwich).map(&:type)).to eq [:sandwich, :sandwich]
72
79
  end
73
- end
80
+ end
@@ -284,6 +284,7 @@ describe PageObject::Accessors do
284
284
 
285
285
  def mock_driver_for(tag)
286
286
  expect(watir_browser).to receive(tag).with(:index => 0).and_return(watir_browser)
287
+ allow(watir_browser).to receive(:exists?).with(no_args)
287
288
  end
288
289
 
289
290
  it "should work with a text_field" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: page-object
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Morgan
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-01-07 00:00:00.000000000 Z
12
+ date: 2016-06-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: watir-webdriver
@@ -357,7 +357,7 @@ files:
357
357
  - lib/page-object/platforms/watir_webdriver/text_area.rb
358
358
  - lib/page-object/platforms/watir_webdriver/text_field.rb
359
359
  - lib/page-object/platforms/watir_webdriver/unordered_list.rb
360
- - lib/page-object/sections.rb
360
+ - lib/page-object/section_collection.rb
361
361
  - lib/page-object/version.rb
362
362
  - lib/page-object/widgets.rb
363
363
  - page-object.gemspec
@@ -431,7 +431,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
431
431
  version: '0'
432
432
  requirements: []
433
433
  rubyforge_project: page-object
434
- rubygems_version: 2.4.3
434
+ rubygems_version: 2.5.1
435
435
  signing_key:
436
436
  specification_version: 4
437
437
  summary: Page Object DSL for browser testing
@@ -1,29 +0,0 @@
1
- module PageObject
2
- class SectionCollection
3
- include Enumerable
4
-
5
- def initialize sections
6
- @sections = sections
7
- end
8
-
9
- def each &block
10
- @sections.each &block
11
- end
12
-
13
- def [] index
14
- @sections[index]
15
- end
16
-
17
- def find_by values_hash
18
- @sections.find {|section|
19
- values_hash.all? {|method,value| value === section.public_send(method)}
20
- }
21
- end
22
-
23
- def select_by values_hash
24
- SectionCollection.new @sections.select {|section|
25
- values_hash.all? {|method,value| value === section.public_send(method)}
26
- }
27
- end
28
- end
29
- end