capybara 2.7.1 → 2.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +22 -0
  3. data/README.md +27 -3
  4. data/lib/capybara.rb +19 -4
  5. data/lib/capybara/driver/base.rb +6 -2
  6. data/lib/capybara/driver/node.rb +13 -5
  7. data/lib/capybara/helpers.rb +2 -2
  8. data/lib/capybara/node/actions.rb +116 -17
  9. data/lib/capybara/node/base.rb +7 -1
  10. data/lib/capybara/node/element.rb +23 -3
  11. data/lib/capybara/node/finders.rb +45 -29
  12. data/lib/capybara/node/matchers.rb +13 -15
  13. data/lib/capybara/queries/selector_query.rb +22 -5
  14. data/lib/capybara/queries/text_query.rb +42 -6
  15. data/lib/capybara/rack_test/node.rb +13 -1
  16. data/lib/capybara/result.rb +80 -8
  17. data/lib/capybara/rspec/features.rb +13 -6
  18. data/lib/capybara/selector.rb +98 -71
  19. data/lib/capybara/selector/filter_set.rb +46 -0
  20. data/lib/capybara/selenium/driver.rb +22 -23
  21. data/lib/capybara/selenium/node.rb +14 -6
  22. data/lib/capybara/server.rb +20 -10
  23. data/lib/capybara/session.rb +44 -8
  24. data/lib/capybara/spec/session/all_spec.rb +4 -4
  25. data/lib/capybara/spec/session/assert_text.rb +23 -0
  26. data/lib/capybara/spec/session/check_spec.rb +66 -8
  27. data/lib/capybara/spec/session/choose_spec.rb +20 -0
  28. data/lib/capybara/spec/session/click_button_spec.rb +0 -3
  29. data/lib/capybara/spec/session/click_link_spec.rb +7 -0
  30. data/lib/capybara/spec/session/execute_script_spec.rb +6 -1
  31. data/lib/capybara/spec/session/find_button_spec.rb +19 -1
  32. data/lib/capybara/spec/session/find_field_spec.rb +21 -1
  33. data/lib/capybara/spec/session/find_link_spec.rb +19 -1
  34. data/lib/capybara/spec/session/find_spec.rb +32 -4
  35. data/lib/capybara/spec/session/first_spec.rb +4 -4
  36. data/lib/capybara/spec/session/has_field_spec.rb +4 -0
  37. data/lib/capybara/spec/session/has_text_spec.rb +2 -2
  38. data/lib/capybara/spec/session/node_spec.rb +24 -3
  39. data/lib/capybara/spec/session/reset_session_spec.rb +7 -0
  40. data/lib/capybara/spec/session/selectors_spec.rb +14 -0
  41. data/lib/capybara/spec/session/uncheck_spec.rb +39 -0
  42. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +4 -2
  43. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
  44. data/lib/capybara/spec/session/window/window_spec.rb +36 -22
  45. data/lib/capybara/spec/session/within_frame_spec.rb +19 -0
  46. data/lib/capybara/spec/spec_helper.rb +3 -0
  47. data/lib/capybara/spec/views/form.erb +34 -6
  48. data/lib/capybara/spec/views/with_html.erb +5 -1
  49. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  50. data/lib/capybara/spec/views/with_windows.erb +2 -0
  51. data/lib/capybara/version.rb +1 -1
  52. data/spec/capybara_spec.rb +34 -0
  53. data/spec/rack_test_spec.rb +24 -0
  54. data/spec/result_spec.rb +25 -0
  55. data/spec/rspec/features_spec.rb +3 -3
  56. data/spec/selenium_spec.rb +6 -3
  57. data/spec/server_spec.rb +2 -2
  58. metadata +18 -4
@@ -9,6 +9,18 @@ Capybara::SpecHelper.spec '#find_button' do
9
9
  expect(@session.find_button('crap321').value).to eq("crappy")
10
10
  end
11
11
 
12
+ context "aria_label attribute with Capybara.enable_aria_label" do
13
+ it "should find when true" do
14
+ Capybara.enable_aria_label = true
15
+ expect(@session.find_button('Mediocre Button')[:id]).to eq("mediocre")
16
+ end
17
+
18
+ it "should not find when false" do
19
+ Capybara.enable_aria_label = false
20
+ expect { @session.find_button('Mediocre Button') }.to raise_error(Capybara::ElementNotFound)
21
+ end
22
+ end
23
+
12
24
  it "casts to string" do
13
25
  expect(@session.find_button(:'med')[:id]).to eq("mediocre")
14
26
  end
@@ -21,7 +33,7 @@ Capybara::SpecHelper.spec '#find_button' do
21
33
 
22
34
  context "with :exact option" do
23
35
  it "should accept partial matches when false" do
24
- expect(@session.find_button('What an Awesome', :exact => false)[:value]).to eq("awesome")
36
+ expect(@session.find_button('What an Awesome', :exact => false).value).to eq("awesome")
25
37
  end
26
38
 
27
39
  it "should not accept partial matches when true" do
@@ -52,4 +64,10 @@ Capybara::SpecHelper.spec '#find_button' do
52
64
  expect(@session.find_button('Disabled button', :disabled => :all).value).to eq("Disabled button")
53
65
  end
54
66
  end
67
+
68
+ context "without locator" do
69
+ it "should use options" do
70
+ expect(@session.find_button(disabled: true).value).to eq("Disabled button")
71
+ end
72
+ end
55
73
  end
@@ -8,6 +8,21 @@ Capybara::SpecHelper.spec '#find_field' do
8
8
  expect(@session.find_field('Dog').value).to eq('dog')
9
9
  expect(@session.find_field('form_description').text).to eq('Descriptive text goes here')
10
10
  expect(@session.find_field('Region')[:name]).to eq('form[region]')
11
+
12
+ end
13
+
14
+ context "aria_label attribute with Capybara.enable_aria_label" do
15
+ it "should find when true" do
16
+ Capybara.enable_aria_label = true
17
+ expect(@session.find_field('Unlabelled Input')[:name]).to eq('form[which_form]')
18
+ # expect(@session.find_field('Emergency Number')[:id]).to eq('html5_tel')
19
+ end
20
+
21
+ it "should not find when false" do
22
+ Capybara.enable_aria_label = false
23
+ expect { @session.find_field('Unlabelled Input') }.to raise_error(Capybara::ElementNotFound)
24
+ # expect { @session.find_field('Emergency Number') }.to raise_error(Capybara::ElementNotFound)
25
+ end
11
26
  end
12
27
 
13
28
  it "casts to string" do
@@ -71,7 +86,6 @@ Capybara::SpecHelper.spec '#find_field' do
71
86
  end
72
87
  end
73
88
 
74
-
75
89
  context 'with :readonly option' do
76
90
  it "should find readonly fields when true" do
77
91
  expect(@session.find_field('form[readonly_test]', readonly: true)[:id]).to eq 'readonly'
@@ -87,4 +101,10 @@ Capybara::SpecHelper.spec '#find_field' do
87
101
  end.to raise_error(Capybara::Ambiguous, /found 2 elements/)
88
102
  end
89
103
  end
104
+
105
+ context 'with no locator' do
106
+ it 'should use options to find the field' do
107
+ expect(@session.find_field(with: 'dog')['id']).to eq "form_pets_dog"
108
+ end
109
+ end
90
110
  end
@@ -4,11 +4,23 @@ Capybara::SpecHelper.spec '#find_link' do
4
4
  @session.visit('/with_html')
5
5
  end
6
6
 
7
- it "should find any field" do
7
+ it "should find any link" do
8
8
  expect(@session.find_link('foo').text).to eq("ullamco")
9
9
  expect(@session.find_link('labore')[:href]).to match %r(/with_simple_html$)
10
10
  end
11
11
 
12
+ context "aria_label attribute with Capybara.enable_aria_label" do
13
+ it "should find when true" do
14
+ Capybara.enable_aria_label = true
15
+ expect(@session.find_link('Go to simple')[:href]).to match %r(/with_simple_html$)
16
+ end
17
+
18
+ it "should not find when false" do
19
+ Capybara.enable_aria_label = false
20
+ expect { @session.find_link('Go to simple') }.to raise_error(Capybara::ElementNotFound)
21
+ end
22
+ end
23
+
12
24
  it "casts to string" do
13
25
  expect(@session.find_link(:'foo').text).to eq("ullamco")
14
26
  end
@@ -30,4 +42,10 @@ Capybara::SpecHelper.spec '#find_link' do
30
42
  end.to raise_error(Capybara::ElementNotFound)
31
43
  end
32
44
  end
45
+
46
+ context "without locator" do
47
+ it "should use options" do
48
+ expect(@session.find_link(href: '#anchor').text).to eq "Normal Anchor"
49
+ end
50
+ end
33
51
  end
@@ -10,7 +10,7 @@ Capybara::SpecHelper.spec '#find' do
10
10
 
11
11
  it "should find the first element using the given locator" do
12
12
  expect(@session.find('//h1').text).to eq('This is a test')
13
- expect(@session.find("//input[@id='test_field']")[:value]).to eq('monkey')
13
+ expect(@session.find("//input[@id='test_field']").value).to eq('monkey')
14
14
  end
15
15
 
16
16
  it "should find the first element using the given locator and options" do
@@ -79,7 +79,7 @@ Capybara::SpecHelper.spec '#find' do
79
79
  context "with css selectors" do
80
80
  it "should find the first element using the given locator" do
81
81
  expect(@session.find(:css, 'h1').text).to eq('This is a test')
82
- expect(@session.find(:css, "input[id='test_field']")[:value]).to eq('monkey')
82
+ expect(@session.find(:css, "input[id='test_field']").value).to eq('monkey')
83
83
  end
84
84
 
85
85
  it "should support pseudo selectors" do
@@ -90,7 +90,7 @@ Capybara::SpecHelper.spec '#find' do
90
90
  context "with xpath selectors" do
91
91
  it "should find the first element using the given locator" do
92
92
  expect(@session.find(:xpath, '//h1').text).to eq('This is a test')
93
- expect(@session.find(:xpath, "//input[@id='test_field']")[:value]).to eq('monkey')
93
+ expect(@session.find(:xpath, "//input[@id='test_field']").value).to eq('monkey')
94
94
  end
95
95
  end
96
96
 
@@ -165,11 +165,39 @@ Capybara::SpecHelper.spec '#find' do
165
165
  end
166
166
  end
167
167
 
168
+ context "with alternate filter set" do
169
+ before do
170
+ Capybara::Selector::FilterSet.add(:value) do
171
+ filter(:with) { |node, with| node.value == with.to_s }
172
+ end
173
+
174
+ Capybara.add_selector(:id_with_field_filters) do
175
+ xpath { |id| XPath.descendant[XPath.attr(:id) == id.to_s] }
176
+ filter_set(:field)
177
+ end
178
+ end
179
+
180
+ it "should allow use of filters from custom filter set" do
181
+ expect(@session.find(:id, 'test_field', filter_set: :value, with: 'monkey').value).to eq('monkey')
182
+ expect{ @session.find(:id, 'test_field', filter_set: :value, with: 'not_monkey') }.to raise_error(Capybara::ElementNotFound)
183
+ end
184
+
185
+ it "should allow use of filter set from a different selector" do
186
+ expect(@session.find(:id, 'test_field', filter_set: :field, with: 'monkey').value).to eq('monkey')
187
+ expect{ @session.find(:id, 'test_field', filter_set: :field, with: 'not_monkey') }.to raise_error(Capybara::ElementNotFound)
188
+ end
189
+
190
+ it "should allow importing of filter set into selector" do
191
+ expect(@session.find(:id_with_field_filters, 'test_field', with: 'monkey').value).to eq('monkey')
192
+ expect{ @session.find(:id_with_field_filters, 'test_field', with: 'not_monkey') }.to raise_error(Capybara::ElementNotFound)
193
+ end
194
+ end
195
+
168
196
  context "with css as default selector" do
169
197
  before { Capybara.default_selector = :css }
170
198
  it "should find the first element using the given locator" do
171
199
  expect(@session.find('h1').text).to eq('This is a test')
172
- expect(@session.find("input[id='test_field']")[:value]).to eq('monkey')
200
+ expect(@session.find("input[id='test_field']").value).to eq('monkey')
173
201
  end
174
202
  after { Capybara.default_selector = :xpath }
175
203
  end
@@ -6,7 +6,7 @@ Capybara::SpecHelper.spec '#first' do
6
6
 
7
7
  it "should find the first element using the given locator" do
8
8
  expect(@session.first('//h1').text).to eq('This is a test')
9
- expect(@session.first("//input[@id='test_field']")[:value]).to eq('monkey')
9
+ expect(@session.first("//input[@id='test_field']").value).to eq('monkey')
10
10
  end
11
11
 
12
12
  it "should return nil when nothing was found" do
@@ -22,14 +22,14 @@ Capybara::SpecHelper.spec '#first' do
22
22
  context "with css selectors" do
23
23
  it "should find the first element using the given selector" do
24
24
  expect(@session.first(:css, 'h1').text).to eq('This is a test')
25
- expect(@session.first(:css, "input[id='test_field']")[:value]).to eq('monkey')
25
+ expect(@session.first(:css, "input[id='test_field']").value).to eq('monkey')
26
26
  end
27
27
  end
28
28
 
29
29
  context "with xpath selectors" do
30
30
  it "should find the first element using the given locator" do
31
31
  expect(@session.first(:xpath, '//h1').text).to eq('This is a test')
32
- expect(@session.first(:xpath, "//input[@id='test_field']")[:value]).to eq('monkey')
32
+ expect(@session.first(:xpath, "//input[@id='test_field']").value).to eq('monkey')
33
33
  end
34
34
  end
35
35
 
@@ -37,7 +37,7 @@ Capybara::SpecHelper.spec '#first' do
37
37
  before { Capybara.default_selector = :css }
38
38
  it "should find the first element using the given locator" do
39
39
  expect(@session.first('h1').text).to eq('This is a test')
40
- expect(@session.first("input[id='test_field']")[:value]).to eq('monkey')
40
+ expect(@session.first("input[id='test_field']").value).to eq('monkey')
41
41
  end
42
42
  end
43
43
 
@@ -16,6 +16,7 @@ Capybara::SpecHelper.spec '#has_field' do
16
16
  context 'with value' do
17
17
  it "should be true if a field with the given value is on the page" do
18
18
  expect(@session).to have_field('First Name', :with => 'John')
19
+ expect(@session).to have_field('First Name', :with => /^Joh/)
19
20
  expect(@session).to have_field('Phone', :with => '+1 555 7021')
20
21
  expect(@session).to have_field('Street', :with => 'Sesame street 66')
21
22
  expect(@session).to have_field('Description', :with => 'Descriptive text goes here')
@@ -23,6 +24,7 @@ Capybara::SpecHelper.spec '#has_field' do
23
24
 
24
25
  it "should be false if the given field is not on the page" do
25
26
  expect(@session).not_to have_field('First Name', :with => 'Peter')
27
+ expect(@session).not_to have_field('First Name', :with => /eter$/)
26
28
  expect(@session).not_to have_field('Wrong Name', :with => 'John')
27
29
  expect(@session).not_to have_field('Description', :with => 'Monkey')
28
30
  end
@@ -30,11 +32,13 @@ Capybara::SpecHelper.spec '#has_field' do
30
32
  it "should be true after the field has been filled in with the given value" do
31
33
  @session.fill_in('First Name', :with => 'Jonas')
32
34
  expect(@session).to have_field('First Name', :with => 'Jonas')
35
+ expect(@session).to have_field('First Name', :with => /ona/)
33
36
  end
34
37
 
35
38
  it "should be false after the field has been filled in with a different value" do
36
39
  @session.fill_in('First Name', :with => 'Jonas')
37
40
  expect(@session).not_to have_field('First Name', :with => 'John')
41
+ expect(@session).not_to have_field('First Name', :with => /John|Paul|George|Ringo/)
38
42
  end
39
43
  end
40
44
 
@@ -80,7 +80,7 @@ Capybara::SpecHelper.spec '#has_text?' do
80
80
  expect(@session).to have_text(:all, 'Some of this text is hidden!')
81
81
  end
82
82
 
83
- it "should be true if `Capybara.ignore_hidden_elements = true` and text is invisible." do
83
+ it "should be true if `Capybara.ignore_hidden_elements = false` and text is invisible." do
84
84
  Capybara.ignore_hidden_elements = false
85
85
  @session.visit('/with_html')
86
86
  expect(@session).to have_text('Some of this text is hidden!')
@@ -280,7 +280,7 @@ Capybara::SpecHelper.spec '#has_no_text?' do
280
280
  expect(@session).not_to have_no_text(:all, 'Some of this text is hidden!')
281
281
  end
282
282
 
283
- it "should be false if `Capybara.ignore_hidden_elements = true` and text is invisible." do
283
+ it "should be false if `Capybara.ignore_hidden_elements = false` and text is invisible." do
284
284
  Capybara.ignore_hidden_elements = false
285
285
  @session.visit('/with_html')
286
286
  expect(@session).not_to have_no_text('Some of this text is hidden!')
@@ -19,11 +19,19 @@ Capybara::SpecHelper.spec "node" do
19
19
  expect(@session.find(:css, '#second')).to have_no_css('h1')
20
20
  end
21
21
 
22
+ describe "#query_scope" do
23
+ it "should have a reference to the element the query was evaluated on if there is one" do
24
+ @node = @session.find(:css, '#first')
25
+ expect(@node.query_scope).to eq(@node.session.document)
26
+ expect(@node.find(:css, '#foo').query_scope).to eq(@node)
27
+ end
28
+ end
29
+
22
30
  describe "#parent" do
23
- it "should have a reference to its parent if there is one" do
31
+ it "should be deprecated" do
24
32
  @node = @session.find(:css, '#first')
25
- expect(@node.parent).to eq(@node.session.document)
26
- expect(@node.find(:css, '#foo').parent).to eq(@node)
33
+ expect(@node).to receive(:warn).with(/^DEPRECATED:/)
34
+ expect(@node.parent).to eq(@node.query_scope)
27
35
  end
28
36
  end
29
37
 
@@ -409,6 +417,19 @@ Capybara::SpecHelper.spec "node" do
409
417
  end
410
418
  end
411
419
 
420
+ context "when #synchronize raises server errors" do
421
+ it "sets an explanatory exception as the cause of server exceptions", :requires => [:server, :js] do
422
+ skip "This version of ruby doesn't support exception causes" unless Exception.instance_methods.include? :cause
423
+ quietly { @session.visit("/error") }
424
+ expect do
425
+ @session.find(:css, 'span')
426
+ end.to raise_error(TestApp::TestAppError) do |e|
427
+ expect(e.cause).to be_a Capybara::CapybaraError
428
+ expect(e.cause.message).to match /Your application server raised an error/
429
+ end
430
+ end
431
+ end
432
+
412
433
  def be_an_invalid_element_error(session)
413
434
  satisfy { |error| session.driver.invalid_element_errors.any? { |e| error.is_a? e } }
414
435
  end
@@ -46,6 +46,13 @@ Capybara::SpecHelper.spec '#reset_session!' do
46
46
  expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
47
47
  end
48
48
 
49
+ it "handles already open modals" do
50
+ @session.visit('/with_unload_alert')
51
+ @session.click_link('Go away')
52
+ expect { @session.reset_session! }.not_to raise_error
53
+ expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
54
+ end
55
+
49
56
  it "raises any standard errors caught inside the server", :requires => [:server] do
50
57
  quietly { @session.visit("/error") }
51
58
  expect do
@@ -32,4 +32,18 @@ Capybara::SpecHelper.spec Capybara::Selector do
32
32
  end
33
33
  end
34
34
  end
35
+
36
+ describe "locate_field selectors" do
37
+ it "can find specifically by id" do
38
+ expect(@session.find(:field, id: 'customer_email').value).to eq "ben@ben.com"
39
+ end
40
+
41
+ it "can find specifically by name" do
42
+ expect(@session.find(:field, name: 'form[other_title]')['id']).to eq "form_other_title"
43
+ end
44
+
45
+ it "can find specifically by placeholder" do
46
+ expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq "form_first_name"
47
+ end
48
+ end
35
49
  end
@@ -38,4 +38,43 @@ Capybara::SpecHelper.spec "#uncheck" do
38
38
  end.to raise_error(Capybara::ElementNotFound)
39
39
  end
40
40
  end
41
+
42
+ context "when checkbox hidden" do
43
+ context "with Capybara.automatic_label_click == true" do
44
+ around do |spec|
45
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
46
+ spec.run
47
+ Capybara.automatic_label_click = old_click_label
48
+ end
49
+
50
+ it "should uncheck via clicking the label with :for attribute if possible" do
51
+ expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be
52
+ @session.uncheck('form_cars_jaguar')
53
+ @session.click_button('awesome')
54
+ expect(extract_results(@session)['cars']).not_to include('jaguar')
55
+ end
56
+
57
+ it "should uncheck via clicking the wrapping label if possible" do
58
+ expect(@session.find(:checkbox, 'form_cars_koenigsegg', checked: true, visible: :hidden)).to be
59
+ @session.uncheck('form_cars_koenigsegg')
60
+ @session.click_button('awesome')
61
+ expect(extract_results(@session)['cars']).not_to include('koenigsegg')
62
+ end
63
+
64
+ it "should not click the label if unneeded" do
65
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
66
+ @session.uncheck('form_cars_tesla')
67
+ @session.click_button('awesome')
68
+ expect(extract_results(@session)['cars']).not_to include('tesla')
69
+ end
70
+
71
+ it "should raise original error when no label available" do
72
+ expect { @session.uncheck('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, 'Unable to find checkbox "form_cars_ariel"')
73
+ end
74
+
75
+ it "should raise error if not allowed to click label" do
76
+ expect{@session.uncheck('form_cars_jaguar', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find checkbox "form_cars_jaguar"')
77
+ end
78
+ end
79
+ end
41
80
  end
@@ -3,7 +3,9 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
3
3
  before(:each) do
4
4
  @window = @session.current_window
5
5
  @session.visit('/with_windows')
6
+ expect(@session).to have_css('body.loaded')
6
7
  end
8
+
7
9
  after(:each) do
8
10
  (@session.windows - [@window]).each do |w|
9
11
  @session.switch_to_window w
@@ -47,7 +49,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
47
49
  context "with block" do
48
50
  before(:each) do
49
51
  @session.find(:css, '#openTwoWindows').click
50
- sleep(0.2) # wait for the windows to open
52
+ sleep(1) # wait for the windows to open
51
53
  end
52
54
 
53
55
  it "should be able to switch to current window" do
@@ -117,7 +119,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
117
119
  it "should wait for window to appear" do
118
120
  @session.find(:css, '#openWindowWithTimeout').click
119
121
  expect do
120
- @session.switch_to_window { @session.title == 'Title of the first popup'}
122
+ @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup'}
121
123
  end.not_to raise_error
122
124
  end
123
125
  end
@@ -3,6 +3,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
3
3
  before(:each) do
4
4
  @window = @session.current_window
5
5
  @session.visit('/with_windows')
6
+ expect(@session).to have_css('body.loaded')
6
7
  end
7
8
  after(:each) do
8
9
  (@session.windows - [@window]).each do |w|
@@ -73,7 +74,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
73
74
  expect do
74
75
  @session.window_opened_by do
75
76
  button.click
76
- sleep 0.1 # It's possible for window_opened_by to be fullfilled before the second window opens
77
+ sleep 1 # It's possible for window_opened_by to be fullfilled before the second window opens
77
78
  end
78
79
  end.to raise_error(Capybara::WindowError, two_windows_message)
79
80
  @session.document.synchronize(2, errors: [Capybara::CapybaraError]) do
@@ -86,18 +86,22 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
86
86
  end
87
87
 
88
88
  describe '#size' do
89
+ def win_size
90
+ @session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
91
+ end
92
+
89
93
  it 'should return size of whole window', requires: [:windows, :js] do
90
- expect(@session.current_window.size).to eq @session.evaluate_script("[window.outerWidth, window.outerHeight];")
94
+ expect(@session.current_window.size).to eq win_size
91
95
  end
92
96
 
93
97
  it 'should switch to original window if invoked not for current window' do
94
98
  @other_window = @session.window_opened_by do
95
99
  @session.find(:css, '#openWindow').click
96
100
  end
97
- size =
98
- @session.within_window @other_window do
99
- @session.evaluate_script("[window.outerWidth, window.outerHeight];")
100
- end
101
+ sleep 1
102
+ size = @session.within_window(@other_window) do
103
+ win_size
104
+ end
101
105
  expect(@other_window.size).to eq(size)
102
106
  expect(@session.current_window).to eq(@window)
103
107
  end
@@ -105,10 +109,10 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
105
109
 
106
110
  describe '#resize_to' do
107
111
  it 'should be able to resize window', requires: [:windows, :js] do
108
-
109
- width, height = @session.evaluate_script("[window.outerWidth, window.outerHeight];")
110
- @session.current_window.resize_to(width-10, height-10)
111
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([width-10, height-10])
112
+ width, height = @session.current_window.size
113
+ @session.current_window.resize_to(width-100, height-100)
114
+ sleep 1
115
+ expect(@session.current_window.size).to eq([width-100, height-100])
112
116
  end
113
117
 
114
118
  it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
@@ -120,36 +124,46 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
120
124
  expect(@session.current_window).to eq(@window)
121
125
 
122
126
  # #size returns values larger than availWidth, availHeight with Chromedriver
123
- # expect(@other_window.size).to eq([400, 300])
124
127
  @session.within_window(@other_window) do
125
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
128
+ expect(@session.current_window.size).to eq([400,300])
129
+ # expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
126
130
  end
127
131
  end
128
132
  end
129
133
 
130
134
  describe '#maximize' do
131
135
  it 'should be able to maximize window', requires: [:windows, :js] do
132
- screen_width, screen_height = @session.evaluate_script("[window.screen.availWidth, window.screen.availHeight];")
133
- window = @session.current_window
134
- window.resize_to(screen_width-100, screen_height-100)
135
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([screen_width-100, screen_height-100])
136
- window.maximize
136
+ start_width, start_height = 400, 300
137
+ @session.current_window.resize_to(start_width, start_height)
138
+ sleep 0.5
139
+
140
+ @session.current_window.maximize
137
141
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
138
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([screen_width, screen_height])
142
+
143
+ max_width, max_height = @session.current_window.size
144
+
145
+ #maximize behavior is window manage dependant, so just make sure it increases in size
146
+ expect(max_width).to be > start_width
147
+ expect(max_height).to be > start_height
139
148
  end
140
149
 
141
150
  it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
151
+ cur_window_size = @session.current_window.size
142
152
  @other_window = @session.window_opened_by do
143
153
  @session.find(:css, '#openWindow').click
144
154
  end
155
+
156
+ @other_window.resize_to(400,300)
157
+ sleep 0.5
145
158
  @other_window.maximize
146
159
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
160
+
147
161
  expect(@session.current_window).to eq(@window)
148
- # #size returns values larger than availWidth, availHeight with Chromedriver
149
- # expect(@other_window.size).to eq(@session.evaluate_script("[window.screen.availWidth, window.screen.availHeight];"))
150
- @session.within_window(@other_window) do
151
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq(@session.evaluate_script("[window.screen.availWidth, window.screen.availHeight];"))
152
- end
162
+ expect(@session.current_window.size).to eq(cur_window_size)
163
+
164
+ ow_width, ow_height = @other_window.size
165
+ expect(ow_width).to be > 400
166
+ expect(ow_height).to be > 300
153
167
  end
154
168
  end
155
169
  end