watir 6.7.3 → 6.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +2 -0
  3. data/CHANGES.md +11 -0
  4. data/lib/watir.rb +4 -1
  5. data/lib/watir/adjacent.rb +1 -1
  6. data/lib/watir/browser.rb +5 -3
  7. data/lib/watir/capabilities.rb +1 -0
  8. data/lib/watir/container.rb +1 -1
  9. data/lib/watir/elements/element.rb +31 -98
  10. data/lib/watir/elements/file_field.rb +1 -1
  11. data/lib/watir/elements/iframe.rb +1 -1
  12. data/lib/watir/elements/image.rb +1 -5
  13. data/lib/watir/elements/input.rb +15 -0
  14. data/lib/watir/elements/radio.rb +17 -0
  15. data/lib/watir/elements/select.rb +67 -20
  16. data/lib/watir/js_execution.rb +141 -0
  17. data/lib/watir/js_snippets.rb +16 -0
  18. data/lib/watir/js_snippets/backgroundColor.js +7 -0
  19. data/lib/watir/{atoms → js_snippets}/fireEvent.js +2 -0
  20. data/lib/watir/js_snippets/focus.js +3 -0
  21. data/lib/watir/{atoms → js_snippets}/getInnerHtml.js +1 -0
  22. data/lib/watir/js_snippets/getInnerText.js +19 -0
  23. data/lib/watir/{atoms → js_snippets}/getOuterHtml.js +2 -0
  24. data/lib/watir/js_snippets/getTextContent.js +19 -0
  25. data/lib/watir/js_snippets/isImageLoaded.js +3 -0
  26. data/lib/watir/js_snippets/selectOptionsLabel.js +10 -0
  27. data/lib/watir/js_snippets/selectOptionsText.js +10 -0
  28. data/lib/watir/js_snippets/selectOptionsValue.js +10 -0
  29. data/lib/watir/{atoms → js_snippets}/selectText.js +3 -0
  30. data/lib/watir/js_snippets/selectedOptions.js +11 -0
  31. data/lib/watir/js_snippets/setValue.js +3 -0
  32. data/lib/watir/locators/element/locator.rb +24 -10
  33. data/lib/watir/radio_set.rb +231 -0
  34. data/lib/watir/user_editable.rb +16 -2
  35. data/lib/watirspec/remote_server.rb +2 -1
  36. data/spec/browser_spec.rb +8 -2
  37. data/spec/spec_helper.rb +1 -0
  38. data/spec/watirspec/elements/div_spec.rb +22 -0
  39. data/spec/watirspec/elements/divs_spec.rb +1 -1
  40. data/spec/watirspec/elements/element_spec.rb +24 -7
  41. data/spec/watirspec/elements/labels_spec.rb +1 -1
  42. data/spec/watirspec/elements/radio_spec.rb +17 -3
  43. data/spec/watirspec/elements/radios_spec.rb +1 -1
  44. data/spec/watirspec/elements/select_list_spec.rb +167 -65
  45. data/spec/watirspec/elements/text_field_spec.rb +36 -0
  46. data/spec/watirspec/html/forms_with_input_elements.html +4 -2
  47. data/spec/watirspec/html/non_control_elements.html +1 -1
  48. data/spec/watirspec/radio_set_spec.rb +340 -0
  49. data/spec/watirspec_helper.rb +14 -1
  50. data/support/doctest_helper.rb +11 -8
  51. data/watir.gemspec +2 -2
  52. metadata +30 -11
  53. data/lib/watir/atoms.rb +0 -22
  54. data/lib/watir/atoms/README +0 -3
  55. data/lib/watir/extensions/select_text.rb +0 -11
@@ -4,7 +4,7 @@ module Watir
4
4
  #
5
5
  # Clear the element, the type in the given value.
6
6
  #
7
- # @param [String, Symbol] *args
7
+ # @param [String, Symbol] args
8
8
  #
9
9
 
10
10
  def set(*args)
@@ -15,10 +15,24 @@ module Watir
15
15
  end
16
16
  alias_method :value=, :set
17
17
 
18
+ #
19
+ # Uses JavaScript to enter most of the given value.
20
+ # Selenium is used to enter the first and last characters
21
+ #
22
+ # @param [String] input_value
23
+ #
24
+
25
+ def set!(input_value)
26
+ set input_value[0]
27
+ element_call { execute_js(:setValue, @element, input_value[0..-2]) }
28
+ append(input_value[-1])
29
+ raise Watir::Exception::Error, "#set! value does not match expected input" unless value == input_value
30
+ end
31
+
18
32
  #
19
33
  # Appends the given value to the text in the text field.
20
34
  #
21
- # @param [String, Symbol] *args
35
+ # @param [String, Symbol] args
22
36
  #
23
37
 
24
38
  def append(*args)
@@ -2,7 +2,7 @@ module WatirSpec
2
2
  class RemoteServer
3
3
  attr_reader :server
4
4
 
5
- def start(port = 4444)
5
+ def start(port = 4444, args: [])
6
6
  require 'selenium/server'
7
7
 
8
8
  @server ||= Selenium::Server.new(jar,
@@ -10,6 +10,7 @@ module WatirSpec
10
10
  log: !!$DEBUG,
11
11
  background: true,
12
12
  timeout: 60)
13
+ args.each { |arg| @server << arg }
13
14
  @server.start
14
15
  at_exit { @server.stop }
15
16
  end
data/spec/browser_spec.rb CHANGED
@@ -11,7 +11,9 @@ describe Watir::Browser do
11
11
  @original = WatirSpec.implementation.clone
12
12
 
13
13
  require 'watirspec/remote_server'
14
- WatirSpec::RemoteServer.new.start(4544)
14
+ args = ["-Dwebdriver.chrome.driver=#{Webdrivers::Chromedriver.send :binary}",
15
+ "-Dwebdriver.gecko.driver=#{Webdrivers::Geckodriver.send :binary}"]
16
+ WatirSpec::RemoteServer.new.start(4544, args: args)
15
17
  browser.close
16
18
  end
17
19
 
@@ -138,10 +140,14 @@ describe Watir::Browser do
138
140
  browser.close
139
141
  @opts = WatirSpec.implementation.browser_args.last
140
142
 
141
- @opts.merge!(port: '2314', driver_opts: {args: ['foo']})
143
+ @opts.merge!(port: '2314',
144
+ driver_opts: {args: ['foo']},
145
+ listener: LocalConfig::SelectorListener.new)
142
146
 
143
147
  @new_browser = WatirSpec.new_browser
144
148
 
149
+ bridge = @new_browser.wd.instance_variable_get('@bridge')
150
+ expect(bridge).to be_a Selenium::WebDriver::Support::EventFiringBridge
145
151
  service = @new_browser.wd.instance_variable_get("@service")
146
152
  expect(service.instance_variable_get("@extra_args")).to eq ["foo"]
147
153
  expect(service.instance_variable_get("@port")).to eq 2314
data/spec/spec_helper.rb CHANGED
@@ -5,6 +5,7 @@ require 'coveralls'
5
5
  Coveralls.wear!
6
6
 
7
7
  require 'watir'
8
+ require 'webdrivers'
8
9
  require 'locator_spec_helper'
9
10
  require 'rspec'
10
11
 
@@ -153,6 +153,21 @@ describe "Div" do
153
153
  expect { browser.div(xpath: "//div[@id='no_such_id']").click }.to raise_unknown_object_exception
154
154
  end
155
155
  end
156
+
157
+ describe "#click!" do
158
+ it "fires events when clicked" do
159
+ expect(browser.div(id: 'best_language').text).to_not eq 'Ruby!'
160
+ browser.div(id: 'best_language').click!
161
+ expect(browser.div(id: 'best_language').text).to eq 'Ruby!'
162
+ end
163
+
164
+ it "raises UnknownObjectException if the element does not exist" do
165
+ expect { browser.div(id: "no_such_id").click! }.to raise_unknown_object_exception
166
+ expect { browser.div(title: "no_such_title").click! }.to raise_unknown_object_exception
167
+ expect { browser.div(index: 1337).click! }.to raise_unknown_object_exception
168
+ expect { browser.div(xpath: "//div[@id='no_such_id']").click! }.to raise_unknown_object_exception
169
+ end
170
+ end
156
171
  end
157
172
 
158
173
  not_compliant_on :safari do
@@ -163,6 +178,13 @@ describe "Div" do
163
178
  expect(messages).to include('double clicked')
164
179
  end
165
180
  end
181
+
182
+ describe "#double_click!" do
183
+ it "fires the ondblclick event" do
184
+ browser.div(id: 'html_test').double_click!
185
+ expect(messages).to include('double clicked')
186
+ end
187
+ end
166
188
  end
167
189
 
168
190
  not_compliant_on :firefox do
@@ -14,7 +14,7 @@ describe "Divs" do
14
14
 
15
15
  describe "#length" do
16
16
  it "returns the number of divs" do
17
- expect(browser.divs.length).to eq 12
17
+ expect(browser.divs.length).to eq 14
18
18
  end
19
19
  end
20
20
 
@@ -99,7 +99,7 @@ describe "Element" do
99
99
  end
100
100
 
101
101
  it "finds finds several elements by arbitrary attribute" do
102
- expect(browser.elements(id: /^new_user/).length).to eq 32
102
+ expect(browser.elements(id: /^new_user/).length).to eq 33
103
103
  end
104
104
 
105
105
  it "finds an element from an element's subtree" do
@@ -366,19 +366,36 @@ describe "Element" do
366
366
  end
367
367
  end
368
368
 
369
+ describe '#text_content' do
370
+ it 'returns inner Text code of element' do
371
+ browser.goto WatirSpec.url_for('non_control_elements.html')
372
+ expect(browser.div(id: 'shown').text_content).to eq('Not shownNot hidden')
373
+ end
374
+ end
375
+
376
+ describe '#inner_text' do
377
+ it 'returns inner HTML code of element' do
378
+ browser.goto WatirSpec.url_for('non_control_elements.html')
379
+ div = browser.div(id: 'shown')
380
+ expect(div.inner_text).to eq('Not hidden')
381
+ end
382
+ end
383
+
369
384
  describe '#inner_html' do
370
385
  it 'returns inner HTML code of element' do
371
- browser.goto WatirSpec.url_for('inner_outer.html')
372
- div = browser.div(id: 'foo')
373
- expect(div.inner_html).to eq('<a href="#">hello</a>')
386
+ browser.goto WatirSpec.url_for('non_control_elements.html')
387
+ div = browser.div(id: 'shown')
388
+ expected_text = "<div id=\"hidden\" style=\"display: none;\">Not shown</div><div>Not hidden</div>"
389
+ expect(div.inner_html).to eq expected_text
374
390
  end
375
391
  end
376
392
 
377
393
  describe '#outer_html' do
378
394
  it 'returns outer (inner + element itself) HTML code of element' do
379
- browser.goto WatirSpec.url_for('inner_outer.html')
380
- div = browser.div(id: 'foo')
381
- expect(div.outer_html).to eq('<div id="foo"><a href="#">hello</a></div>')
395
+ browser.goto WatirSpec.url_for('non_control_elements.html')
396
+ div = browser.div(id: 'shown')
397
+ expected_text = "<div id=\"shown\"><div id=\"hidden\" style=\"display: none;\">Not shown</div><div>Not hidden</div></div>"
398
+ expect(div.outer_html).to eq expected_text
382
399
  end
383
400
  end
384
401
 
@@ -14,7 +14,7 @@ describe "Labels" do
14
14
 
15
15
  describe "#length" do
16
16
  it "returns the number of labels" do
17
- expect(browser.labels.length).to eq 39
17
+ expect(browser.labels.length).to eq 40
18
18
  end
19
19
  end
20
20
 
@@ -15,9 +15,8 @@ describe "Radio" do
15
15
  expect(browser.radio(name: /new_user_newsletter/)).to exist
16
16
  expect(browser.radio(value: "yes")).to exist
17
17
  expect(browser.radio(value: /yes/)).to exist
18
- # TODO: figure out what :text means for a radio button
19
- # browser.radio(text: "yes").to exist
20
- # browser.radio(text: /yes/).to exist
18
+ expect(browser.radio(text: "Yes")).to exist
19
+ expect(browser.radio(text: /Yes/)).to exist
21
20
  expect(browser.radio(class: "huge")).to exist
22
21
  expect(browser.radio(class: /huge/)).to exist
23
22
  expect(browser.radio(index: 0)).to exist
@@ -116,6 +115,21 @@ describe "Radio" do
116
115
  end
117
116
  end
118
117
 
118
+ describe "#text" do
119
+ it "returns the text if the radio exists" do
120
+ expect(browser.radio(id: 'new_user_newsletter_yes').text).to eq "Yes"
121
+ end
122
+
123
+ it "raises UnknownObjectException if the radio doesn't exist" do
124
+ expect { browser.radio(index: 1337).text }.to raise_unknown_object_exception
125
+ end
126
+
127
+ it "returns empty string when there is no label" do
128
+ form = browser.form(id: "new_user")
129
+ expect(form.radio(index: 2).text).to eq ''
130
+ end
131
+ end
132
+
119
133
  describe "#title" do
120
134
  it "returns the title attribute if the radio exists" do
121
135
  expect(browser.radio(id: "new_user_newsletter_no").title).to eq "Traitor!"
@@ -14,7 +14,7 @@ describe "Radios" do
14
14
 
15
15
  describe "#length" do
16
16
  it "returns the number of radios" do
17
- expect(browser.radios.length).to eq 6
17
+ expect(browser.radios.length).to eq 7
18
18
  end
19
19
  end
20
20
 
@@ -102,7 +102,7 @@ describe "SelectList" do
102
102
  expect { browser.select_list(index: 1337).value }.to raise_unknown_object_exception
103
103
  end
104
104
  end
105
-
105
+
106
106
  describe "#text" do
107
107
  not_compliant_on :safari do
108
108
  it "returns the text of the selected option" do
@@ -112,7 +112,7 @@ describe "SelectList" do
112
112
  end
113
113
 
114
114
  it "raises UnknownObjectException if the select list doesn't exist" do
115
- expect {browser.select_list(index: 1337).text}.to raise_unknown_object_exception
115
+ expect { browser.select_list(index: 1337).text }.to raise_unknown_object_exception
116
116
  end
117
117
  end
118
118
  end
@@ -178,7 +178,7 @@ describe "SelectList" do
178
178
 
179
179
  it "gets the currently selected item(s)" do
180
180
  expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Norway"]
181
- expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["English", "Norwegian"]
181
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["EN", "NO"]
182
182
  end
183
183
  end
184
184
 
@@ -255,52 +255,58 @@ describe "SelectList" do
255
255
  end
256
256
  end
257
257
 
258
- not_compliant_on :safari do
259
- describe "#select" do
260
- context "when interacting with options" do
261
- it "selects the given item when given a String" do
262
- browser.select_list(name: "new_user_country").select("Denmark")
263
- expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Denmark"]
264
- end
258
+ describe "#select" do
259
+ context "when finding by value" do
260
+ it "selects an option with a String" do
261
+ browser.select_list(name: "new_user_languages").clear
262
+ browser.select_list(name: "new_user_languages").select("2")
263
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq %w[EN]
264
+ end
265
265
 
266
- it "selects options by label" do
267
- browser.select_list(name: "new_user_country").select("Germany")
268
- expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Germany"]
269
- end
266
+ it "selects an option with a Regexp" do
267
+ browser.select_list(name: "new_user_languages").clear
268
+ browser.select_list(name: "new_user_languages").select(/1|3/)
269
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq %w[Danish NO]
270
+ end
271
+ end
270
272
 
271
- it "selects the given item when given a Regexp" do
272
- browser.select_list(name: "new_user_country").select(/Denmark/)
273
- expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Denmark"]
274
- end
273
+ context "when finding by text" do
274
+ it "selects an option with a String" do
275
+ browser.select_list(name: "new_user_country").select("Denmark")
276
+ expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Denmark"]
277
+ end
275
278
 
276
- it "selects the given item when given an Xpath" do
277
- browser.select_list(xpath: "//select[@name='new_user_country']").select("Denmark")
278
- expect(browser.select_list(xpath: "//select[@name='new_user_country']").selected_options.map(&:text)).to eq ["Denmark"]
279
- end
279
+ it "selects an option with a Regexp" do
280
+ browser.select_list(name: "new_user_country").select(/Denmark/)
281
+ expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Denmark"]
282
+ end
283
+ end
280
284
 
281
- it "selects multiple items using :name and a String" do
282
- browser.select_list(name: "new_user_languages").clear
283
- browser.select_list(name: "new_user_languages").select("Danish")
284
- browser.select_list(name: "new_user_languages").select("Swedish")
285
- expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
286
- end
285
+ context "when finding by label" do
286
+ it "selects an option with a String" do
287
+ browser.select_list(name: "new_user_languages").clear
288
+ browser.select_list(name: "new_user_languages").select("NO")
289
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["NO"]
290
+ end
287
291
 
288
- it "selects multiple items using :name and a Regexp" do
289
- browser.select_list(name: "new_user_languages").clear
290
- browser.select_list(name: "new_user_languages").select_all(/ish/)
291
- expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "English", "Swedish"]
292
- end
292
+ it "selects an option with a Regexp" do
293
+ browser.select_list(name: "new_user_languages").clear
294
+ browser.select_list(name: "new_user_languages").select(/^N/)
295
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["NO"]
296
+ end
297
+ end
293
298
 
294
- it "selects multiple items using :xpath" do
295
- browser.select_list(xpath: "//select[@name='new_user_languages']").clear
296
- browser.select_list(xpath: "//select[@name='new_user_languages']").select_all(/ish/)
297
- expect(browser.select_list(xpath: "//select[@name='new_user_languages']").selected_options.map(&:text)).to eq ["Danish", "English", "Swedish"]
298
- end
299
+ it "selects multiple options successiveley" do
300
+ browser.select_list(name: "new_user_languages").clear
301
+ browser.select_list(name: "new_user_languages").select("Danish")
302
+ browser.select_list(name: "new_user_languages").select("Swedish")
303
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
304
+ end
299
305
 
300
- it "selects empty options" do
301
- browser.select_list(id: "delete_user_username").select("")
302
- expect(browser.select_list(id: "delete_user_username").selected_options.map(&:text)).to eq [""]
303
- end
306
+ bug "https://bugzilla.mozilla.org/show_bug.cgi?id=1255957", :firefox do
307
+ it "selects empty options" do
308
+ browser.select_list(id: "delete_user_username").select("")
309
+ expect(browser.select_list(id: "delete_user_username").selected_options.map(&:text)).to eq [""]
304
310
  end
305
311
  end
306
312
 
@@ -308,10 +314,6 @@ describe "SelectList" do
308
314
  expect(browser.select_list(name: "new_user_languages").select("Danish")).to eq "Danish"
309
315
  end
310
316
 
311
- it "returns the first matching value if there are multiple matches" do
312
- expect(browser.select_list(name: "new_user_languages").select_all(/ish/)).to eq "Danish"
313
- end
314
-
315
317
  not_compliant_on :safari do
316
318
  it "fires onchange event when selecting an item" do
317
319
  browser.select_list(id: "new_user_languages").select("Danish")
@@ -326,13 +328,7 @@ describe "SelectList" do
326
328
  browser.select_list(id: "new_user_languages").select("English")
327
329
  expect(messages.size).to eq 3
328
330
  end
329
- end
330
331
 
331
- it "returns the text of the selected option" do
332
- expect(browser.select_list(id: "new_user_languages").select("English")).to eq "English"
333
- end
334
-
335
- not_compliant_on :safari do
336
332
  it "returns an empty string when selecting an option that disappears when selected" do
337
333
  expect(browser.select_list(id: 'obsolete').select('sweden')).to eq ''
338
334
  end
@@ -350,7 +346,7 @@ describe "SelectList" do
350
346
  Watir.default_timeout = 2
351
347
  begin
352
348
  start_time = ::Time.now
353
- expect {select_list.select('No')}.to raise_error Watir::Exception::NoValueFoundException
349
+ expect { select_list.select('No') }.to raise_error Watir::Exception::NoValueFoundException
354
350
  expect(::Time.now - start_time).to be > 2
355
351
  ensure
356
352
  Watir.default_timeout = 30
@@ -372,26 +368,132 @@ describe "SelectList" do
372
368
  end
373
369
  end
374
370
 
375
- # deprecate?
376
- not_compliant_on :safari do
377
- describe "#select_value" do
378
- it "selects the item by value string" do
371
+ describe "#select!" do
372
+ context "when finding by value" do
373
+ it "selects an option with a String" do
374
+ browser.select_list(name: "new_user_languages").clear
375
+ browser.select_list(name: "new_user_languages").select!("2")
376
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq %w[EN]
377
+ end
378
+
379
+ it "selects an option with a Regex" do
380
+ browser.select_list(name: "new_user_languages").clear
381
+ browser.select_list(name: "new_user_languages").select!(/2/)
382
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq %w[EN]
383
+ end
384
+ end
385
+
386
+ context "when finding by text" do
387
+ it "selects an option with a String" do
388
+ browser.select_list(name: "new_user_country").select!("Denmark")
389
+ expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Denmark"]
390
+ end
391
+
392
+ it "selects an option with a Regexp" do
393
+ browser.select_list(name: "new_user_country").select!(/Denmark/)
394
+ expect(browser.select_list(name: "new_user_country").selected_options.map(&:text)).to eq ["Denmark"]
395
+ end
396
+ end
397
+
398
+ context "when finding by label" do
399
+ it "selects an option with a String" do
379
400
  browser.select_list(name: "new_user_languages").clear
380
- browser.select_list(name: "new_user_languages").select_value("2")
381
- expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq %w[English]
401
+ browser.select_list(name: "new_user_languages").select!("NO")
402
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["NO"]
382
403
  end
383
404
 
384
- it "selects the items by value regexp" do
405
+ it "selects an option with a Regexp" do
385
406
  browser.select_list(name: "new_user_languages").clear
386
- browser.select_list(name: "new_user_languages").select_value(/1|3/)
387
- expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq %w[Danish Norwegian]
407
+ browser.select_list(name: "new_user_languages").select!(/NO/)
408
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["NO"]
388
409
  end
410
+ end
389
411
 
390
- it "raises NoValueFoundException if the option doesn't exist" do
391
- expect { browser.select_list(name: "new_user_languages").select_value("no_such_option") }.to raise_no_value_found_exception
392
- expect { browser.select_list(name: "new_user_languages").select_value(/no_such_option/) }.to raise_no_value_found_exception
412
+ it "selects multiple items successively" do
413
+ browser.select_list(name: "new_user_languages").clear
414
+ browser.select_list(name: "new_user_languages").select!("Danish")
415
+ browser.select_list(name: "new_user_languages").select!("Swedish")
416
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
417
+ end
418
+
419
+ bug "https://bugzilla.mozilla.org/show_bug.cgi?id=1255957", :firefox do
420
+ it "selects empty options" do
421
+ browser.select_list(id: "delete_user_username").select!("")
422
+ expect(browser.select_list(id: "delete_user_username").selected_options.map(&:text)).to eq [""]
393
423
  end
394
424
  end
425
+
426
+ it "returns the value selected" do
427
+ browser.select_list(name: "new_user_languages").clear
428
+ expect(browser.select_list(name: "new_user_languages").select!("Danish")).to eq "Danish"
429
+ end
430
+
431
+ it "selects options with a single-quoted value" do
432
+ browser.select_list(id: 'single-quote').select!("'foo'")
433
+ end
434
+
435
+ it "raises NoValueFoundException if the option doesn't exist" do
436
+ expect { browser.select_list(id: "new_user_country").select!("missing_option") }.to raise_no_value_found_exception
437
+ expect { browser.select_list(id: "new_user_country").select!(/missing_option/) }.to raise_no_value_found_exception
438
+ end
439
+
440
+ it "raises ObjectDisabledException if the option is disabled" do
441
+ browser.select_list(id: "new_user_languages").clear
442
+ expect { browser.select_list(id: "new_user_languages").select!("Russian") }.to raise_object_disabled_exception
443
+ end
444
+
445
+ it "raises a TypeError if argument is not a String, Regexp or Numeric" do
446
+ browser.select_list(id: "new_user_languages").clear
447
+ expect { browser.select_list(id: "new_user_languages").select!([]) }.to raise_error(TypeError)
448
+ end
449
+ end
450
+
451
+ describe "#select_all" do
452
+ it "selects multiple options based on text" do
453
+ browser.select_list(name: "new_user_languages").clear
454
+ browser.select_list(name: "new_user_languages").select_all(/ish/)
455
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "Swedish"]
456
+ end
457
+
458
+ it "selects multiple options based on labels" do
459
+ browser.select_list(name: "new_user_languages").clear
460
+ browser.select_list(name: "new_user_languages").select_all(/NO|EN/)
461
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["EN", "NO"]
462
+ end
463
+
464
+ it "returns the first matching value if there are multiple matches" do
465
+ expect(browser.select_list(name: "new_user_languages").select_all(/ish/)).to eq "Danish"
466
+ end
467
+ end
468
+
469
+ describe "#select_all!" do
470
+ it "selects multiple options based on value" do
471
+ browser.select_list(name: "new_user_languages").clear
472
+ browser.select_list(name: "new_user_languages").select_all!(/\d+/)
473
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "NO", "Russian"]
474
+ end
475
+
476
+ it "selects multiple options based on text" do
477
+ browser.select_list(name: "new_user_languages").clear
478
+ browser.select_list(name: "new_user_languages").select_all!(/ish/)
479
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "Swedish"]
480
+ end
481
+
482
+ it "selects multiple options based on labels" do
483
+ browser.select_list(name: "new_user_languages").clear
484
+ browser.select_list(name: "new_user_languages").select_all!(/NO|EN/)
485
+ expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["EN", "NO"]
486
+ end
487
+
488
+ it "returns the first matching value if there are multiple matches" do
489
+ expect(browser.select_list(name: "new_user_languages").select_all!(/ish/)).to eq "Danish"
490
+ end
491
+ end
492
+
493
+ # deprecate?
494
+ not_compliant_on :safari do
495
+ describe "#select_value" do
496
+ end
395
497
  end
396
498
 
397
499
  end