watir 6.8.4 → 6.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGES.md +11 -0
- data/README.md +1 -1
- data/lib/watir/alert.rb +1 -1
- data/lib/watir/capabilities.rb +9 -0
- data/lib/watir/cookies.rb +4 -1
- data/lib/watir/elements/element.rb +4 -0
- data/lib/watir/elements/select.rb +12 -8
- data/lib/watir/js_execution.rb +4 -2
- data/lib/watir/locators/element/locator.rb +8 -2
- data/lib/watir/user_editable.rb +3 -1
- data/lib/watirspec.rb +2 -2
- data/lib/watirspec/server/app.rb +26 -12
- data/spec/element_locator_spec.rb +36 -0
- data/spec/element_spec.rb +2 -1
- data/spec/watirspec/cookies_spec.rb +24 -10
- data/spec/watirspec/elements/element_spec.rb +5 -0
- data/spec/watirspec/elements/iframe_spec.rb +4 -0
- data/spec/watirspec/elements/select_list_spec.rb +50 -2
- data/spec/watirspec/elements/text_field_spec.rb +24 -0
- data/watir.gemspec +2 -2
- metadata +10 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c07f7155e0844cc08be4fcdeda576a6c2748cbf8
|
4
|
+
data.tar.gz: aeb56b78fe7c0609e1449a34fff22ff3e8c8ecf3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8a6fb8f40775476021d6b696dff03c2fc9fd634b3b667a97851e4035821f631b2a25d80771f0cfac337273fae47abeb354b7a939c0dbc5bce7761effcbb03429
|
7
|
+
data.tar.gz: ae1c29c9a9e296b8aad4d754e7d2d075b47ca5f8a2b5b581738539939cf9e0631e41feefbbc4c74222f77bcff0b67dd7b41936fc02c17127215d9d0d051e124e
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
### 6.9.0 (2017-11-18)
|
2
|
+
|
3
|
+
* Fix bug in Element#flash
|
4
|
+
* Fix bug with w3c alert handling (thanks Lakshya Kapoor)
|
5
|
+
* Add support for passing multiple options into #select and #select_all (thanks Justin Ko)
|
6
|
+
* Add support for passing multiple parameters into Element#set! (thanks Justin Ko)
|
7
|
+
* Add support for headless Firefox (thanks Lucas Tierney)
|
8
|
+
* Add support for setting cookie expiration by String (thanks Lucas Tierney)
|
9
|
+
* Add support for new class locators to #element and #elements (thanks Justin Ko)
|
10
|
+
* Provide suggestion to look inside IFrame when element not found (thanks Justin Ko)
|
11
|
+
|
1
12
|
### 6.8.4 (2017-09-08)
|
2
13
|
|
3
14
|
* Fix bug with non-visible buttons not being waited on (#648)
|
data/README.md
CHANGED
data/lib/watir/alert.rb
CHANGED
@@ -96,7 +96,7 @@ module Watir
|
|
96
96
|
|
97
97
|
def assert_exists
|
98
98
|
@alert = @browser.driver.switch_to.alert
|
99
|
-
rescue Selenium::WebDriver::Error::NoAlertPresentError
|
99
|
+
rescue Selenium::WebDriver::Error::NoAlertPresentError, Selenium::WebDriver::Error::NoSuchAlertError
|
100
100
|
raise Exception::UnknownObjectException, 'unable to locate alert'
|
101
101
|
end
|
102
102
|
|
data/lib/watir/capabilities.rb
CHANGED
@@ -83,6 +83,11 @@ module Watir
|
|
83
83
|
@selenium_opts[:options] = browser_options
|
84
84
|
Watir.logger.deprecate 'Initializing Browser with both :profile and :option', ':profile as a key inside :option' if profile
|
85
85
|
end
|
86
|
+
if @options.delete(:headless)
|
87
|
+
browser_options ||= {}
|
88
|
+
browser_options[:args] ||= []
|
89
|
+
browser_options[:args] += ['--headless']
|
90
|
+
end
|
86
91
|
@selenium_opts[:options] ||= Selenium::WebDriver::Firefox::Options.new(browser_options)
|
87
92
|
@selenium_opts[:options].profile = profile if profile
|
88
93
|
when :safari
|
@@ -92,6 +97,10 @@ module Watir
|
|
92
97
|
args = @options.delete(:args) || @options.delete(:switches) || []
|
93
98
|
@options['chromeOptions'] = {'args' => args + ['--headless', '--disable-gpu']}
|
94
99
|
end
|
100
|
+
if @browser == :firefox && @options.delete(:headless)
|
101
|
+
args = @options.delete(:args) || @options.delete(:switches) || []
|
102
|
+
@options[Selenium::WebDriver::Firefox::Options.KEY] = {'args' => args + ['--headless']}
|
103
|
+
end
|
95
104
|
if @browser == :safari && @options.delete(:technology_preview)
|
96
105
|
@options["safari.options"] = {'technologyPreview' => true}
|
97
106
|
end
|
data/lib/watir/cookies.rb
CHANGED
@@ -59,7 +59,10 @@ module Watir
|
|
59
59
|
value: value}
|
60
60
|
cookie[:secure] = opts[:secure] if opts.key?(:secure)
|
61
61
|
cookie[:path] = opts[:path] if opts.key?(:path)
|
62
|
-
|
62
|
+
expires = opts[:expires]
|
63
|
+
if expires
|
64
|
+
cookie[:expires] = ::Time.parse(expires) if expires.is_a?(String) else expires
|
65
|
+
end
|
63
66
|
cookie[:domain] = opts[:domain] if opts.key?(:domain)
|
64
67
|
|
65
68
|
@control.add_cookie cookie
|
@@ -655,6 +655,10 @@ module Watir
|
|
655
655
|
begin
|
656
656
|
send exist_check
|
657
657
|
yield
|
658
|
+
rescue unknown_exception => ex
|
659
|
+
msg = ex.message
|
660
|
+
msg += ". Maybe look in an iframe?" if @query_scope.iframes.count > 0
|
661
|
+
raise unknown_exception, msg
|
658
662
|
rescue Selenium::WebDriver::Error::StaleElementReferenceError
|
659
663
|
retry
|
660
664
|
rescue Selenium::WebDriver::Error::ElementNotVisibleError, Selenium::WebDriver::Error::ElementNotInteractableError
|
@@ -41,8 +41,9 @@ module Watir
|
|
41
41
|
# @return [String] The text of the option selected. If multiple options match, returns the first match.
|
42
42
|
#
|
43
43
|
|
44
|
-
def select(str_or_rx)
|
45
|
-
select_by
|
44
|
+
def select(*str_or_rx)
|
45
|
+
results = str_or_rx.flatten.map { |v| select_by v}
|
46
|
+
results.first
|
46
47
|
end
|
47
48
|
|
48
49
|
#
|
@@ -53,8 +54,9 @@ module Watir
|
|
53
54
|
# @return [String] The text of the first option selected.
|
54
55
|
#
|
55
56
|
|
56
|
-
def select_all(str_or_rx)
|
57
|
-
select_all_by
|
57
|
+
def select_all(*str_or_rx)
|
58
|
+
results = str_or_rx.flatten.map { |v| select_all_by v }
|
59
|
+
results.first
|
58
60
|
end
|
59
61
|
|
60
62
|
#
|
@@ -64,8 +66,9 @@ module Watir
|
|
64
66
|
# @raise [Watir::Exception::NoValueFoundException] if the value does not exist.
|
65
67
|
#
|
66
68
|
|
67
|
-
def select!(str_or_rx)
|
68
|
-
select_by!(
|
69
|
+
def select!(*str_or_rx)
|
70
|
+
results = str_or_rx.flatten.map { |v| select_by!(v, :single) }
|
71
|
+
results.first
|
69
72
|
end
|
70
73
|
|
71
74
|
#
|
@@ -75,8 +78,9 @@ module Watir
|
|
75
78
|
# @raise [Watir::Exception::NoValueFoundException] if the value does not exist.
|
76
79
|
#
|
77
80
|
|
78
|
-
def select_all!(str_or_rx)
|
79
|
-
select_by!(
|
81
|
+
def select_all!(*str_or_rx)
|
82
|
+
results = str_or_rx.flatten.map { |v| select_by!(v, :multiple) }
|
83
|
+
results.first
|
80
84
|
end
|
81
85
|
|
82
86
|
#
|
data/lib/watir/js_execution.rb
CHANGED
@@ -43,11 +43,13 @@ module Watir
|
|
43
43
|
# @return [Watir::Element]
|
44
44
|
#
|
45
45
|
|
46
|
-
def flash(color: 'red', flashes:
|
46
|
+
def flash(color: 'red', flashes: 5, delay: 0.2)
|
47
47
|
background_color = style("backgroundColor")
|
48
|
+
background_color = 'white' if background_color.empty?
|
48
49
|
element_color = element_call { execute_js(:backgroundColor, @element) }.strip
|
50
|
+
element_color = 'white' if element_color.empty?
|
49
51
|
|
50
|
-
flashes.times do |n|
|
52
|
+
(flashes * 2).times do |n|
|
51
53
|
nextcolor = n.even? ? color : background_color
|
52
54
|
element_call { execute_js(:backgroundColor, @element, nextcolor) }
|
53
55
|
sleep(delay)
|
@@ -79,7 +79,7 @@ module Watir
|
|
79
79
|
how, what = @selector.to_a.first
|
80
80
|
selector_builder.check_type(how, what)
|
81
81
|
|
82
|
-
if
|
82
|
+
if wd_supported?(how, what)
|
83
83
|
wd_find_first_by(how, what)
|
84
84
|
else
|
85
85
|
find_first_by_multiple
|
@@ -118,7 +118,7 @@ module Watir
|
|
118
118
|
return [what] if how == :element
|
119
119
|
selector_builder.check_type how, what
|
120
120
|
|
121
|
-
if
|
121
|
+
if wd_supported?(how, what)
|
122
122
|
wd_find_all_by(how, what)
|
123
123
|
else
|
124
124
|
find_all_by_multiple
|
@@ -270,6 +270,12 @@ module Watir
|
|
270
270
|
scope.find_elements(how, what)
|
271
271
|
end
|
272
272
|
|
273
|
+
def wd_supported?(how, what)
|
274
|
+
return false unless WD_FINDERS.include?(how)
|
275
|
+
return false unless what.kind_of?(String) || what.kind_of?(Regexp)
|
276
|
+
return false if [:class, :class_name].include?(how) && what.kind_of?(String) && what.include?(' ')
|
277
|
+
true
|
278
|
+
end
|
273
279
|
end
|
274
280
|
end
|
275
281
|
end
|
data/lib/watir/user_editable.rb
CHANGED
@@ -22,7 +22,9 @@ module Watir
|
|
22
22
|
# @param [String] input_value
|
23
23
|
#
|
24
24
|
|
25
|
-
def set!(
|
25
|
+
def set!(*args)
|
26
|
+
raise ArgumentError, "#set! does not support special keys, use #set instead" if args.any? { |v| v.kind_of?(::Symbol) }
|
27
|
+
input_value = args.join
|
26
28
|
set input_value[0]
|
27
29
|
element_call { execute_js(:setValue, @element, input_value[0..-2]) }
|
28
30
|
append(input_value[-1])
|
data/lib/watirspec.rb
CHANGED
@@ -8,8 +8,8 @@ module WatirSpec
|
|
8
8
|
class << self
|
9
9
|
attr_accessor :browser_args, :unguarded, :implementation
|
10
10
|
|
11
|
-
def
|
12
|
-
@
|
11
|
+
def htmls
|
12
|
+
@htmls ||= [File.expand_path("../../spec/watirspec/html", __FILE__)]
|
13
13
|
end
|
14
14
|
|
15
15
|
def run!
|
data/lib/watirspec/server/app.rb
CHANGED
@@ -12,15 +12,15 @@ module WatirSpec
|
|
12
12
|
when %r{/set_cookie}
|
13
13
|
respond("<html>C is for cookie, it's good enough for me</html>", 'Content-Type' => 'text/html', 'Set-Cookie' => 'monster=1')
|
14
14
|
when css_file?
|
15
|
-
respond(
|
15
|
+
respond(file_read(path), 'Content-Type' => 'text/css')
|
16
16
|
when js_file?
|
17
|
-
respond(
|
17
|
+
respond(file_read(path), 'Content-Type' => 'application/javascript')
|
18
18
|
when png_file?
|
19
|
-
respond(
|
19
|
+
respond(file_binread(path), 'Content-Type' => 'image/png')
|
20
20
|
when gif_file?
|
21
|
-
respond(
|
21
|
+
respond(file_read(path), 'Content-Type' => 'image/gif')
|
22
22
|
when static_file?
|
23
|
-
respond(
|
23
|
+
respond(file_read(path))
|
24
24
|
else
|
25
25
|
respond('')
|
26
26
|
end
|
@@ -33,30 +33,44 @@ module WatirSpec
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def css_file?
|
36
|
-
proc { |path|
|
36
|
+
proc { |path| static_file(path) && path.end_with?('.css') }
|
37
37
|
end
|
38
38
|
|
39
39
|
def js_file?
|
40
|
-
proc { |path|
|
40
|
+
proc { |path| static_file(path) && path.end_with?('.js') }
|
41
41
|
end
|
42
42
|
|
43
43
|
def png_file?
|
44
|
-
proc { |path|
|
44
|
+
proc { |path| static_file(path) && path.end_with?('.png') }
|
45
45
|
end
|
46
46
|
|
47
47
|
def gif_file?
|
48
|
-
proc { |path|
|
48
|
+
proc { |path| static_file(path) && path.end_with?('.gif') }
|
49
49
|
end
|
50
50
|
|
51
51
|
def static_file?
|
52
|
-
proc { |path|
|
52
|
+
proc { |path| static_file(path) }
|
53
53
|
end
|
54
54
|
|
55
55
|
def static_files
|
56
|
-
|
57
|
-
|
56
|
+
WatirSpec.htmls.flat_map do |html|
|
57
|
+
Dir["#{html}/**/*"]
|
58
58
|
end
|
59
59
|
end
|
60
|
+
|
61
|
+
def static_file(path)
|
62
|
+
static_files.find do |file|
|
63
|
+
file.end_with?(path)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def file_read(path)
|
68
|
+
File.read(static_file(path))
|
69
|
+
end
|
70
|
+
|
71
|
+
def file_binread(path)
|
72
|
+
File.binread(static_file(path))
|
73
|
+
end
|
60
74
|
end
|
61
75
|
end
|
62
76
|
end
|
@@ -59,6 +59,24 @@ describe Watir::Locators::Element::Locator do
|
|
59
59
|
|
60
60
|
locate_one [:data_view, false]
|
61
61
|
end
|
62
|
+
|
63
|
+
it "handles selector with class attribute presence" do
|
64
|
+
expect_one :xpath, ".//*[@class]"
|
65
|
+
|
66
|
+
locate_one class: true
|
67
|
+
end
|
68
|
+
|
69
|
+
it "handles selector with multiple classes in array" do
|
70
|
+
expect_one :xpath, ".//*[(contains(concat(' ', @class, ' '), ' a ') and contains(concat(' ', @class, ' '), ' b '))]"
|
71
|
+
|
72
|
+
locate_one class: ["a", "b"]
|
73
|
+
end
|
74
|
+
|
75
|
+
it "handles selector with multiple classes in string" do
|
76
|
+
expect_one :xpath, ".//*[contains(concat(' ', @class, ' '), ' a b ')]"
|
77
|
+
|
78
|
+
locate_one class: "a b"
|
79
|
+
end
|
62
80
|
end
|
63
81
|
|
64
82
|
describe "with special cased selectors" do
|
@@ -346,6 +364,24 @@ describe Watir::Locators::Element::Locator do
|
|
346
364
|
:dir , "foo",
|
347
365
|
:title , 'bar']
|
348
366
|
end
|
367
|
+
|
368
|
+
it "handles selector with class attribute presence" do
|
369
|
+
expect_all :xpath, ".//*[@class]"
|
370
|
+
|
371
|
+
locate_all class: true
|
372
|
+
end
|
373
|
+
|
374
|
+
it "handles selector with multiple classes in array" do
|
375
|
+
expect_all :xpath, ".//*[(contains(concat(' ', @class, ' '), ' a ') and contains(concat(' ', @class, ' '), ' b '))]"
|
376
|
+
|
377
|
+
locate_all class: ["a", "b"]
|
378
|
+
end
|
379
|
+
|
380
|
+
it "handles selector with multiple classes in string" do
|
381
|
+
expect_all :xpath, ".//*[contains(concat(' ', @class, ' '), ' a b ')]"
|
382
|
+
|
383
|
+
locate_all class: "a b"
|
384
|
+
end
|
349
385
|
end
|
350
386
|
|
351
387
|
describe "with regexp selectors" do
|
data/spec/element_spec.rb
CHANGED
@@ -92,13 +92,14 @@ describe Watir::Element do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
describe "#hover" do
|
95
|
-
not_compliant_on :internet_explorer, :safari
|
95
|
+
not_compliant_on :internet_explorer, :safari do
|
96
96
|
it "should hover over the element" do
|
97
97
|
browser.goto WatirSpec.url_for('hover.html')
|
98
98
|
link = browser.a
|
99
99
|
|
100
100
|
expect(link.style("font-size")).to eq "10px"
|
101
101
|
link.hover
|
102
|
+
link.wait_until { |l| l.style("font-size") == "20px" }
|
102
103
|
expect(link.style("font-size")).to eq "20px"
|
103
104
|
end
|
104
105
|
end
|
@@ -49,6 +49,18 @@ describe "Browser#cookies" do
|
|
49
49
|
browser.cookies.add 'foo', 'bar'
|
50
50
|
verify_cookies_count 2
|
51
51
|
end
|
52
|
+
|
53
|
+
it 'adds a cookie with a string expires value' do
|
54
|
+
browser.goto set_cookie_url
|
55
|
+
verify_cookies_count 1
|
56
|
+
|
57
|
+
expire_time = Time.now + 10000
|
58
|
+
|
59
|
+
browser.cookies.add 'foo', 'bar', {expires: expire_time.to_s}
|
60
|
+
|
61
|
+
cookie = browser.cookies[:foo]
|
62
|
+
expect(cookie[:expires]).to be_kind_of(Time)
|
63
|
+
end
|
52
64
|
end
|
53
65
|
|
54
66
|
# TODO - Split this up into multiple tests or figure out which parts are not compliant
|
@@ -112,18 +124,20 @@ describe "Browser#cookies" do
|
|
112
124
|
end
|
113
125
|
end
|
114
126
|
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
127
|
+
bug "https://github.com/mozilla/geckodriver/issues/1000", :firefox do
|
128
|
+
describe '#load' do
|
129
|
+
it 'loads cookies from file' do
|
130
|
+
browser.cookies.clear
|
131
|
+
browser.cookies.load file
|
132
|
+
expected = browser.cookies.to_a
|
133
|
+
actual = YAML.load(IO.read(file))
|
121
134
|
|
122
|
-
|
123
|
-
|
124
|
-
|
135
|
+
# https://code.google.com/p/selenium/issues/detail?id=6834
|
136
|
+
expected.each { |cookie| cookie.delete(:expires) }
|
137
|
+
actual.each { |cookie| cookie.delete(:expires) }
|
125
138
|
|
126
|
-
|
139
|
+
expect(actual).to eq(expected)
|
140
|
+
end
|
127
141
|
end
|
128
142
|
end
|
129
143
|
end
|
@@ -308,6 +308,11 @@ describe "Element" do
|
|
308
308
|
it "raises ArgumentError error if selector hash with :css has multiple entries" do
|
309
309
|
expect { browser.div(css: "div", class: "foo").exists? }.to raise_error(ArgumentError)
|
310
310
|
end
|
311
|
+
|
312
|
+
it "finds element by Selenium name locator" do
|
313
|
+
expect(browser.element(name: "new_user_first_name")).to exist
|
314
|
+
expect(browser.element(name: /new_user_first_name/)).to exist
|
315
|
+
end
|
311
316
|
end
|
312
317
|
|
313
318
|
describe '#send_keys' do
|
@@ -151,6 +151,10 @@ describe "IFrame" do
|
|
151
151
|
expect(browser.iframe(index: 0).text_field(name: 'senderElement').value).to eq "new value"
|
152
152
|
end
|
153
153
|
|
154
|
+
it 'will suggest looking in an iframe when iframes exist' do
|
155
|
+
expect {browser.text_field(name: 'senderElement').set('no') }.to raise_unknown_object_exception('Maybe look in an iframe?')
|
156
|
+
end
|
157
|
+
|
154
158
|
describe "#execute_script" do
|
155
159
|
bug "Safari does not strip text", :safari do
|
156
160
|
it "executes the given javascript in the specified frame" do
|
@@ -303,6 +303,18 @@ describe "SelectList" do
|
|
303
303
|
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
|
304
304
|
end
|
305
305
|
|
306
|
+
it "selects each item in an Array" do
|
307
|
+
browser.select_list(name: "new_user_languages").clear
|
308
|
+
browser.select_list(name: "new_user_languages").select(["Danish", "Swedish"])
|
309
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
|
310
|
+
end
|
311
|
+
|
312
|
+
it "selects each item in a parameter list" do
|
313
|
+
browser.select_list(name: "new_user_languages").clear
|
314
|
+
browser.select_list(name: "new_user_languages").select("Danish", "Swedish")
|
315
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
|
316
|
+
end
|
317
|
+
|
306
318
|
bug "https://bugzilla.mozilla.org/show_bug.cgi?id=1255957", :firefox do
|
307
319
|
it "selects empty options" do
|
308
320
|
browser.select_list(id: "delete_user_username").select("")
|
@@ -364,7 +376,7 @@ describe "SelectList" do
|
|
364
376
|
end
|
365
377
|
|
366
378
|
it "raises a TypeError if argument is not a String, Regexp or Numeric" do
|
367
|
-
expect { browser.select_list(id: "new_user_languages").select(
|
379
|
+
expect { browser.select_list(id: "new_user_languages").select({}) }.to raise_error(TypeError)
|
368
380
|
end
|
369
381
|
end
|
370
382
|
|
@@ -416,6 +428,18 @@ describe "SelectList" do
|
|
416
428
|
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
|
417
429
|
end
|
418
430
|
|
431
|
+
it "selects each item in an Array" do
|
432
|
+
browser.select_list(name: "new_user_languages").clear
|
433
|
+
browser.select_list(name: "new_user_languages").select!(["Danish", "Swedish"])
|
434
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
|
435
|
+
end
|
436
|
+
|
437
|
+
it "selects each item in a parameter list" do
|
438
|
+
browser.select_list(name: "new_user_languages").clear
|
439
|
+
browser.select_list(name: "new_user_languages").select!("Danish", "Swedish")
|
440
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "Swedish"]
|
441
|
+
end
|
442
|
+
|
419
443
|
bug "https://bugzilla.mozilla.org/show_bug.cgi?id=1255957", :firefox do
|
420
444
|
it "selects empty options" do
|
421
445
|
browser.select_list(id: "delete_user_username").select!("")
|
@@ -452,7 +476,7 @@ describe "SelectList" do
|
|
452
476
|
|
453
477
|
it "raises a TypeError if argument is not a String, Regexp or Numeric" do
|
454
478
|
browser.select_list(id: "new_user_languages").clear
|
455
|
-
expect { browser.select_list(id: "new_user_languages").select!(
|
479
|
+
expect { browser.select_list(id: "new_user_languages").select!({}) }.to raise_error(TypeError)
|
456
480
|
end
|
457
481
|
end
|
458
482
|
|
@@ -469,6 +493,18 @@ describe "SelectList" do
|
|
469
493
|
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["EN", "NO"]
|
470
494
|
end
|
471
495
|
|
496
|
+
it "selects all options in an Array" do
|
497
|
+
browser.select_list(name: "new_user_languages").clear
|
498
|
+
browser.select_list(name: "new_user_languages").select_all([/ish/, /Latin/])
|
499
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "Swedish", "Azeri - Latin", "Latin"]
|
500
|
+
end
|
501
|
+
|
502
|
+
it "selects all options in a parameter list" do
|
503
|
+
browser.select_list(name: "new_user_languages").clear
|
504
|
+
browser.select_list(name: "new_user_languages").select_all(/ish/, /Latin/)
|
505
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "Swedish", "Azeri - Latin", "Latin"]
|
506
|
+
end
|
507
|
+
|
472
508
|
it "returns the first matching value if there are multiple matches" do
|
473
509
|
expect(browser.select_list(name: "new_user_languages").select_all(/ish/)).to eq "Danish"
|
474
510
|
end
|
@@ -493,6 +529,18 @@ describe "SelectList" do
|
|
493
529
|
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["EN", "NO"]
|
494
530
|
end
|
495
531
|
|
532
|
+
it "selects all options in an Array" do
|
533
|
+
browser.select_list(name: "new_user_languages").clear
|
534
|
+
browser.select_list(name: "new_user_languages").select_all!([/ish/, /Latin/])
|
535
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "Swedish", "Azeri - Latin", "Latin"]
|
536
|
+
end
|
537
|
+
|
538
|
+
it "selects all options in a parameter list" do
|
539
|
+
browser.select_list(name: "new_user_languages").clear
|
540
|
+
browser.select_list(name: "new_user_languages").select_all!(/ish/, /Latin/)
|
541
|
+
expect(browser.select_list(name: "new_user_languages").selected_options.map(&:text)).to eq ["Danish", "EN", "Swedish", "Azeri - Latin", "Latin"]
|
542
|
+
end
|
543
|
+
|
496
544
|
it "returns the first matching value if there are multiple matches" do
|
497
545
|
expect(browser.select_list(name: "new_user_languages").select_all!(/ish/)).to eq "Danish"
|
498
546
|
end
|
@@ -297,6 +297,16 @@ describe "TextField" do
|
|
297
297
|
expect(browser.text_field(name: "new_user_occupation").value).to eq "ijij"
|
298
298
|
end
|
299
299
|
|
300
|
+
it "sets the value to a concatenation of multiple arguments" do
|
301
|
+
browser.text_field(id: 'new_user_email').set('Bye', 'Cruel', 'World')
|
302
|
+
expect(browser.text_field(id: "new_user_email").value).to eq 'ByeCruelWorld'
|
303
|
+
end
|
304
|
+
|
305
|
+
it "sets the value to blank when no arguments are provided" do
|
306
|
+
browser.text_field(id: 'new_user_email').set
|
307
|
+
expect(browser.text_field(id: "new_user_email").value).to eq ''
|
308
|
+
end
|
309
|
+
|
300
310
|
it "raises UnknownObjectException if the text field doesn't exist" do
|
301
311
|
expect { browser.text_field(id: "no_such_id").set('secret') }.to raise_unknown_object_exception
|
302
312
|
end
|
@@ -333,6 +343,20 @@ describe "TextField" do
|
|
333
343
|
expect(browser.text_field(name: "new_user_occupation").value).to eq "ijij"
|
334
344
|
end
|
335
345
|
|
346
|
+
it "sets the value to a concatenation of multiple arguments" do
|
347
|
+
browser.text_field(id: 'new_user_email').set!('Bye', 'Cruel', 'World')
|
348
|
+
expect(browser.text_field(id: "new_user_email").value).to eq 'ByeCruelWorld'
|
349
|
+
end
|
350
|
+
|
351
|
+
it "sets the value to blank when no arguments are provided" do
|
352
|
+
browser.text_field(id: 'new_user_email').set!
|
353
|
+
expect(browser.text_field(id: "new_user_email").value).to eq ''
|
354
|
+
end
|
355
|
+
|
356
|
+
it "raises ArgumentError for special keys" do
|
357
|
+
expect { browser.text_field(id: 'new_user_email').set!('a', :tab) }.to raise_error(ArgumentError)
|
358
|
+
end
|
359
|
+
|
336
360
|
it "raises UnknownObjectException if the text field doesn't exist" do
|
337
361
|
expect { browser.text_field(id: "no_such_id").set!('secret') }.to raise_unknown_object_exception
|
338
362
|
end
|
data/watir.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'watir'
|
5
|
-
s.version = '6.
|
5
|
+
s.version = '6.9.0'
|
6
6
|
s.platform = Gem::Platform::RUBY
|
7
7
|
s.authors = ['Alex Rodionov', 'Titus Fortner']
|
8
8
|
s.email = ['p0deje@gmail.com', 'titusfortner@gmail.com']
|
@@ -29,7 +29,7 @@ It facilitates the writing of automated tests by mimicing the behavior of a user
|
|
29
29
|
s.add_development_dependency 'rake', '~> 0.9.2'
|
30
30
|
s.add_development_dependency 'fuubar'
|
31
31
|
s.add_development_dependency 'nokogiri'
|
32
|
-
s.add_development_dependency 'activesupport', '~>
|
32
|
+
s.add_development_dependency 'activesupport', '~> 4.0', '>= 4.1.11' # for pluralization during code generation
|
33
33
|
s.add_development_dependency 'pry'
|
34
34
|
s.add_development_dependency 'coveralls'
|
35
35
|
s.add_development_dependency 'yard-doctest', '>= 0.1.8'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watir
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 6.
|
4
|
+
version: 6.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Rodionov
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-11-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: selenium-webdriver
|
@@ -121,14 +121,20 @@ dependencies:
|
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
124
|
+
version: '4.0'
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: 4.1.11
|
125
128
|
type: :development
|
126
129
|
prerelease: false
|
127
130
|
version_requirements: !ruby/object:Gem::Requirement
|
128
131
|
requirements:
|
129
132
|
- - "~>"
|
130
133
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
134
|
+
version: '4.0'
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
version: 4.1.11
|
132
138
|
- !ruby/object:Gem::Dependency
|
133
139
|
name: pry
|
134
140
|
requirement: !ruby/object:Gem::Requirement
|