watir 7.0.0.beta1 → 7.0.0.beta5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +7 -3
  3. data/.rubocop.yml +2 -7
  4. data/CHANGES.md +32 -0
  5. data/lib/watir/browser.rb +21 -7
  6. data/lib/watir/capabilities.rb +52 -7
  7. data/lib/watir/elements/date_field.rb +4 -1
  8. data/lib/watir/elements/date_time_field.rb +4 -1
  9. data/lib/watir/elements/element.rb +32 -3
  10. data/lib/watir/elements/font.rb +1 -0
  11. data/lib/watir/elements/iframe.rb +0 -1
  12. data/lib/watir/elements/radio.rb +2 -2
  13. data/lib/watir/elements/select.rb +63 -40
  14. data/lib/watir/has_window.rb +2 -0
  15. data/lib/watir/locators.rb +4 -0
  16. data/lib/watir/locators/element/matcher.rb +1 -1
  17. data/lib/watir/locators/element/selector_builder.rb +0 -3
  18. data/lib/watir/locators/element/selector_builder/xpath.rb +2 -1
  19. data/lib/watir/locators/option/matcher.rb +24 -0
  20. data/lib/watir/locators/option/selector_builder.rb +8 -0
  21. data/lib/watir/locators/option/selector_builder/xpath.rb +37 -0
  22. data/lib/watir/logger.rb +3 -74
  23. data/lib/watir/radio_set.rb +1 -0
  24. data/lib/watir/screenshot.rb +2 -8
  25. data/lib/watir/user_editable.rb +10 -3
  26. data/lib/watir/version.rb +1 -1
  27. data/lib/watir/window.rb +15 -4
  28. data/lib/watir/window_collection.rb +9 -0
  29. data/lib/watirspec.rb +4 -2
  30. data/lib/watirspec/guards.rb +1 -1
  31. data/lib/watirspec/remote_server.rb +2 -6
  32. data/lib/watirspec/server.rb +1 -1
  33. data/spec/spec_helper.rb +0 -10
  34. data/spec/unit/capabilities_spec.rb +198 -48
  35. data/spec/unit/match_elements/element_spec.rb +11 -0
  36. data/spec/watirspec/after_hooks_spec.rb +22 -45
  37. data/spec/watirspec/browser_spec.rb +185 -206
  38. data/spec/watirspec/cookies_spec.rb +47 -52
  39. data/spec/watirspec/drag_and_drop_spec.rb +5 -7
  40. data/spec/watirspec/elements/area_spec.rb +1 -5
  41. data/spec/watirspec/elements/button_spec.rb +4 -8
  42. data/spec/watirspec/elements/checkbox_spec.rb +2 -4
  43. data/spec/watirspec/elements/date_field_spec.rb +13 -16
  44. data/spec/watirspec/elements/date_time_field_spec.rb +14 -13
  45. data/spec/watirspec/elements/dd_spec.rb +3 -4
  46. data/spec/watirspec/elements/del_spec.rb +10 -12
  47. data/spec/watirspec/elements/div_spec.rb +41 -50
  48. data/spec/watirspec/elements/dl_spec.rb +4 -12
  49. data/spec/watirspec/elements/element_spec.rb +155 -89
  50. data/spec/watirspec/elements/elements_spec.rb +8 -9
  51. data/spec/watirspec/elements/filefield_spec.rb +5 -7
  52. data/spec/watirspec/elements/form_spec.rb +1 -1
  53. data/spec/watirspec/elements/forms_spec.rb +3 -5
  54. data/spec/watirspec/elements/frame_spec.rb +17 -22
  55. data/spec/watirspec/elements/iframe_spec.rb +21 -27
  56. data/spec/watirspec/elements/ins_spec.rb +10 -12
  57. data/spec/watirspec/elements/link_spec.rb +24 -26
  58. data/spec/watirspec/elements/links_spec.rb +8 -9
  59. data/spec/watirspec/elements/radio_spec.rb +11 -14
  60. data/spec/watirspec/elements/select_list_spec.rb +248 -117
  61. data/spec/watirspec/elements/span_spec.rb +10 -12
  62. data/spec/watirspec/elements/table_nesting_spec.rb +31 -34
  63. data/spec/watirspec/elements/table_spec.rb +11 -13
  64. data/spec/watirspec/elements/tbody_spec.rb +10 -12
  65. data/spec/watirspec/elements/td_spec.rb +4 -6
  66. data/spec/watirspec/elements/text_field_spec.rb +10 -12
  67. data/spec/watirspec/elements/tr_spec.rb +5 -7
  68. data/spec/watirspec/support/rspec_matchers.rb +1 -1
  69. data/spec/watirspec/user_editable_spec.rb +26 -28
  70. data/spec/watirspec/wait_spec.rb +255 -258
  71. data/spec/watirspec/window_switching_spec.rb +199 -200
  72. data/spec/watirspec_helper.rb +34 -31
  73. data/watir.gemspec +1 -1
  74. metadata +7 -8
  75. data/spec/implementation_spec.rb +0 -24
  76. data/spec/unit/logger_spec.rb +0 -81
@@ -332,6 +332,17 @@ describe Watir::Locators::Element::Matcher do
332
332
  end
333
333
 
334
334
  context 'when matching Regular Expressions' do
335
+ it 'with white space' do
336
+ allow(browser).to receive(:execute_script).and_return("\n match this \n", 'no', 'match this')
337
+
338
+ elements = [wd_element,
339
+ wd_element,
340
+ wd_element]
341
+ @values_to_match = {text: /^match this$/}
342
+
343
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
344
+ end
345
+
335
346
  it 'with tag_name' do
336
347
  elements = [wd_element(tag_name: 'div'),
337
348
  wd_element(tag_name: 'span'),
@@ -85,14 +85,12 @@ describe 'Browser::AfterHooks' do
85
85
  expect(@yield).to be true
86
86
  end
87
87
 
88
- bug 'https://gist.github.com/titusfortner/bd32f27ec2458b3a733d83374d156940', :safari do
89
- it 'runs after_hooks after Element#submit' do
90
- browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
91
- @page_after_hook = proc { @yield = browser.div(id: 'messages').text == 'submit' }
92
- browser.after_hooks.add @page_after_hook
93
- browser.form(id: 'new_user').submit
94
- expect(@yield).to be true
95
- end
88
+ it 'runs after_hooks after Element#submit' do
89
+ browser.goto(WatirSpec.url_for('forms_with_input_elements.html'))
90
+ @page_after_hook = proc { @yield = browser.div(id: 'messages').text == 'submit' }
91
+ browser.after_hooks.add @page_after_hook
92
+ browser.form(id: 'new_user').submit
93
+ expect(@yield).to be true
96
94
  end
97
95
 
98
96
  it 'runs after_hooks after Element#double_click' do
@@ -115,28 +113,6 @@ describe 'Browser::AfterHooks' do
115
113
  expect(@yield).to be true
116
114
  end
117
115
 
118
- it 'runs after_hooks after FramedDriver#switch!' do
119
- browser.goto(WatirSpec.url_for('iframes.html'))
120
- @page_after_hook = proc { @yield = browser.title == 'Iframes' }
121
- browser.after_hooks.add @page_after_hook
122
-
123
- browser.iframe.element(css: '#senderElement').exists?
124
-
125
- expect(@yield).to be true
126
- end
127
-
128
- it 'runs after_hooks after Browser#ensure_context if not @default_context' do
129
- browser.goto(WatirSpec.url_for('iframes.html'))
130
- browser.iframe.element(css: '#senderElement').locate
131
-
132
- @page_after_hook = proc { @yield = browser.title == 'Iframes' }
133
- browser.after_hooks.add @page_after_hook
134
-
135
- browser.locate
136
-
137
- expect(@yield).to be true
138
- end
139
-
140
116
  it 'runs after_hooks after Alert#ok' do
141
117
  browser.goto(WatirSpec.url_for('alerts.html'))
142
118
  @page_after_hook = proc { @yield = browser.title == 'Alerts' }
@@ -187,21 +163,22 @@ describe 'Browser::AfterHooks' do
187
163
  browser.alert.ok
188
164
  end
189
165
 
190
- bug 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException', :safari do
191
- bug 'https://github.com/mozilla/geckodriver/issues/1847', :firefox do
192
- it 'does not raise error when running error checks on closed window' do
193
- url = WatirSpec.url_for('window_switching.html')
194
- @page_after_hook = proc { browser.url }
195
- browser.after_hooks.add @page_after_hook
196
- browser.goto url
197
- browser.a(id: 'open').click
198
-
199
- window = browser.window(title: 'closeable window')
200
- window.use
201
- expect { browser.a(id: 'close').click }.to_not raise_error
202
- browser.original_window.use
203
- end
204
- end
166
+ it 'does not raise error when running error checks on closed window',
167
+ except: {browser: :safari,
168
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'},
169
+ exclude: {browser: :firefox,
170
+ platform: :windows,
171
+ reason: 'https://github.com/mozilla/geckodriver/issues/1847'} do
172
+ url = WatirSpec.url_for('window_switching.html')
173
+ @page_after_hook = proc { browser.url }
174
+ browser.after_hooks.add @page_after_hook
175
+ browser.goto url
176
+ browser.a(id: 'open').click
177
+
178
+ window = browser.window(title: 'closeable window')
179
+ window.use
180
+ expect { browser.a(id: 'close').click }.to_not raise_error
181
+ browser.original_window.use
205
182
  end
206
183
  end
207
184
 
@@ -2,36 +2,56 @@ require 'watirspec_helper'
2
2
 
3
3
  describe 'Browser' do
4
4
  describe '#exists?' do
5
- after do
6
- browser.original_window.use
7
- browser.windows.reject(&:current?).each(&:close)
8
- end
9
-
10
5
  it 'returns true if we are at a page' do
11
6
  browser.goto(WatirSpec.url_for('non_control_elements.html'))
12
7
  expect(browser).to exist
13
8
  end
14
9
 
15
- bug 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException', :safari do
16
- it 'returns false if window is closed' do
17
- browser.goto WatirSpec.url_for('window_switching.html')
18
- browser.a(id: 'open').click
19
- Watir::Wait.until { browser.windows.size == 2 }
20
- browser.window(title: 'closeable window').use
21
- browser.a(id: 'close').click
22
- Watir::Wait.until { browser.windows.size == 1 }
23
- expect(browser.exists?).to be false
24
- end
10
+ it 'returns false if window is closed',
11
+ except: {browser: :safari,
12
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
13
+ browser.goto WatirSpec.url_for('window_switching.html')
14
+ browser.a(id: 'open').click
15
+ browser.windows.wait_until(size: 2)
16
+ browser.window(title: 'closeable window').use
17
+ browser.a(id: 'close').click
18
+ browser.windows.wait_until(size: 1)
19
+ expect(browser.exists?).to be false
20
+ ensure
21
+ browser.windows.restore!
25
22
  end
26
23
 
27
24
  it 'returns false after Browser#close' do
28
25
  browser.close
29
26
  expect(browser).to_not exist
30
- $browser = WatirSpec.new_browser
31
27
  end
32
28
  end
33
29
 
34
- # this should be rewritten - the actual string returned varies a lot between implementations
30
+ describe '#closed?' do
31
+ it 'returns false if not closed' do
32
+ expect(browser).to_not be_closed
33
+ end
34
+
35
+ it 'returns false if window is closed but browser is not',
36
+ except: {browser: :safari,
37
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'} do
38
+ browser.goto WatirSpec.url_for('window_switching.html')
39
+ browser.a(id: 'open').click
40
+ browser.windows.wait_until(size: 2)
41
+ browser.window(title: 'closeable window').use
42
+ browser.a(id: 'close').click
43
+ browser.windows.wait_until(size: 1)
44
+ expect(browser).to_not be_closed
45
+ ensure
46
+ browser.windows.restore!
47
+ end
48
+
49
+ it 'returns false after Browser#close' do
50
+ browser.close
51
+ expect(browser).to be_closed
52
+ end
53
+ end
54
+
35
55
  describe '#html' do
36
56
  it 'returns the DOM of the page as an HTML string' do
37
57
  browser.goto(WatirSpec.url_for('right_click.html'))
@@ -40,14 +60,7 @@ describe 'Browser' do
40
60
  expect(html).to match(/^<html/)
41
61
  expect(html).to include('<meta ')
42
62
  expect(html).to include(' content="text/html; charset=utf-8"')
43
-
44
- not_compliant_on :internet_explorer do
45
- expect(html).to include(' http-equiv="content-type"')
46
- end
47
-
48
- deviates_on :internet_explorer do
49
- expect(html).to include(' http-equiv=content-type')
50
- end
63
+ expect(html).to match(/http-equiv=("|)content-type/)
51
64
  end
52
65
  end
53
66
 
@@ -59,12 +72,8 @@ describe 'Browser' do
59
72
  end
60
73
 
61
74
  describe '#status' do
62
- # for Firefox, this needs to be enabled in
63
- # Preferences -> Content -> Advanced -> Change status bar text
64
- #
65
- # for IE9, this needs to be enabled in
66
- # View => Toolbars -> Status bar
67
- it 'returns the current value of window.status' do
75
+ it 'returns the current value of window.status',
76
+ except: {browser: :ie, reason: 'Status bar not enabled by default'} do
68
77
  browser.goto(WatirSpec.url_for('non_control_elements.html'))
69
78
 
70
79
  browser.execute_script "window.status = 'All done!';"
@@ -72,11 +81,9 @@ describe 'Browser' do
72
81
  end
73
82
  end
74
83
 
75
- bug 'Capitalization issue', :safari do
76
- describe '#name' do
77
- it 'returns browser name' do
78
- expect(browser.name).to eq(WatirSpec.implementation.browser_name)
79
- end
84
+ describe '#name' do
85
+ it 'returns browser name' do
86
+ expect(browser.name).to eq(WatirSpec.implementation.browser_name)
80
87
  end
81
88
  end
82
89
 
@@ -112,12 +119,11 @@ describe 'Browser' do
112
119
  expect(browser.text.strip).to eq 'This is text/plain'
113
120
  end
114
121
 
115
- bug 'Safari does not strip text', :safari do
116
- it 'returns text of top most browsing context' do
117
- browser.goto(WatirSpec.url_for('nested_iframes.html'))
118
- browser.iframe(id: 'two').h3.exists?
119
- expect(browser.text).to eq 'Top Layer'
120
- end
122
+ it 'returns text of top most browsing context', except: {browser: :safari,
123
+ reason: 'Safari does not strip text'} do
124
+ browser.goto(WatirSpec.url_for('nested_iframes.html'))
125
+ browser.iframe(id: 'two').h3.exists?
126
+ expect(browser.text).to eq 'Top Layer'
121
127
  end
122
128
  end
123
129
 
@@ -150,201 +156,181 @@ describe 'Browser' do
150
156
 
151
157
  # TODO: Temporarily disabling this before moving it to unit tests
152
158
  xdescribe '#new' do
153
- not_compliant_on :remote do
154
- context 'with parameters' do
155
- let(:url) { 'http://localhost:4544/wd/hub/' }
156
-
157
- before(:all) do
158
- @original = WatirSpec.implementation.clone
159
-
160
- require 'watirspec/remote_server'
161
- args = ["-Dwebdriver.chrome.driver=#{Webdrivers::Chromedriver.driver_path}",
162
- "-Dwebdriver.gecko.driver=#{Webdrivers::Geckodriver.driver_path}"]
163
- WatirSpec::RemoteServer.new.start(4544, args: args)
164
- browser.close
165
- end
159
+ context 'with parameters', except: {remote: true} do
160
+ let(:url) { 'http://localhost:4544/wd/hub/' }
166
161
 
167
- before(:each) do
168
- @opts = WatirSpec.implementation.browser_args.last
169
- end
162
+ before(:all) do
163
+ @original = WatirSpec.implementation.clone
170
164
 
171
- after(:each) do
172
- @new_browser.close
173
- WatirSpec.implementation = @original.clone
174
- end
165
+ require 'watirspec/remote_server'
166
+ args = ["-Dwebdriver.chrome.driver=#{Webdrivers::Chromedriver.driver_path}",
167
+ "-Dwebdriver.gecko.driver=#{Webdrivers::Geckodriver.driver_path}"]
168
+ WatirSpec::RemoteServer.new.start(4544, args: args)
169
+ browser.close
170
+ end
175
171
 
176
- after(:all) do
177
- $browser = WatirSpec.new_browser
178
- end
172
+ before(:each) do
173
+ @opts = WatirSpec.implementation.browser_args.last
174
+ end
179
175
 
180
- it 'uses remote client based on provided url' do
181
- @opts[:url] = url
182
- @new_browser = WatirSpec.new_browser
176
+ after(:each) do
177
+ @new_browser.close
178
+ WatirSpec.implementation = @original.clone
179
+ end
183
180
 
184
- server_url = @new_browser.driver.instance_variable_get('@bridge').http.instance_variable_get('@server_url')
185
- expect(server_url).to eq URI.parse(url)
186
- end
181
+ it 'uses remote client based on provided url' do
182
+ @opts[:url] = url
183
+ @new_browser = WatirSpec.new_browser
187
184
 
188
- it 'sets client timeout' do
189
- @opts.merge!(url: url, open_timeout: 44, read_timeout: 47)
190
- @new_browser = WatirSpec.new_browser
185
+ server_url = @new_browser.driver.instance_variable_get('@bridge').http.instance_variable_get('@server_url')
186
+ expect(server_url).to eq URI.parse(url)
187
+ end
191
188
 
192
- http = @new_browser.driver.instance_variable_get('@bridge').http
189
+ it 'sets client timeout' do
190
+ @opts.merge!(url: url, open_timeout: 44, read_timeout: 47)
191
+ @new_browser = WatirSpec.new_browser
193
192
 
194
- expect(http.open_timeout).to eq 44
195
- expect(http.read_timeout).to eq 47
196
- end
193
+ http = @new_browser.driver.instance_variable_get('@bridge').http
197
194
 
198
- it 'accepts http_client' do
199
- http_client = Selenium::WebDriver::Remote::Http::Default.new
200
- @opts[:url] = url
201
- @opts[:http_client] = http_client
202
- @new_browser = WatirSpec.new_browser
195
+ expect(http.open_timeout).to eq 44
196
+ expect(http.read_timeout).to eq 47
197
+ end
203
198
 
204
- expect(@new_browser.driver.instance_variable_get('@bridge').http).to eq http_client
205
- end
199
+ it 'accepts http_client' do
200
+ http_client = Selenium::WebDriver::Remote::Http::Default.new
201
+ @opts[:url] = url
202
+ @opts[:http_client] = http_client
203
+ @new_browser = WatirSpec.new_browser
206
204
 
207
- compliant_on :firefox do
208
- it 'accepts Remote::Capabilities instance as :desired_capabilities' do
209
- caps = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
210
- @opts[:url] = url
211
- @opts[:desired_capabilities] = caps
205
+ expect(@new_browser.driver.instance_variable_get('@bridge').http).to eq http_client
206
+ end
212
207
 
213
- msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
214
- expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
215
- expect(@new_browser.driver.capabilities.accept_insecure_certs).to eq true
216
- end
217
- end
208
+ it 'accepts Remote::Capabilities instance as :desired_capabilities', only: {browser: :firefox} do
209
+ caps = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
210
+ @opts[:url] = url
211
+ @opts[:desired_capabilities] = caps
212
+
213
+ msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
214
+ expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
215
+ expect(@new_browser.driver.capabilities.accept_insecure_certs).to eq true
216
+ end
217
+
218
+ it 'accepts individual driver capabilities', only: {browser: :firefox} do
219
+ @opts[:accept_insecure_certs] = true
220
+ @new_browser = WatirSpec.new_browser
221
+
222
+ expect(@new_browser.driver.capabilities[:accept_insecure_certs]).to eq true
223
+ end
224
+
225
+ it 'accepts profile', only: {browser: :firefox} do
226
+ home_page = WatirSpec.url_for('special_chars.html')
227
+ profile = Selenium::WebDriver::Firefox::Profile.new
228
+ profile['browser.startup.homepage'] = home_page
229
+ profile['browser.startup.page'] = 1
230
+ @opts[:profile] = profile
231
+
232
+ @new_browser = WatirSpec.new_browser
233
+
234
+ expect(@new_browser.url).to eq home_page
235
+ end
236
+
237
+ context 'chrome arguments', only: {browser: :chrome} do
238
+ it 'accepts browser options' do
239
+ @opts[:options] = {emulation: {userAgent: 'foo;bar'}}
218
240
 
219
- compliant_on :firefox do
220
- it 'accepts individual driver capabilities' do
221
- @opts[:accept_insecure_certs] = true
222
- @new_browser = WatirSpec.new_browser
241
+ @new_browser = WatirSpec.new_browser
223
242
 
224
- expect(@new_browser.driver.capabilities[:accept_insecure_certs]).to eq true
225
- end
243
+ ua = @new_browser.execute_script 'return window.navigator.userAgent'
244
+ expect(ua).to eq('foo;bar')
226
245
  end
227
246
 
228
- compliant_on :firefox do
229
- it 'accepts profile' do
230
- home_page = WatirSpec.url_for('special_chars.html')
231
- profile = Selenium::WebDriver::Firefox::Profile.new
232
- profile['browser.startup.homepage'] = home_page
233
- profile['browser.startup.page'] = 1
234
- @opts[:profile] = profile
247
+ it 'uses remote client when specifying remote' do
248
+ opts = {desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome,
249
+ url: url}
250
+ WatirSpec.implementation.browser_args = [:remote, opts]
251
+ msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
252
+ expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
253
+ server_url = @new_browser.driver.instance_variable_get('@bridge').http.instance_variable_get('@server_url')
254
+ expect(server_url).to eq URI.parse(url)
255
+ end
235
256
 
236
- @new_browser = WatirSpec.new_browser
257
+ it 'accepts switches argument' do
258
+ @opts.delete :args
259
+ @opts[:switches] = ['--window-size=600,700']
237
260
 
238
- expect(@new_browser.url).to eq home_page
239
- end
261
+ @new_browser = WatirSpec.new_browser
262
+ size = @new_browser.window.size
263
+ expect(size['height']).to eq 700
264
+ expect(size['width']).to eq 600
240
265
  end
241
266
 
242
- compliant_on :chrome do
243
- it 'accepts browser options' do
244
- @opts[:options] = {emulation: {userAgent: 'foo;bar'}}
245
-
246
- @new_browser = WatirSpec.new_browser
247
-
248
- ua = @new_browser.execute_script 'return window.navigator.userAgent'
249
- expect(ua).to eq('foo;bar')
250
- end
251
-
252
- it 'uses remote client when specifying remote' do
253
- opts = {desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome,
254
- url: url}
255
- WatirSpec.implementation.browser_args = [:remote, opts]
256
- msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
257
- expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
258
- server_url = @new_browser.driver.instance_variable_get('@bridge').http.instance_variable_get('@server_url')
259
- expect(server_url).to eq URI.parse(url)
260
- end
261
-
262
- it 'accepts switches argument' do
263
- @opts.delete :args
264
- @opts[:switches] = ['--window-size=600,700']
265
-
266
- @new_browser = WatirSpec.new_browser
267
- size = @new_browser.window.size
268
- expect(size['height']).to eq 700
269
- expect(size['width']).to eq 600
270
- end
271
-
272
- not_compliant_on :headless do
273
- it 'accepts Chrome::Options instance as :options' do
274
- chrome_opts = Selenium::WebDriver::Chrome::Options.new(emulation: {userAgent: 'foo;bar'})
275
- @opts.delete :args
276
- @opts[:options] = chrome_opts
277
-
278
- @new_browser = WatirSpec.new_browser
279
-
280
- ua = @new_browser.execute_script 'return window.navigator.userAgent'
281
- expect(ua).to eq('foo;bar')
282
- end
283
- end
267
+ it 'accepts Chrome::Options instance as :options', except: {headless: true} do
268
+ chrome_opts = Selenium::WebDriver::Chrome::Options.new(emulation: {userAgent: 'foo;bar'})
269
+ @opts.delete :args
270
+ @opts[:options] = chrome_opts
271
+
272
+ @new_browser = WatirSpec.new_browser
273
+
274
+ ua = @new_browser.execute_script 'return window.navigator.userAgent'
275
+ expect(ua).to eq('foo;bar')
284
276
  end
285
277
  end
278
+ end
286
279
 
287
- compliant_on :chrome do
288
- not_compliant_on :watigiri do
289
- it 'takes service as argument' do
290
- @original = WatirSpec.implementation.clone
291
- browser.close
292
- @opts = WatirSpec.implementation.browser_args.last
293
- browser_name = WatirSpec.implementation.browser_args.first
280
+ it 'takes service as argument', only: {browser: :chrome} do
281
+ @original = WatirSpec.implementation.clone
282
+ browser.close
283
+ @opts = WatirSpec.implementation.browser_args.last
284
+ browser_name = WatirSpec.implementation.browser_args.first
294
285
 
295
- service = Selenium::WebDriver::Service.send(browser_name, port: '2314', args: ['foo'])
286
+ service = Selenium::WebDriver::Service.send(browser_name, port: '2314', args: ['foo'])
296
287
 
297
- @opts.merge!(service: service,
298
- listener: LocalConfig::SelectorListener.new)
288
+ @opts.merge!(service: service,
289
+ listener: LocalConfig::SelectorListener.new)
299
290
 
300
- @new_browser = WatirSpec.new_browser
291
+ @new_browser = WatirSpec.new_browser
301
292
 
302
- bridge = @new_browser.wd.instance_variable_get('@bridge')
303
- expect(bridge).to be_a Selenium::WebDriver::Support::EventFiringBridge
304
- service = @new_browser.wd.instance_variable_get('@service')
305
- expect(service.instance_variable_get('@extra_args')).to eq ['foo']
306
- expect(service.instance_variable_get('@port')).to eq 2314
293
+ bridge = @new_browser.wd.instance_variable_get('@bridge')
294
+ expect(bridge).to be_a Selenium::WebDriver::Support::EventFiringBridge
295
+ service = @new_browser.wd.instance_variable_get('@service')
296
+ expect(service.instance_variable_get('@extra_args')).to eq ['foo']
297
+ expect(service.instance_variable_get('@port')).to eq 2314
307
298
 
308
- @new_browser.close
309
- WatirSpec.implementation = @original.clone
310
- $browser = WatirSpec.new_browser
311
- end
312
- end
313
- end
299
+ @new_browser.close
300
+ ensure
301
+ WatirSpec.implementation = @original.clone
302
+ end
314
303
 
315
- it 'takes a driver instance as argument' do
316
- mock_driver = double(Selenium::WebDriver::Driver)
317
- expect(Selenium::WebDriver::Driver).to receive(:===).with(mock_driver).and_return(true)
318
- expect { Watir::Browser.new(mock_driver) }.to_not raise_error
319
- end
304
+ it 'takes a driver instance as argument' do
305
+ mock_driver = double(Selenium::WebDriver::Driver)
306
+ expect(Selenium::WebDriver::Driver).to receive(:===).with(mock_driver).and_return(true)
307
+ expect { Watir::Browser.new(mock_driver) }.to_not raise_error
308
+ end
320
309
 
321
- it 'raises ArgumentError for invalid args' do
322
- expect { Watir::Browser.new(Object.new) }.to raise_error(ArgumentError)
323
- end
310
+ it 'raises ArgumentError for invalid args' do
311
+ expect { Watir::Browser.new(Object.new) }.to raise_error(ArgumentError)
324
312
  end
325
313
  end
326
314
 
327
315
  describe '.start' do
328
316
  it 'goes to the given URL and return an instance of itself' do
329
317
  browser.close
318
+ sleep 1
330
319
  driver, args = WatirSpec.implementation.browser_args
331
320
  b = Watir::Browser.start(WatirSpec.url_for('non_control_elements.html'), driver, args.dup)
332
321
 
333
322
  expect(b).to be_instance_of(Watir::Browser)
334
323
  expect(b.title).to eq 'Non-control elements'
335
324
  b.close
336
- $browser = WatirSpec.new_browser
337
325
  end
338
326
  end
339
327
 
340
328
  describe '#goto' do
341
- not_compliant_on :internet_explorer do
342
- it 'adds http:// to URLs with no URL scheme specified' do
343
- url = WatirSpec.host[%r{http://(.*)}, 1]
344
- expect(url).to_not be_nil
345
- browser.goto(url)
346
- expect(browser.url).to match(%r{http://#{url}/?})
347
- end
329
+ it 'adds http:// to URLs with no URL scheme specified' do
330
+ url = WatirSpec.host[%r{http://(.*)}, 1]
331
+ expect(url).to_not be_nil
332
+ browser.goto(url)
333
+ expect(browser.url).to match(%r{http://#{url}/?})
348
334
  end
349
335
 
350
336
  it 'goes to the given url without raising errors' do
@@ -355,21 +341,18 @@ describe 'Browser' do
355
341
  expect { browser.goto('about:blank') }.to_not raise_error
356
342
  end
357
343
 
358
- not_compliant_on :internet_explorer do
359
- it 'goes to a data URL scheme address without raising errors' do
360
- expect { browser.goto('data:text/html;content-type=utf-8,foobar') }.to_not raise_error
361
- end
344
+ it 'goes to a data URL scheme address without raising errors' do
345
+ expect { browser.goto('data:text/html;content-type=utf-8,foobar') }.to_not raise_error
362
346
  end
363
347
 
364
- compliant_on :chrome do
365
- it "goes to internal Chrome URL 'chrome://settings/browser' without raising errors" do
366
- expect { browser.goto('chrome://settings/browser') }.to_not raise_error
367
- end
348
+ it "goes to internal Chrome URL 'chrome://settings/browser' without raising errors",
349
+ exclusive: {browser: %i[chrome edge]} do
350
+ expect { browser.goto('chrome://settings/browser') }.to_not raise_error
368
351
  end
369
352
 
370
353
  it 'updates the page when location is changed with setTimeout + window.location' do
371
354
  browser.goto(WatirSpec.url_for('timeout_window_location.html'))
372
- Watir::Wait.while { browser.url.include? 'timeout_window_location.html' }
355
+ browser.wait_while { |b| b.url.include? 'timeout_window_location.html' }
373
356
  expect(browser.url).to include('non_control_elements.html')
374
357
  end
375
358
  end
@@ -378,10 +361,7 @@ describe 'Browser' do
378
361
  it 'refreshes the page' do
379
362
  browser.goto(WatirSpec.url_for('non_control_elements.html'))
380
363
 
381
- compliant_on :headless do
382
- browser.div(id: 'best_language').scroll.to
383
- end
384
-
364
+ browser.div(id: 'best_language').scroll.to
385
365
  browser.div(id: 'best_language').click
386
366
  expect(browser.div(id: 'best_language').text).to include('Ruby!')
387
367
  browser.refresh
@@ -501,7 +481,6 @@ describe 'Browser' do
501
481
  browser.close
502
482
 
503
483
  expect { browser.dl(id: 'experience-list').id }.to raise_error(Watir::Exception::Error, 'browser was closed')
504
- $browser = WatirSpec.new_browser
505
484
  end
506
485
 
507
486
  describe '#ready_state' do
@@ -531,8 +510,8 @@ describe 'Browser' do
531
510
  expect(browser.ready_state).to eq 'complete'
532
511
 
533
512
  browser.close
513
+ ensure
534
514
  WatirSpec.implementation = @original.clone
535
- $browser = WatirSpec.new_browser
536
515
  end
537
516
  end
538
517