capybara 3.14.0 → 3.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +13 -0
  3. data/README.md +2 -1
  4. data/lib/capybara/node/actions.rb +37 -6
  5. data/lib/capybara/node/matchers.rb +10 -2
  6. data/lib/capybara/selector.rb +117 -1
  7. data/lib/capybara/selector/selector.rb +7 -0
  8. data/lib/capybara/selector/xpath_extensions.rb +9 -0
  9. data/lib/capybara/selenium/driver.rb +13 -2
  10. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +15 -0
  11. data/lib/capybara/selenium/extensions/find.rb +2 -1
  12. data/lib/capybara/selenium/node.rb +1 -1
  13. data/lib/capybara/selenium/nodes/firefox_node.rb +1 -1
  14. data/lib/capybara/selenium/nodes/safari_node.rb +145 -0
  15. data/lib/capybara/spec/session/attach_file_spec.rb +46 -27
  16. data/lib/capybara/spec/session/click_button_spec.rb +65 -60
  17. data/lib/capybara/spec/session/element/matches_selector_spec.rb +40 -39
  18. data/lib/capybara/spec/session/fill_in_spec.rb +3 -3
  19. data/lib/capybara/spec/session/find_spec.rb +5 -0
  20. data/lib/capybara/spec/session/has_table_spec.rb +120 -0
  21. data/lib/capybara/spec/session/node_spec.rb +3 -3
  22. data/lib/capybara/spec/session/reset_session_spec.rb +8 -7
  23. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  24. data/lib/capybara/spec/session/window/window_spec.rb +44 -48
  25. data/lib/capybara/spec/views/form.erb +5 -0
  26. data/lib/capybara/spec/views/tables.erb +67 -0
  27. data/lib/capybara/spec/views/with_html.erb +2 -2
  28. data/lib/capybara/spec/views/with_js.erb +1 -0
  29. data/lib/capybara/version.rb +1 -1
  30. data/spec/capybara_spec.rb +4 -4
  31. data/spec/css_builder_spec.rb +2 -0
  32. data/spec/dsl_spec.rb +13 -17
  33. data/spec/rack_test_spec.rb +77 -85
  34. data/spec/rspec/features_spec.rb +2 -0
  35. data/spec/rspec/shared_spec_matchers.rb +34 -35
  36. data/spec/rspec_spec.rb +11 -13
  37. data/spec/selector_spec.rb +31 -0
  38. data/spec/selenium_spec_chrome.rb +25 -25
  39. data/spec/selenium_spec_firefox.rb +62 -35
  40. data/spec/selenium_spec_firefox_remote.rb +2 -0
  41. data/spec/selenium_spec_safari.rb +148 -0
  42. data/spec/server_spec.rb +40 -44
  43. data/spec/shared_selenium_session.rb +27 -21
  44. data/spec/spec_helper.rb +4 -0
  45. data/spec/xpath_builder_spec.rb +2 -0
  46. metadata +7 -3
@@ -178,10 +178,10 @@ Capybara::SpecHelper.spec '#fill_in' do
178
178
  it 'should only trigger onchange once' do
179
179
  @session.visit('/with_js')
180
180
  # Click somewhere on the page to ensure focus is acquired. Without this FF won't generate change events for some reason???
181
- @session.find(:css, 'body').click
181
+ @session.find(:css, 'h1', text: 'FooBar').click
182
182
  @session.fill_in('with_change_event', with: 'some value')
183
183
  # click outside the field to trigger the change event
184
- @session.find(:css, 'body').click
184
+ @session.find(:css, 'h1', text: 'FooBar').click
185
185
  expect(@session.find(:css, '.change_event_triggered', match: :one)).to have_text 'some value'
186
186
  end
187
187
 
@@ -189,7 +189,7 @@ Capybara::SpecHelper.spec '#fill_in' do
189
189
  @session.visit('/with_js')
190
190
  @session.fill_in('with_change_event', with: '')
191
191
  # click outside the field to trigger the change event
192
- @session.find(:css, 'body').click
192
+ @session.find(:css, 'h1', text: 'FooBar').click
193
193
  expect(@session).to have_selector(:css, '.change_event_triggered', match: :one)
194
194
  end
195
195
  end
@@ -468,5 +468,10 @@ Capybara::SpecHelper.spec '#find' do
468
468
  Capybara.test_id = 'data-other-test-id'
469
469
  expect(@session.find(:field, 'test_id')[:id]).to eq 'normal'
470
470
  end
471
+
472
+ it 'should find a link with the test_id' do
473
+ Capybara.test_id = 'data-test-id'
474
+ expect(@session.find(:link, 'test-foo')[:id]).to eq 'foo'
475
+ end
471
476
  end
472
477
  end
@@ -11,9 +11,115 @@ Capybara::SpecHelper.spec '#has_table?' do
11
11
  expect(@session).to have_table(:villain_table)
12
12
  end
13
13
 
14
+ it 'should accept rows with column header hashes' do
15
+ expect(@session).to have_table('Horizontal Headers', with_rows:
16
+ [
17
+ { 'First Name' => 'Vern', 'Last Name' => 'Konopelski', 'City' => 'Everette' },
18
+ { 'First Name' => 'Palmer', 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
19
+ ])
20
+ end
21
+
22
+ it 'should accept rows with partial column header hashses' do
23
+ expect(@session).to have_table('Horizontal Headers', with_rows:
24
+ [
25
+ { 'First Name' => 'Thomas' },
26
+ { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
27
+ ])
28
+ end
29
+
30
+ it 'should accept rows with array of cell values' do
31
+ expect(@session).to have_table('Horizontal Headers', with_rows:
32
+ [
33
+ %w[Thomas Walpole Oceanside],
34
+ ['Ratke', 'Lawrence', 'East Sorayashire']
35
+ ])
36
+ end
37
+
38
+ it 'should consider order of cells in each row' do
39
+ expect(@session).not_to have_table('Horizontal Headers', with_rows:
40
+ [
41
+ %w[Thomas Walpole Oceanside],
42
+ ['Lawrence', 'Ratke', 'East Sorayashire']
43
+ ])
44
+ end
45
+
46
+ it 'should accept all rows with array of cell values' do
47
+ expect(@session).to have_table('Horizontal Headers', rows:
48
+ [
49
+ %w[Thomas Walpole Oceanside],
50
+ %w[Danilo Wilkinson Johnsonville],
51
+ %w[Vern Konopelski Everette],
52
+ ["Ratke", "Lawrence", "East Sorayashire"],
53
+ ["Palmer", "Sawayn", "West Trinidad"]
54
+ ])
55
+ end
56
+
57
+ it 'should match with vertical headers' do
58
+ expect(@session).to have_table('Vertical Headers', with_cols:
59
+ [
60
+ { 'First Name' => 'Thomas' },
61
+ { 'First Name' => 'Danilo', 'Last Name' => 'Wilkinson', 'City' => 'Johnsonville' },
62
+ { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
63
+ ])
64
+ end
65
+
66
+ it 'should match col with array of cell values' do
67
+ expect(@session).to have_table('Vertical Headers', with_cols:
68
+ [
69
+ %w[Vern Konopelski Everette]
70
+ ])
71
+ end
72
+
73
+ it 'should match cols with array of cell values' do
74
+ expect(@session).to have_table('Vertical Headers', with_cols:
75
+ [
76
+ %w[Danilo Wilkinson Johnsonville],
77
+ %w[Vern Konopelski Everette]
78
+ ])
79
+ end
80
+
81
+ it 'should match all cols with array of cell values' do
82
+ expect(@session).to have_table('Vertical Headers', cols:
83
+ [
84
+ %w[Thomas Walpole Oceanside],
85
+ %w[Danilo Wilkinson Johnsonville],
86
+ %w[Vern Konopelski Everette],
87
+ ["Ratke", "Lawrence", "East Sorayashire"],
88
+ ["Palmer", "Sawayn", "West Trinidad"]
89
+ ])
90
+ end
91
+
92
+ it "should not match if the order of cell values doesn't match" do
93
+ expect(@session).not_to have_table('Vertical Headers', with_cols:
94
+ [
95
+ %w[Vern Everette Konopelski]
96
+ ])
97
+ end
98
+
99
+ it "should not match with vertical headers if the columns don't match" do
100
+ expect(@session).not_to have_table('Vertical Headers', with_cols:
101
+ [
102
+ { 'First Name' => 'Thomas' },
103
+ { 'First Name' => 'Danilo', 'Last Name' => 'Walpole', 'City' => 'Johnsonville' },
104
+ { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
105
+ ])
106
+ end
107
+
14
108
  it 'should be false if the table is not on the page' do
15
109
  expect(@session).not_to have_table('Monkey')
16
110
  end
111
+
112
+ it 'should find row by header and cell values' do
113
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, 'First Name' => 'Thomas', 'Last Name' => 'Walpole')
114
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, 'Last Name' => 'Walpole')
115
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, 'First Name' => 'Walpole')
116
+ end
117
+
118
+ it 'should find row by cell values' do
119
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, %w[Thomas Walpole])
120
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, %w[Walpole Thomas])
121
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, %w[Other])
122
+ end
17
123
  end
18
124
 
19
125
  Capybara::SpecHelper.spec '#has_no_table?' do
@@ -29,4 +135,18 @@ Capybara::SpecHelper.spec '#has_no_table?' do
29
135
  it 'should be true if the table is not on the page' do
30
136
  expect(@session).to have_no_table('Monkey')
31
137
  end
138
+
139
+ it 'should consider rows' do
140
+ expect(@session).to have_no_table('Horizontal Headers', with_rows:
141
+ [
142
+ { 'First Name' => 'Thomas', 'City' => 'Los Angeles' }
143
+ ])
144
+ end
145
+
146
+ it 'should consider columns' do
147
+ expect(@session).to have_no_table('Vertical Headers', with_cols:
148
+ [
149
+ { 'First Name' => 'Joe' }
150
+ ])
151
+ end
32
152
  end
@@ -25,9 +25,9 @@ Capybara::SpecHelper.spec 'node' do
25
25
 
26
26
  describe '#query_scope' do
27
27
  it 'should have a reference to the element the query was evaluated on if there is one' do
28
- @node = @session.find(:css, '#first')
29
- expect(@node.query_scope).to eq(@node.session.document)
30
- expect(@node.find(:css, '#foo').query_scope).to eq(@node)
28
+ node = @session.find(:css, '#first')
29
+ expect(node.query_scope).to eq(node.session.document)
30
+ expect(node.find(:css, '#foo').query_scope).to eq(node)
31
31
  end
32
32
  end
33
33
 
@@ -96,25 +96,26 @@ Capybara::SpecHelper.spec '#reset_session!' do
96
96
  end
97
97
 
98
98
  context 'When reuse_server == false' do
99
+ let!(:orig_reuse_server) { Capybara.reuse_server }
100
+
99
101
  before do
100
- @reuse_server = Capybara.reuse_server
101
102
  Capybara.reuse_server = false
102
103
  end
103
104
 
104
105
  after do
105
- Capybara.reuse_server = @reuse_server
106
+ Capybara.reuse_server = orig_reuse_server
106
107
  end
107
108
 
108
109
  it 'raises any standard errors caught inside the server during a second session', requires: [:server] do
109
110
  Capybara.using_driver(@session.mode) do
110
111
  Capybara.using_session(:another_session) do
111
- @another_session = Capybara.current_session
112
- quietly { @another_session.visit('/error') }
112
+ another_session = Capybara.current_session
113
+ quietly { another_session.visit('/error') }
113
114
  expect do
114
- @another_session.reset_session!
115
+ another_session.reset_session!
115
116
  end.to raise_error(TestApp::TestAppError)
116
- @another_session.visit('/')
117
- expect(@another_session.current_path).to eq('/')
117
+ another_session.visit('/')
118
+ expect(another_session.current_path).to eq('/')
118
119
  end
119
120
  end
120
121
  end
@@ -1,38 +1,41 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
4
- before do
5
- @window = @session.current_window
6
- @session.visit('/with_windows')
7
- @other_window = @session.window_opened_by do
4
+ let!(:window) { @session.current_window }
5
+ let(:other_window) do
6
+ @session.window_opened_by do
8
7
  @session.find(:css, '#openWindow').click
9
8
  end
10
9
  end
11
10
 
11
+ before do
12
+ @session.visit('/with_windows')
13
+ end
14
+
12
15
  after do
13
16
  @session.document.synchronize(5, errors: [Capybara::CapybaraError]) do
14
17
  raise Capybara::CapybaraError if @session.windows.size != 1
15
18
  end
16
- @session.switch_to_window(@window)
19
+ @session.switch_to_window(window)
17
20
  end
18
21
 
19
22
  context 'with :wait option' do
20
23
  it 'should wait if value of :wait is more than timeout' do
21
- @session.within_window @other_window do
24
+ @session.within_window other_window do
22
25
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
23
26
  end
24
27
  Capybara.using_wait_time 0.1 do
25
- expect(@other_window).to become_closed(wait: 5)
28
+ expect(other_window).to become_closed(wait: 5)
26
29
  end
27
30
  end
28
31
 
29
32
  it 'should raise error if value of :wait is less than timeout' do
30
- @session.within_window @other_window do
33
+ @session.within_window other_window do
31
34
  @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
32
35
  end
33
36
  Capybara.using_wait_time 2 do
34
37
  expect do
35
- expect(@other_window).to become_closed(wait: 0.2)
38
+ expect(other_window).to become_closed(wait: 0.2)
36
39
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.2 seconds\Z/)
37
40
  end
38
41
  end
@@ -40,21 +43,21 @@ Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
40
43
 
41
44
  context 'without :wait option' do
42
45
  it 'should wait if value of default_max_wait_time is more than timeout' do
43
- @session.within_window @other_window do
46
+ @session.within_window other_window do
44
47
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
45
48
  end
46
49
  Capybara.using_wait_time 5 do
47
- expect(@other_window).to become_closed
50
+ expect(other_window).to become_closed
48
51
  end
49
52
  end
50
53
 
51
54
  it 'should raise error if value of default_max_wait_time is less than timeout' do
52
- @session.within_window @other_window do
55
+ @session.within_window other_window do
53
56
  @session.execute_script('setTimeout(function(){ window.close(); }, 900);')
54
57
  end
55
58
  Capybara.using_wait_time 0.4 do
56
59
  expect do
57
- expect(@other_window).to become_closed
60
+ expect(other_window).to become_closed
58
61
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.4 seconds\Z/)
59
62
  end
60
63
  end
@@ -62,23 +65,23 @@ Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
62
65
 
63
66
  context 'with not_to' do
64
67
  it "should not raise error if window doesn't close before default_max_wait_time" do
65
- @session.within_window @other_window do
68
+ @session.within_window other_window do
66
69
  @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
67
70
  end
68
71
  Capybara.using_wait_time 0.3 do
69
72
  expect do
70
- expect(@other_window).not_to become_closed
73
+ expect(other_window).not_to become_closed
71
74
  end.not_to raise_error
72
75
  end
73
76
  end
74
77
 
75
78
  it 'should raise error if window closes before default_max_wait_time' do
76
- @session.within_window @other_window do
79
+ @session.within_window other_window do
77
80
  @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
78
81
  end
79
82
  Capybara.using_wait_time 3.1 do
80
83
  expect do
81
- expect(@other_window).not_to become_closed
84
+ expect(other_window).not_to become_closed
82
85
  end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 3.1 seconds\Z/)
83
86
  end
84
87
  end
@@ -5,89 +5,87 @@
5
5
  # using Capybara provided assertions with builtin waiting behavior.
6
6
 
7
7
  Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
8
+ let!(:orig_window) { @session.current_window }
8
9
  before do
9
- @window = @session.current_window
10
10
  @session.visit('/with_windows')
11
11
  end
12
12
 
13
13
  after do
14
- (@session.windows - [@window]).each do |w|
14
+ (@session.windows - [orig_window]).each do |w|
15
15
  @session.switch_to_window w
16
16
  w.close
17
17
  end
18
- @session.switch_to_window(@window)
18
+ @session.switch_to_window(orig_window)
19
19
  end
20
20
 
21
21
  describe '#exists?' do
22
- before do
23
- @other_window = @session.window_opened_by do
22
+ it 'should become false after window was closed' do
23
+ other_window = @session.window_opened_by do
24
24
  @session.find(:css, '#openWindow').click
25
25
  end
26
- end
27
26
 
28
- it 'should become false after window was closed' do
29
27
  expect do
30
- @session.switch_to_window @other_window
31
- @other_window.close
32
- end.to change { @other_window.exists? }.from(true).to(false)
28
+ @session.switch_to_window other_window
29
+ other_window.close
30
+ end.to change(other_window, :exists?).from(true).to(false)
33
31
  end
34
32
  end
35
33
 
36
34
  describe '#closed?' do
37
35
  it 'should become true after window was closed' do
38
- @other_window = @session.window_opened_by do
36
+ other_window = @session.window_opened_by do
39
37
  @session.find(:css, '#openWindow').click
40
38
  end
41
39
  expect do
42
- @session.switch_to_window @other_window
43
- @other_window.close
44
- end.to change { @other_window.closed? }.from(false).to(true)
40
+ @session.switch_to_window other_window
41
+ other_window.close
42
+ end.to change { other_window.closed? }.from(false).to(true)
45
43
  end
46
44
  end
47
45
 
48
46
  describe '#current?' do
49
- before do
50
- @other_window = @session.window_opened_by do
47
+ let(:other_window) do
48
+ @session.window_opened_by do
51
49
  @session.find(:css, '#openWindow').click
52
50
  end
53
51
  end
54
52
 
55
53
  it 'should become true after switching to window' do
56
54
  expect do
57
- @session.switch_to_window(@other_window)
58
- end.to change { @other_window.current? }.from(false).to(true)
55
+ @session.switch_to_window(other_window)
56
+ end.to change(other_window, :current?).from(false).to(true)
59
57
  end
60
58
 
61
59
  it 'should return false if window is closed' do
62
- @session.switch_to_window(@other_window)
63
- @other_window.close
64
- expect(@other_window.current?).to eq(false)
60
+ @session.switch_to_window(other_window)
61
+ other_window.close
62
+ expect(other_window.current?).to eq(false)
65
63
  end
66
64
  end
67
65
 
68
66
  describe '#close' do
69
- before do
70
- @other_window = @session.window_opened_by do
67
+ let!(:other_window) do
68
+ @session.window_opened_by do
71
69
  @session.find(:css, '#openWindow').click
72
70
  end
73
71
  end
74
72
 
75
73
  it 'should switch to original window if invoked not for current window' do
76
74
  expect(@session.windows.size).to eq(2)
77
- expect(@session.current_window).to eq(@window)
78
- @other_window.close
75
+ expect(@session.current_window).to eq(orig_window)
76
+ other_window.close
79
77
  expect(@session.windows.size).to eq(1)
80
- expect(@session.current_window).to eq(@window)
78
+ expect(@session.current_window).to eq(orig_window)
81
79
  end
82
80
 
83
81
  it 'should make subsequent invocations of other methods raise no_such_window_error if invoked for current window' do
84
- @session.switch_to_window(@other_window)
85
- expect(@session.current_window).to eq(@other_window)
86
- @other_window.close
82
+ @session.switch_to_window(other_window)
83
+ expect(@session.current_window).to eq(other_window)
84
+ other_window.close
87
85
  expect do
88
86
  @session.find(:css, '#some_id')
89
87
  end.to raise_error(@session.driver.no_such_window_error)
90
- @session.switch_to_window(@window)
88
+ @session.switch_to_window(orig_window)
91
89
  end
92
90
  end
93
91
 
@@ -101,43 +99,41 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
101
99
  end
102
100
 
103
101
  it 'should switch to original window if invoked not for current window' do
104
- @other_window = @session.window_opened_by do
102
+ other_window = @session.window_opened_by do
105
103
  @session.find(:css, '#openWindow').click
106
104
  end
107
105
  sleep 1
108
- size = @session.within_window(@other_window) do
106
+ size = @session.within_window(other_window) do
109
107
  win_size
110
108
  end
111
- expect(@other_window.size).to eq(size)
112
- expect(@session.current_window).to eq(@window)
109
+ expect(other_window.size).to eq(size)
110
+ expect(@session.current_window).to eq(orig_window)
113
111
  end
114
112
  end
115
113
 
116
114
  describe '#resize_to' do
117
- before do
118
- @initial_size = @session.current_window.size
119
- end
115
+ let!(:initial_size) { @session.current_window.size }
120
116
 
121
117
  after do
122
- @session.current_window.resize_to(*@initial_size)
118
+ @session.current_window.resize_to(*initial_size)
123
119
  sleep 1
124
120
  end
125
121
 
126
122
  it 'should be able to resize window', requires: %i[windows js] do
127
- width, height = @initial_size
123
+ width, height = initial_size
128
124
  @session.current_window.resize_to(width - 100, height - 100)
129
125
  sleep 1
130
126
  expect(@session.current_window.size).to eq([width - 100, height - 100])
131
127
  end
132
128
 
133
129
  it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
134
- @other_window = @session.window_opened_by do
130
+ other_window = @session.window_opened_by do
135
131
  @session.find(:css, '#openWindow').click
136
132
  end
137
- @other_window.resize_to(600, 300)
138
- expect(@session.current_window).to eq(@window)
133
+ other_window.resize_to(600, 300)
134
+ expect(@session.current_window).to eq(orig_window)
139
135
 
140
- @session.within_window(@other_window) do
136
+ @session.within_window(other_window) do
141
137
  expect(@session.current_window.size).to eq([600, 300])
142
138
  end
143
139
  end
@@ -169,19 +165,19 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
169
165
  end
170
166
 
171
167
  it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
172
- @other_window = @session.window_opened_by do
168
+ other_window = @session.window_opened_by do
173
169
  @session.find(:css, '#openWindow').click
174
170
  end
175
- @other_window.resize_to(400, 300)
171
+ other_window.resize_to(400, 300)
176
172
  sleep 0.5
177
- @other_window.maximize
173
+ other_window.maximize
178
174
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
179
175
 
180
- expect(@session.current_window).to eq(@window)
176
+ expect(@session.current_window).to eq(orig_window)
181
177
  # Maximizing the browser affects all tabs so this may not be valid in real browsers
182
178
  # expect(@session.current_window.size).to eq(@initial_size)
183
179
 
184
- ow_width, ow_height = @other_window.size
180
+ ow_width, ow_height = other_window.size
185
181
  expect(ow_width).to be > 400
186
182
  expect(ow_height).to be > 300
187
183
  end