watir 6.0.0.beta3 → 6.0.0.beta4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -7
- data/CHANGES.md +8 -0
- data/lib/watir.rb +35 -19
- data/lib/watir/atoms.rb +0 -1
- data/lib/watir/browser.rb +2 -2
- data/lib/watir/element_collection.rb +7 -7
- data/lib/watir/elements/element.rb +33 -37
- data/lib/watir/elements/iframe.rb +6 -6
- data/lib/watir/elements/text_field.rb +1 -1
- data/lib/watir/locators.rb +1 -0
- data/lib/watir/locators/element/locator.rb +13 -13
- data/lib/watir/locators/element/selector_builder.rb +4 -21
- data/lib/watir/locators/row/selector_builder.rb +1 -1
- data/lib/watir/wait.rb +18 -2
- data/spec/browser_spec.rb +12 -14
- data/spec/element_locator_spec.rb +21 -116
- data/spec/element_spec.rb +1 -5
- data/spec/spec_helper.rb +0 -8
- data/support/travis.sh +3 -1
- data/watir.gemspec +1 -1
- metadata +2 -6
- data/lib/watir/atoms/getAttribute.js +0 -18
- data/lib/watir/locators/element/selector_builder/css.rb +0 -65
- data/spec/always_locate_spec.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 04b089bcf4e58208a441dedb2d2404b8e20e2967
|
4
|
+
data.tar.gz: 1994d0b6cc7f8c5c763da8558447f73bade0d3b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4cdae8a09deebfaab7adb7cf413d5f3a4043485d716fa52c87deadf00d6c4d46e8644d9e16c1b1c285abdc4e6f5fe3104f10ace01264b897332835169d0003d7
|
7
|
+
data.tar.gz: b220f0b235362602d735a17967c8e87859f864a65df54145ff87ed1a08ed4b650a07908e64513f2adaf558f1d5713dd2d35cd9e84b0e4b66b4e5edf65e2d8239
|
data/.travis.yml
CHANGED
@@ -2,7 +2,7 @@ sudo: false
|
|
2
2
|
rvm:
|
3
3
|
- 2.1
|
4
4
|
- 2.2
|
5
|
-
- 2.3.
|
5
|
+
- 2.3.1
|
6
6
|
addons:
|
7
7
|
firefox: latest
|
8
8
|
apt:
|
@@ -24,12 +24,6 @@ before_script:
|
|
24
24
|
script: bundle exec rake $RAKE_TASK
|
25
25
|
env:
|
26
26
|
- RAKE_TASK=spec:firefox
|
27
|
-
- RAKE_TASK=spec:firefox ALWAYS_LOCATE=false
|
28
|
-
- RAKE_TASK=spec:firefox PREFER_CSS=1 SELECTOR_STATS=1
|
29
27
|
- RAKE_TASK=spec:chrome
|
30
|
-
- RAKE_TASK=spec:chrome ALWAYS_LOCATE=false
|
31
|
-
- RAKE_TASK=spec:chrome PREFER_CSS=1 SELECTOR_STATS=1
|
32
28
|
- RAKE_TASK=spec:phantomjs
|
33
|
-
- RAKE_TASK=spec:phantomjs ALWAYS_LOCATE=false
|
34
|
-
- RAKE_TASK=spec:phantomjs PREFER_CSS=1 SELECTOR_STATS=1
|
35
29
|
- RAKE_TASK=yard:doctest
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
### 6.0.0.beta4 (2016-09-12)
|
2
|
+
|
3
|
+
* Deprecate Watir#prefer_css setting
|
4
|
+
* Deprecate Watir#always_locate setting
|
5
|
+
* Add `Element#stale?`
|
6
|
+
* Add `Element#wait_until_stale`
|
7
|
+
* Allow locating date/time/etc. input types with `#text_field` (#295)
|
8
|
+
|
1
9
|
### 6.0.0.beta3 (2016-08-07)
|
2
10
|
|
3
11
|
* Deprecate `require "watir-webdriver"` in favor of `require "watir"`
|
data/lib/watir.rb
CHANGED
@@ -14,45 +14,61 @@ require 'watir/screenshot'
|
|
14
14
|
require 'watir/after_hooks'
|
15
15
|
|
16
16
|
module Watir
|
17
|
-
@always_locate = true
|
18
17
|
|
19
18
|
class << self
|
20
|
-
def always_locate?
|
21
|
-
@always_locate
|
22
|
-
end
|
23
19
|
|
24
20
|
#
|
25
|
-
# Whether or not Watir should
|
26
|
-
# Defaults to true.
|
21
|
+
# Whether or not Watir should re-locate a stale Element on use.
|
27
22
|
#
|
28
23
|
|
29
|
-
def always_locate
|
30
|
-
|
24
|
+
def always_locate?
|
25
|
+
always_locate_message
|
26
|
+
true
|
31
27
|
end
|
32
28
|
|
33
|
-
def
|
34
|
-
|
29
|
+
def always_locate=(_bool)
|
30
|
+
always_locate_message
|
31
|
+
end
|
32
|
+
|
33
|
+
def always_locate_message
|
34
|
+
warn <<-EOS
|
35
|
+
Watir#always_locate is deprecated; elements are always cached and will always
|
36
|
+
be re-located if they go stale before use.
|
37
|
+
Use Element#stale? or Element#wait_until_stale if needed for flow control.
|
38
|
+
EOS
|
35
39
|
end
|
36
40
|
|
37
41
|
#
|
38
|
-
#
|
42
|
+
# Whether or not Watir should prefer CSS when translating the Watir selectors to Selenium.
|
39
43
|
#
|
40
44
|
|
41
|
-
def
|
42
|
-
|
45
|
+
def prefer_css?
|
46
|
+
prefer_css_message
|
47
|
+
false
|
43
48
|
end
|
44
49
|
|
45
|
-
def prefer_css
|
46
|
-
|
50
|
+
def prefer_css=(_bool)
|
51
|
+
prefer_css_message
|
52
|
+
end
|
53
|
+
|
54
|
+
def prefer_css_message
|
55
|
+
warn <<-EOS
|
56
|
+
Watir#prefer_css is deprecated; all elements that can not be passed directly
|
57
|
+
as Selenium locators will be translated to XPath. To continue using CSS Selectors
|
58
|
+
require the watir_css gem - https://github.com/watir/watir_css
|
59
|
+
EOS
|
60
|
+
end
|
61
|
+
|
62
|
+
def default_timeout
|
63
|
+
@default_timeout ||= 30
|
47
64
|
end
|
48
65
|
|
49
66
|
#
|
50
|
-
#
|
51
|
-
# Defaults to false.
|
67
|
+
# Default wait time for wait methods.
|
52
68
|
#
|
53
69
|
|
54
|
-
def
|
55
|
-
@
|
70
|
+
def default_timeout=(value)
|
71
|
+
@default_timeout = value
|
56
72
|
end
|
57
73
|
|
58
74
|
def locator_namespace
|
data/lib/watir/atoms.rb
CHANGED
data/lib/watir/browser.rb
CHANGED
@@ -7,8 +7,8 @@ module Watir
|
|
7
7
|
class ElementCollection
|
8
8
|
include Enumerable
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
10
|
+
def initialize(query_scope, selector)
|
11
|
+
@query_scope = query_scope
|
12
12
|
@selector = selector
|
13
13
|
end
|
14
14
|
|
@@ -50,7 +50,7 @@ module Watir
|
|
50
50
|
#
|
51
51
|
|
52
52
|
def [](idx)
|
53
|
-
to_a[idx] || element_class.new(@
|
53
|
+
to_a[idx] || element_class.new(@query_scope, @selector.merge(index: idx))
|
54
54
|
end
|
55
55
|
|
56
56
|
#
|
@@ -81,17 +81,17 @@ module Watir
|
|
81
81
|
|
82
82
|
def to_a
|
83
83
|
# TODO: optimize - lazy element_class instance?
|
84
|
-
@to_a ||= elements.map { |e| element_class.new(@
|
84
|
+
@to_a ||= elements.map { |e| element_class.new(@query_scope, element: e) }
|
85
85
|
end
|
86
86
|
|
87
87
|
private
|
88
88
|
|
89
89
|
def elements
|
90
|
-
@
|
90
|
+
@query_scope.is_a?(IFrame) ? @query_scope.switch_to! : @query_scope.send(:assert_exists)
|
91
91
|
|
92
92
|
element_validator = element_validator_class.new
|
93
|
-
selector_builder = selector_builder_class.new(@
|
94
|
-
locator = locator_class.new(@
|
93
|
+
selector_builder = selector_builder_class.new(@query_scope, @selector, element_class.attribute_list)
|
94
|
+
locator = locator_class.new(@query_scope, @selector, selector_builder, element_validator)
|
95
95
|
|
96
96
|
@elements ||= locator.locate_all
|
97
97
|
end
|
@@ -22,10 +22,10 @@ module Watir
|
|
22
22
|
attribute String, :id, :id
|
23
23
|
attribute String, :class_name, :className
|
24
24
|
|
25
|
-
def initialize(
|
26
|
-
@
|
25
|
+
def initialize(query_scope, selector)
|
26
|
+
@query_scope = query_scope
|
27
27
|
@selector = selector
|
28
|
-
@element
|
28
|
+
@element = nil
|
29
29
|
|
30
30
|
unless @selector.kind_of? Hash
|
31
31
|
raise ArgumentError, "invalid argument: #{selector.inspect}"
|
@@ -371,7 +371,7 @@ module Watir
|
|
371
371
|
e = element_call { execute_atom :getParentElement, @element }
|
372
372
|
|
373
373
|
if e.kind_of?(Selenium::WebDriver::Element)
|
374
|
-
Watir.element_class_for(e.tag_name.downcase).new(@
|
374
|
+
Watir.element_class_for(e.tag_name.downcase).new(@query_scope, element: e)
|
375
375
|
end
|
376
376
|
end
|
377
377
|
|
@@ -380,7 +380,7 @@ module Watir
|
|
380
380
|
#
|
381
381
|
|
382
382
|
def driver
|
383
|
-
@
|
383
|
+
@query_scope.driver
|
384
384
|
end
|
385
385
|
|
386
386
|
#
|
@@ -407,6 +407,7 @@ module Watir
|
|
407
407
|
# Returns true if this element is present and enabled on the page.
|
408
408
|
#
|
409
409
|
# @return [Boolean]
|
410
|
+
# @see Watir::Wait
|
410
411
|
#
|
411
412
|
|
412
413
|
def enabled?
|
@@ -480,7 +481,7 @@ module Watir
|
|
480
481
|
klass = Watir.element_class_for(tag_name)
|
481
482
|
end
|
482
483
|
|
483
|
-
klass.new(@
|
484
|
+
klass.new(@query_scope, element: elem)
|
484
485
|
end
|
485
486
|
|
486
487
|
#
|
@@ -490,7 +491,22 @@ module Watir
|
|
490
491
|
#
|
491
492
|
|
492
493
|
def browser
|
493
|
-
@
|
494
|
+
@query_scope.browser
|
495
|
+
end
|
496
|
+
|
497
|
+
#
|
498
|
+
# Returns true if a previously located element is no longer attached to DOM.
|
499
|
+
#
|
500
|
+
# @return [Boolean]
|
501
|
+
# @see Watir::Wait
|
502
|
+
#
|
503
|
+
|
504
|
+
def stale?
|
505
|
+
raise Watir::Exception::Error, "Can not check staleness of unused element" unless @element
|
506
|
+
@element.enabled? # any wire call will check for staleness
|
507
|
+
false
|
508
|
+
rescue Selenium::WebDriver::Error::ObsoleteElementError
|
509
|
+
true
|
494
510
|
end
|
495
511
|
|
496
512
|
protected
|
@@ -508,29 +524,16 @@ module Watir
|
|
508
524
|
assert_element_found
|
509
525
|
end
|
510
526
|
|
511
|
-
# Ensure that the element isn't stale, by relocating if it is
|
527
|
+
# Ensure that the element isn't stale, by relocating if it is
|
512
528
|
def ensure_not_stale
|
529
|
+
ensure_context
|
530
|
+
|
513
531
|
# Performance shortcut; only need recursive call to ensure context if stale in current context
|
514
532
|
return unless stale?
|
515
|
-
|
516
|
-
ensure_context
|
517
|
-
if stale?
|
518
|
-
if Watir.always_locate? && !@selector[:element]
|
519
|
-
@element = locate
|
520
|
-
else
|
521
|
-
reset!
|
522
|
-
end
|
523
|
-
end
|
533
|
+
@element = @selector.key?(:element) ? nil : locate
|
524
534
|
assert_element_found
|
525
535
|
end
|
526
536
|
|
527
|
-
def stale?
|
528
|
-
@element.enabled? # any wire call will check for staleness
|
529
|
-
false
|
530
|
-
rescue Selenium::WebDriver::Error::ObsoleteElementError
|
531
|
-
true
|
532
|
-
end
|
533
|
-
|
534
537
|
def assert_element_found
|
535
538
|
unless @element
|
536
539
|
raise UnknownObjectException, "unable to locate element, using #{selector_string}"
|
@@ -545,8 +548,8 @@ module Watir
|
|
545
548
|
ensure_context
|
546
549
|
|
547
550
|
element_validator = element_validator_class.new
|
548
|
-
selector_builder = selector_builder_class.new(@
|
549
|
-
locator = locator_class.new(@
|
551
|
+
selector_builder = selector_builder_class.new(@query_scope, @selector, self.class.attribute_list)
|
552
|
+
locator = locator_class.new(@query_scope, @selector, selector_builder, element_validator)
|
550
553
|
|
551
554
|
locator.locate
|
552
555
|
end
|
@@ -581,14 +584,11 @@ module Watir
|
|
581
584
|
|
582
585
|
# Ensure the driver is in the desired browser context
|
583
586
|
def ensure_context
|
584
|
-
@
|
587
|
+
@query_scope.is_a?(IFrame) ? @query_scope.switch_to! : @query_scope.assert_exists
|
585
588
|
end
|
586
589
|
|
587
|
-
def attribute?(
|
588
|
-
|
589
|
-
element_call do
|
590
|
-
!!execute_atom(:getAttribute, @element, attribute.to_s.downcase)
|
591
|
-
end
|
590
|
+
def attribute?(attribute_name)
|
591
|
+
!attribute_value(attribute_name).nil?
|
592
592
|
end
|
593
593
|
|
594
594
|
def assert_enabled
|
@@ -620,11 +620,7 @@ module Watir
|
|
620
620
|
def element_call
|
621
621
|
yield
|
622
622
|
rescue Selenium::WebDriver::Error::StaleElementReferenceError
|
623
|
-
|
624
|
-
@element = locate
|
625
|
-
else
|
626
|
-
reset!
|
627
|
-
end
|
623
|
+
@element = @selector.key?(:element) ? nil : locate
|
628
624
|
assert_element_found
|
629
625
|
retry
|
630
626
|
end
|
@@ -2,12 +2,12 @@ module Watir
|
|
2
2
|
class IFrame < HTMLElement
|
3
3
|
|
4
4
|
def locate
|
5
|
-
@
|
5
|
+
@query_scope.assert_exists
|
6
6
|
|
7
7
|
selector = @selector.merge(tag_name: frame_tag)
|
8
8
|
element_validator = element_validator_class.new
|
9
|
-
selector_builder = selector_builder_class.new(@
|
10
|
-
locator = locator_class.new(@
|
9
|
+
selector_builder = selector_builder_class.new(@query_scope, selector, self.class.attribute_list)
|
10
|
+
locator = locator_class.new(@query_scope, selector, selector_builder, element_validator)
|
11
11
|
|
12
12
|
element = locator.locate
|
13
13
|
element or raise UnknownFrameException, "unable to locate #{@selector[:tag_name]} using #{selector_string}"
|
@@ -69,7 +69,7 @@ module Watir
|
|
69
69
|
# index will return nil. That's why `#all_elements` should always
|
70
70
|
# be called after `#elements.`
|
71
71
|
element_indexes = elements.map { |el| all_elements.index(el) }
|
72
|
-
element_indexes.map { |idx| element_class.new(@
|
72
|
+
element_indexes.map { |idx| element_class.new(@query_scope, tag_name: @selector[:tag_name], index: idx) }
|
73
73
|
end
|
74
74
|
|
75
75
|
private
|
@@ -78,8 +78,8 @@ module Watir
|
|
78
78
|
selector = { tag_name: @selector[:tag_name] }
|
79
79
|
|
80
80
|
element_validator = element_validator_class.new
|
81
|
-
selector_builder = selector_builder_class.new(@
|
82
|
-
locator = locator_class.new(@
|
81
|
+
selector_builder = selector_builder_class.new(@query_scope, selector, element_class.attribute_list)
|
82
|
+
locator = locator_class.new(@query_scope, selector, selector_builder, element_validator)
|
83
83
|
|
84
84
|
locator.locate_all
|
85
85
|
end
|
@@ -2,7 +2,7 @@ module Watir
|
|
2
2
|
class TextField < Input
|
3
3
|
include UserEditable
|
4
4
|
|
5
|
-
NON_TEXT_TYPES = %w[file radio checkbox submit reset image button hidden
|
5
|
+
NON_TEXT_TYPES = %w[file radio checkbox submit reset image button hidden range color]
|
6
6
|
|
7
7
|
inherit_attributes_from Watir::TextArea
|
8
8
|
remove_method :type # we want Input#type here, which was overriden by TextArea's attributes
|
data/lib/watir/locators.rb
CHANGED
@@ -28,8 +28,8 @@ module Watir
|
|
28
28
|
\z
|
29
29
|
}x
|
30
30
|
|
31
|
-
def initialize(
|
32
|
-
@
|
31
|
+
def initialize(query_scope, selector, selector_builder, element_validator)
|
32
|
+
@query_scope = query_scope # either element or browser
|
33
33
|
@selector = selector.dup
|
34
34
|
@selector_builder = selector_builder
|
35
35
|
@element_validator = element_validator
|
@@ -72,7 +72,7 @@ module Watir
|
|
72
72
|
tag_name = selector.delete(:tag_name)
|
73
73
|
return unless selector.empty? # multiple attributes
|
74
74
|
|
75
|
-
element = @
|
75
|
+
element = @query_scope.wd.find_element(:id, id)
|
76
76
|
return if tag_name && !element_validator.validate(element, selector)
|
77
77
|
|
78
78
|
element
|
@@ -98,9 +98,9 @@ module Watir
|
|
98
98
|
if how
|
99
99
|
# could build xpath/css for selector
|
100
100
|
if idx
|
101
|
-
@
|
101
|
+
@query_scope.wd.find_elements(how, what)[idx]
|
102
102
|
else
|
103
|
-
@
|
103
|
+
@query_scope.wd.find_element(how, what)
|
104
104
|
end
|
105
105
|
else
|
106
106
|
# can't use xpath, probably a regexp in there
|
@@ -132,7 +132,7 @@ module Watir
|
|
132
132
|
|
133
133
|
how, what = selector_builder.build(selector)
|
134
134
|
if how
|
135
|
-
@
|
135
|
+
@query_scope.wd.find_elements(how, what)
|
136
136
|
else
|
137
137
|
wd_find_by_regexp_selector(selector, :select)
|
138
138
|
end
|
@@ -140,7 +140,7 @@ module Watir
|
|
140
140
|
|
141
141
|
def wd_find_all_by(how, what)
|
142
142
|
if what.is_a? String
|
143
|
-
@
|
143
|
+
@query_scope.wd.find_elements(how, what)
|
144
144
|
else
|
145
145
|
all_elements.select { |element| fetch_value(element, how) =~ what }
|
146
146
|
end
|
@@ -160,19 +160,19 @@ module Watir
|
|
160
160
|
end
|
161
161
|
|
162
162
|
def all_elements
|
163
|
-
@
|
163
|
+
@query_scope.wd.find_elements(xpath: ".//*")
|
164
164
|
end
|
165
165
|
|
166
166
|
def wd_find_first_by(how, what)
|
167
167
|
if what.is_a? String
|
168
|
-
@
|
168
|
+
@query_scope.wd.find_element(how, what)
|
169
169
|
else
|
170
170
|
all_elements.find { |element| fetch_value(element, how) =~ what }
|
171
171
|
end
|
172
172
|
end
|
173
173
|
|
174
174
|
def wd_find_by_regexp_selector(selector, method = :find)
|
175
|
-
|
175
|
+
query_scope = @query_scope.wd
|
176
176
|
rx_selector = delete_regexps_from(selector)
|
177
177
|
|
178
178
|
if rx_selector.key?(:label) && selector_builder.should_use_label_element?
|
@@ -180,7 +180,7 @@ module Watir
|
|
180
180
|
if (id = label.attribute(:for))
|
181
181
|
selector[:id] = id
|
182
182
|
else
|
183
|
-
|
183
|
+
query_scope = label
|
184
184
|
end
|
185
185
|
end
|
186
186
|
|
@@ -199,7 +199,7 @@ module Watir
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
-
elements =
|
202
|
+
elements = query_scope.find_elements(how, what)
|
203
203
|
elements.__send__(method) { |el| matches_selector?(el, rx_selector) }
|
204
204
|
end
|
205
205
|
|
@@ -217,7 +217,7 @@ module Watir
|
|
217
217
|
|
218
218
|
def label_from_text(label_exp)
|
219
219
|
# TODO: this won't work correctly if @wd is a sub-element
|
220
|
-
@
|
220
|
+
@query_scope.wd.find_elements(:tag_name, 'label').find do |el|
|
221
221
|
matches_selector?(el, text: label_exp)
|
222
222
|
end
|
223
223
|
end
|
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'watir/locators/element/selector_builder/css'
|
2
|
-
require 'watir/locators/element/selector_builder/xpath'
|
3
|
-
|
4
1
|
module Watir
|
5
2
|
module Locators
|
6
3
|
class Element
|
@@ -8,8 +5,8 @@ module Watir
|
|
8
5
|
VALID_WHATS = [String, Regexp]
|
9
6
|
WILDCARD_ATTRIBUTE = /^(aria|data)_(.+)$/
|
10
7
|
|
11
|
-
def initialize(
|
12
|
-
@
|
8
|
+
def initialize(query_scope, selector, valid_attributes)
|
9
|
+
@query_scope = query_scope # either element or browser
|
13
10
|
@selector = selector
|
14
11
|
@valid_attributes = valid_attributes
|
15
12
|
end
|
@@ -98,9 +95,8 @@ module Watir
|
|
98
95
|
end
|
99
96
|
|
100
97
|
def build_wd_selector(selectors)
|
101
|
-
|
102
|
-
|
103
|
-
end
|
98
|
+
return if selectors.values.any? { |e| e.is_a? Regexp }
|
99
|
+
build_xpath(selectors)
|
104
100
|
end
|
105
101
|
|
106
102
|
def valid_attribute?(attribute)
|
@@ -122,25 +118,12 @@ module Watir
|
|
122
118
|
xpath_builder.build(selectors)
|
123
119
|
end
|
124
120
|
|
125
|
-
def build_css(selectors)
|
126
|
-
css_builder.build(selectors)
|
127
|
-
end
|
128
|
-
|
129
121
|
def xpath_builder_class
|
130
122
|
Kernel.const_get("#{self.class.name}::XPath")
|
131
123
|
rescue
|
132
124
|
XPath
|
133
125
|
end
|
134
126
|
|
135
|
-
def css_builder
|
136
|
-
@css_builder ||= css_builder_class.new
|
137
|
-
end
|
138
|
-
|
139
|
-
def css_builder_class
|
140
|
-
Kernel.const_get("#{self.class.name}::CSS")
|
141
|
-
rescue
|
142
|
-
CSS
|
143
|
-
end
|
144
127
|
end
|
145
128
|
end
|
146
129
|
end
|
@@ -7,7 +7,7 @@ module Watir
|
|
7
7
|
selectors.delete(:tag_name) || raise("internal error: no tag_name?!")
|
8
8
|
|
9
9
|
expressions = %w[./tr]
|
10
|
-
unless %w[tbody tfoot thead].include?(@
|
10
|
+
unless %w[tbody tfoot thead].include?(@query_scope.tag_name.downcase)
|
11
11
|
expressions += %w[./tbody/tr ./thead/tr ./tfoot/tr]
|
12
12
|
end
|
13
13
|
|
data/lib/watir/wait.rb
CHANGED
@@ -242,8 +242,24 @@ module Watir
|
|
242
242
|
timeout ||= Watir.default_timeout
|
243
243
|
message = "waiting for #{selector_string} to disappear"
|
244
244
|
Watir::Wait.while(timeout, message) { present? }
|
245
|
-
|
246
|
-
|
245
|
+
end
|
246
|
+
|
247
|
+
#
|
248
|
+
# Waits until the element is stale.
|
249
|
+
#
|
250
|
+
# @example
|
251
|
+
# browser.text_field(name: "abrakadbra").wait_until_stale
|
252
|
+
#
|
253
|
+
# @param [Fixnum] timeout seconds to wait before timing out
|
254
|
+
#
|
255
|
+
# @see Watir::Wait
|
256
|
+
# @see Watir::Element#stale?
|
257
|
+
#
|
258
|
+
|
259
|
+
def wait_until_stale(timeout = nil)
|
260
|
+
timeout ||= Watir.default_timeout
|
261
|
+
message = "waiting for #{selector_string} to become stale"
|
262
|
+
Watir::Wait.until(timeout, message) { stale? }
|
247
263
|
end
|
248
264
|
|
249
265
|
end # EventuallyPresent
|
data/spec/browser_spec.rb
CHANGED
@@ -46,24 +46,22 @@ describe Watir::Browser do
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
browser.goto WatirSpec.url_for "forms_with_input_elements.html"
|
49
|
+
describe "#send_key{,s}" do
|
50
|
+
it "sends keystrokes to the active element" do
|
51
|
+
browser.goto WatirSpec.url_for "forms_with_input_elements.html"
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
|
53
|
+
browser.send_keys "hello"
|
54
|
+
expect(browser.text_field(id: "new_user_first_name").value).to eq "hello"
|
55
|
+
end
|
57
56
|
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
57
|
+
it "sends keys to a frame" do
|
58
|
+
browser.goto WatirSpec.url_for "frames.html"
|
59
|
+
tf = browser.frame.text_field(id: "senderElement")
|
60
|
+
tf.clear
|
62
61
|
|
63
|
-
|
62
|
+
browser.frame.send_keys "hello"
|
64
63
|
|
65
|
-
|
66
|
-
end
|
64
|
+
expect(tf.value).to eq "hello"
|
67
65
|
end
|
68
66
|
end
|
69
67
|
|
@@ -15,42 +15,26 @@ describe Watir::Locators::Element::Locator do
|
|
15
15
|
|
16
16
|
describe "with selectors not supported by Selenium" do
|
17
17
|
it "handles selector with tag name and a single attribute" do
|
18
|
-
|
19
|
-
expect_one :css, 'div[title="foo"]'
|
20
|
-
else
|
21
|
-
expect_one :xpath, ".//div[@title='foo']"
|
22
|
-
end
|
18
|
+
expect_one :xpath, ".//div[@title='foo']"
|
23
19
|
|
24
20
|
locate_one tag_name: "div",
|
25
21
|
title: "foo"
|
26
22
|
end
|
27
23
|
|
28
24
|
it "handles selector with no tag name and and a single attribute" do
|
29
|
-
|
30
|
-
expect_one :css, '[title="foo"]'
|
31
|
-
else
|
32
|
-
expect_one :xpath, ".//*[@title='foo']"
|
33
|
-
end
|
25
|
+
expect_one :xpath, ".//*[@title='foo']"
|
34
26
|
|
35
27
|
locate_one title: "foo"
|
36
28
|
end
|
37
29
|
|
38
30
|
it "handles single quotes in the attribute string" do
|
39
|
-
|
40
|
-
expect_one :css, %{[title="foo and 'bar'"]}
|
41
|
-
else
|
42
|
-
expect_one :xpath, %{.//*[@title=concat('foo and ',"'",'bar',"'",'')]}
|
43
|
-
end
|
31
|
+
expect_one :xpath, %{.//*[@title=concat('foo and ',"'",'bar',"'",'')]}
|
44
32
|
|
45
33
|
locate_one title: "foo and 'bar'"
|
46
34
|
end
|
47
35
|
|
48
36
|
it "handles selector with tag name and multiple attributes" do
|
49
|
-
|
50
|
-
expect_one :css, 'div[title="foo"][dir="bar"]'
|
51
|
-
else
|
52
|
-
expect_one :xpath, ".//div[@title='foo' and @dir='bar']"
|
53
|
-
end
|
37
|
+
expect_one :xpath, ".//div[@title='foo' and @dir='bar']"
|
54
38
|
|
55
39
|
locate_one [:tag_name, "div",
|
56
40
|
:title , "foo",
|
@@ -58,11 +42,7 @@ describe Watir::Locators::Element::Locator do
|
|
58
42
|
end
|
59
43
|
|
60
44
|
it "handles selector with no tag name and multiple attributes" do
|
61
|
-
|
62
|
-
expect_one :css, '[dir="foo"][title="bar"]'
|
63
|
-
else
|
64
|
-
expect_one :xpath, ".//*[@dir='foo' and @title='bar']"
|
65
|
-
end
|
45
|
+
expect_one :xpath, ".//*[@dir='foo' and @title='bar']"
|
66
46
|
|
67
47
|
locate_one [:dir, "foo",
|
68
48
|
:title, "bar"]
|
@@ -84,44 +64,28 @@ describe Watir::Locators::Element::Locator do
|
|
84
64
|
end
|
85
65
|
|
86
66
|
it "translates :class_name to :class" do
|
87
|
-
|
88
|
-
expect_one :css, "div.foo"
|
89
|
-
else
|
90
|
-
expect_one :xpath, ".//div[contains(concat(' ', @class, ' '), ' foo ')]"
|
91
|
-
end
|
67
|
+
expect_one :xpath, ".//div[contains(concat(' ', @class, ' '), ' foo ')]"
|
92
68
|
|
93
69
|
locate_one tag_name: "div",
|
94
70
|
class_name: "foo"
|
95
71
|
end
|
96
72
|
|
97
73
|
it "handles data-* attributes" do
|
98
|
-
|
99
|
-
expect_one :css, 'div[data-name="foo"]'
|
100
|
-
else
|
101
|
-
expect_one :xpath, ".//div[@data-name='foo']"
|
102
|
-
end
|
74
|
+
expect_one :xpath, ".//div[@data-name='foo']"
|
103
75
|
|
104
76
|
locate_one tag_name: "div",
|
105
77
|
data_name: "foo"
|
106
78
|
end
|
107
79
|
|
108
80
|
it "handles aria-* attributes" do
|
109
|
-
|
110
|
-
expect_one :css, 'div[aria-label="foo"]'
|
111
|
-
else
|
112
|
-
expect_one :xpath, ".//div[@aria-label='foo']"
|
113
|
-
end
|
81
|
+
expect_one :xpath, ".//div[@aria-label='foo']"
|
114
82
|
|
115
83
|
locate_one tag_name: "div",
|
116
84
|
aria_label: "foo"
|
117
85
|
end
|
118
86
|
|
119
87
|
it "normalizes space for the :href attribute" do
|
120
|
-
|
121
|
-
expect_one :css, 'a[href~="foo"]'
|
122
|
-
else
|
123
|
-
expect_one :xpath, ".//a[normalize-space(@href)='foo']"
|
124
|
-
end
|
88
|
+
expect_one :xpath, ".//a[normalize-space(@href)='foo']"
|
125
89
|
|
126
90
|
selector = {
|
127
91
|
tag_name: "a",
|
@@ -164,11 +128,7 @@ describe Watir::Locators::Element::Locator do
|
|
164
128
|
end
|
165
129
|
|
166
130
|
it "translates ruby attribute names to content attribute names" do
|
167
|
-
|
168
|
-
expect_one :css, 'meta[http-equiv="foo"]'
|
169
|
-
else
|
170
|
-
expect_one :xpath, ".//meta[@http-equiv='foo']"
|
171
|
-
end
|
131
|
+
expect_one :xpath, ".//meta[@http-equiv='foo']"
|
172
132
|
|
173
133
|
selector = {
|
174
134
|
tag_name: "meta",
|
@@ -188,11 +148,7 @@ describe Watir::Locators::Element::Locator do
|
|
188
148
|
element(tag_name: "div", attributes: { class: "foob"})
|
189
149
|
]
|
190
150
|
|
191
|
-
|
192
|
-
expect_all(:css, "div").and_return(elements)
|
193
|
-
else
|
194
|
-
expect_all(:xpath, "(.//div)[contains(@class, 'oob')]").and_return(elements)
|
195
|
-
end
|
151
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'oob')]").and_return(elements)
|
196
152
|
|
197
153
|
expect(locate_one(tag_name: "div", class: /oob/)).to eq elements[1]
|
198
154
|
end
|
@@ -203,11 +159,7 @@ describe Watir::Locators::Element::Locator do
|
|
203
159
|
element(tag_name: "div", attributes: { class: "foo" })
|
204
160
|
]
|
205
161
|
|
206
|
-
|
207
|
-
expect_all(:css, "div").and_return(elements)
|
208
|
-
else
|
209
|
-
expect_all(:xpath, "(.//div)[contains(@class, 'foo')]").and_return(elements)
|
210
|
-
end
|
162
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'foo')]").and_return(elements)
|
211
163
|
|
212
164
|
selector = {
|
213
165
|
tag_name: "div",
|
@@ -256,11 +208,7 @@ describe Watir::Locators::Element::Locator do
|
|
256
208
|
element(tag_name: "div", attributes: { dir: "foo", title: "baz" })
|
257
209
|
]
|
258
210
|
|
259
|
-
|
260
|
-
expect_all(:css, 'div[dir="foo"]').and_return(elements)
|
261
|
-
else
|
262
|
-
expect_all(:xpath, "(.//div[@dir='foo'])[contains(@title, 'baz')]").and_return(elements)
|
263
|
-
end
|
211
|
+
expect_all(:xpath, "(.//div[@dir='foo'])[contains(@title, 'baz')]").and_return(elements)
|
264
212
|
|
265
213
|
selector = {
|
266
214
|
tag_name: "div",
|
@@ -277,12 +225,7 @@ describe Watir::Locators::Element::Locator do
|
|
277
225
|
element(tag_name: "div", attributes: { :'data-automation-id' => "bar" })
|
278
226
|
]
|
279
227
|
|
280
|
-
|
281
|
-
expect_all(:css, 'div').and_return(elements)
|
282
|
-
else
|
283
|
-
expect_all(:xpath, "(.//div)[contains(@data-automation-id, 'bar')]").and_return(elements)
|
284
|
-
end
|
285
|
-
|
228
|
+
expect_all(:xpath, "(.//div)[contains(@data-automation-id, 'bar')]").and_return(elements)
|
286
229
|
|
287
230
|
selector = {
|
288
231
|
tag_name: "div",
|
@@ -300,13 +243,7 @@ describe Watir::Locators::Element::Locator do
|
|
300
243
|
div_elements = [element(tag_name: "div")]
|
301
244
|
|
302
245
|
expect_all(:tag_name, "label").ordered.and_return(label_elements)
|
303
|
-
|
304
|
-
if Watir.prefer_css?
|
305
|
-
expect_all(:css, 'div[id="baz"]').ordered.and_return(div_elements)
|
306
|
-
else
|
307
|
-
expect_all(:xpath, ".//div[@id='baz']").ordered.and_return(div_elements)
|
308
|
-
end
|
309
|
-
|
246
|
+
expect_all(:xpath, ".//div[@id='baz']").ordered.and_return(div_elements)
|
310
247
|
expect(locate_one(tag_name: "div", label: /oob/)).to eq div_elements.first
|
311
248
|
end
|
312
249
|
|
@@ -323,11 +260,7 @@ describe Watir::Locators::Element::Locator do
|
|
323
260
|
element(tag_name: "div")
|
324
261
|
]
|
325
262
|
|
326
|
-
|
327
|
-
expect_all(:css, 'div[dir="foo"]').and_return(elements)
|
328
|
-
else
|
329
|
-
expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
|
330
|
-
end
|
263
|
+
expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
|
331
264
|
|
332
265
|
selector = {
|
333
266
|
tag_name: "div",
|
@@ -382,35 +315,20 @@ describe Watir::Locators::Element::Locator do
|
|
382
315
|
|
383
316
|
describe "with an empty selector" do
|
384
317
|
it "finds all when an empty selctor is given" do
|
385
|
-
|
386
|
-
expect_all :css, '*'
|
387
|
-
else
|
388
|
-
expect_all :xpath, './/*'
|
389
|
-
end
|
390
|
-
|
318
|
+
expect_all :xpath, './/*'
|
391
319
|
locate_all({})
|
392
320
|
end
|
393
321
|
end
|
394
322
|
|
395
323
|
describe "with selectors not supported by Selenium" do
|
396
324
|
it "handles selector with tag name and a single attribute" do
|
397
|
-
|
398
|
-
expect_all :css, 'div[dir="foo"]'
|
399
|
-
else
|
400
|
-
expect_all :xpath, ".//div[@dir='foo']"
|
401
|
-
end
|
402
|
-
|
325
|
+
expect_all :xpath, ".//div[@dir='foo']"
|
403
326
|
locate_all tag_name: "div",
|
404
327
|
dir: "foo"
|
405
328
|
end
|
406
329
|
|
407
330
|
it "handles selector with tag name and multiple attributes" do
|
408
|
-
|
409
|
-
expect_all :css, 'div[dir="foo"][title="bar"]'
|
410
|
-
else
|
411
|
-
expect_all :xpath, ".//div[@dir='foo' and @title='bar']"
|
412
|
-
end
|
413
|
-
|
331
|
+
expect_all :xpath, ".//div[@dir='foo' and @title='bar']"
|
414
332
|
locate_all [:tag_name, "div",
|
415
333
|
:dir , "foo",
|
416
334
|
:title , 'bar']
|
@@ -426,12 +344,7 @@ describe Watir::Locators::Element::Locator do
|
|
426
344
|
element(tag_name: "div", attributes: { class: "noob"})
|
427
345
|
]
|
428
346
|
|
429
|
-
|
430
|
-
expect_all(:css, "div").and_return(elements)
|
431
|
-
else
|
432
|
-
expect_all(:xpath, "(.//div)[contains(@class, 'oob')]").and_return(elements)
|
433
|
-
end
|
434
|
-
|
347
|
+
expect_all(:xpath, "(.//div)[contains(@class, 'oob')]").and_return(elements)
|
435
348
|
expect(locate_all(tag_name: "div", class: /oob/)).to eq elements.last(3)
|
436
349
|
end
|
437
350
|
|
@@ -442,11 +355,7 @@ describe Watir::Locators::Element::Locator do
|
|
442
355
|
element(tag_name: "div", attributes: { dir: "foo", title: "bazt"})
|
443
356
|
]
|
444
357
|
|
445
|
-
|
446
|
-
expect_all(:css, 'div[dir="foo"]').and_return(elements)
|
447
|
-
else
|
448
|
-
expect_all(:xpath, "(.//div[@dir='foo'])[contains(@title, 'baz')]").and_return(elements)
|
449
|
-
end
|
358
|
+
expect_all(:xpath, "(.//div[@dir='foo'])[contains(@title, 'baz')]").and_return(elements)
|
450
359
|
|
451
360
|
selector = {
|
452
361
|
tag_name: "div",
|
@@ -458,10 +367,6 @@ describe Watir::Locators::Element::Locator do
|
|
458
367
|
end
|
459
368
|
|
460
369
|
context "and xpath" do
|
461
|
-
before do
|
462
|
-
expect(Watir).to receive(:prefer_css?).and_return(false)
|
463
|
-
end
|
464
|
-
|
465
370
|
it "converts a leading run of regexp literals to a contains() expression" do
|
466
371
|
elements = [
|
467
372
|
element(tag_name: "div", attributes: { class: "foo" }),
|
data/spec/element_spec.rb
CHANGED
@@ -93,11 +93,7 @@ describe Watir::Element do
|
|
93
93
|
watir_element.send(:element_call) { watir_element.instance_variable_get('@element').text }
|
94
94
|
end
|
95
95
|
|
96
|
-
|
97
|
-
expect { watir_element.text }.to_not raise_error
|
98
|
-
else
|
99
|
-
expect { watir_element.text }.to raise_error Watir::Exception::UnknownObjectException
|
100
|
-
end
|
96
|
+
expect { watir_element.text }.to_not raise_error
|
101
97
|
end
|
102
98
|
|
103
99
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,14 +11,6 @@ require 'rspec'
|
|
11
11
|
|
12
12
|
include Watir
|
13
13
|
|
14
|
-
if ENV['ALWAYS_LOCATE'] == "false"
|
15
|
-
Watir.always_locate = false
|
16
|
-
end
|
17
|
-
|
18
|
-
if ENV['PREFER_CSS']
|
19
|
-
Watir.prefer_css = true
|
20
|
-
end
|
21
|
-
|
22
14
|
SELENIUM_SELECTORS = %i(class class_name css id tag_name xpath)
|
23
15
|
|
24
16
|
if ENV['TRAVIS']
|
data/support/travis.sh
CHANGED
@@ -14,7 +14,9 @@ fi
|
|
14
14
|
if [[ "$RAKE_TASK" = "spec:chrome" ]] || [[ "$RAKE_TASK" = "yard:doctest" ]]; then
|
15
15
|
# https://omahaproxy.appspot.com
|
16
16
|
# https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/
|
17
|
-
CHROME_REVISION
|
17
|
+
# CHROME_REVISION=`curl -s http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/LAST_CHANGE`
|
18
|
+
CHROME_REVISION=417841
|
19
|
+
|
18
20
|
curl -L -O "http://commondatastorage.googleapis.com/chromium-browser-snapshots/Linux_x64/${CHROME_REVISION}/chrome-linux.zip"
|
19
21
|
unzip chrome-linux.zip
|
20
22
|
|
data/watir.gemspec
CHANGED
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.0.0.
|
4
|
+
version: 6.0.0.beta4
|
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: 2016-
|
12
|
+
date: 2016-09-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: selenium-webdriver
|
@@ -206,7 +206,6 @@ files:
|
|
206
206
|
- lib/watir/atoms.rb
|
207
207
|
- lib/watir/atoms/README
|
208
208
|
- lib/watir/atoms/fireEvent.js
|
209
|
-
- lib/watir/atoms/getAttribute.js
|
210
209
|
- lib/watir/atoms/getInnerHtml.js
|
211
210
|
- lib/watir/atoms/getOuterHtml.js
|
212
211
|
- lib/watir/atoms/getParentElement.js
|
@@ -271,7 +270,6 @@ files:
|
|
271
270
|
- lib/watir/locators/cell/selector_builder.rb
|
272
271
|
- lib/watir/locators/element/locator.rb
|
273
272
|
- lib/watir/locators/element/selector_builder.rb
|
274
|
-
- lib/watir/locators/element/selector_builder/css.rb
|
275
273
|
- lib/watir/locators/element/selector_builder/xpath.rb
|
276
274
|
- lib/watir/locators/element/validator.rb
|
277
275
|
- lib/watir/locators/row/locator.rb
|
@@ -289,7 +287,6 @@ files:
|
|
289
287
|
- lib/watir/wait/timer.rb
|
290
288
|
- lib/watir/window.rb
|
291
289
|
- lib/watir/xpath_support.rb
|
292
|
-
- spec/always_locate_spec.rb
|
293
290
|
- spec/browser_spec.rb
|
294
291
|
- spec/click_spec.rb
|
295
292
|
- spec/container_spec.rb
|
@@ -329,7 +326,6 @@ signing_key:
|
|
329
326
|
specification_version: 4
|
330
327
|
summary: Watir powered by Selenium
|
331
328
|
test_files:
|
332
|
-
- spec/always_locate_spec.rb
|
333
329
|
- spec/browser_spec.rb
|
334
330
|
- spec/click_spec.rb
|
335
331
|
- spec/container_spec.rb
|
@@ -1,18 +0,0 @@
|
|
1
|
-
// Copyright 2011 Software Freedom Conservatory
|
2
|
-
// Licensed under the Apache License, Version 2.0 (the "License");
|
3
|
-
// you may not use this file except in compliance with the License.
|
4
|
-
// You may obtain a copy of the License at
|
5
|
-
//
|
6
|
-
// http://www.apache.org/licenses/LICENSE-2.0
|
7
|
-
//
|
8
|
-
// Unless required by applicable law or agreed to in writing, software
|
9
|
-
// distributed under the License is distributed on an "AS IS" BASIS,
|
10
|
-
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
11
|
-
// See the License for the specific language governing permissions and
|
12
|
-
// limitations under the License.
|
13
|
-
|
14
|
-
function(){return function(){var d=null,e=this;function f(b,a){function c(){}c.prototype=a.prototype;b.g=a.prototype;b.prototype=new c};function g(b){for(var a=1;a<arguments.length;a++)var c=String(arguments[a]).replace(/\$/g,"$$$$"),b=b.replace(/\%s/,c);return b}function i(b){return b.replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")}function j(b,a){if(b<a)return-1;else if(b>a)return 1;return 0};var k,l,m,p;function q(){return e.navigator?e.navigator.userAgent:d}p=m=l=k=!1;var r;if(r=q()){var s=e.navigator;k=r.indexOf("Opera")==0;l=!k&&r.indexOf("MSIE")!=-1;m=!k&&r.indexOf("WebKit")!=-1;p=!k&&!m&&s.product=="Gecko"}var t=l,u=p,x=m,y;
|
15
|
-
a:{var z="",A;if(k&&e.opera)var B=e.opera.version,z=typeof B=="function"?B():B;else if(u?A=/rv\:([^\);]+)(\)|;)/:t?A=/MSIE\s+([^\);]+)(\)|;)/:x&&(A=/WebKit\/(\S+)/),A)var C=A.exec(q()),z=C?C[1]:"";if(t){var D,E=e.document;D=E?E.documentMode:void 0;if(D>parseFloat(z)){y=String(D);break a}}y=z}var F={};
|
16
|
-
function G(b){var a;if(!(a=F[b])){a=0;for(var c=i(String(y)).split("."),h=i(String(b)).split("."),v=Math.max(c.length,h.length),w=0;a==0&&w<v;w++){var U=c[w]||"",V=h[w]||"",W=RegExp("(\\d*)(\\D*)","g"),X=RegExp("(\\d*)(\\D*)","g");do{var n=W.exec(U)||["","",""],o=X.exec(V)||["","",""];if(n[0].length==0&&o[0].length==0)break;a=j(n[1].length==0?0:parseInt(n[1],10),o[1].length==0?0:parseInt(o[1],10))||j(n[2].length==0,o[2].length==0)||j(n[2],o[2])}while(a==0)}a=F[b]=a>=0}return a};function H(b){this.stack=Error().stack||"";if(b)this.message=String(b)}f(H,Error);H.prototype.name="CustomError";function I(b,a){H.call(this,a);this.code=b;this.name=J[b]||J[13]}f(I,H);
|
17
|
-
var J,K={NoSuchElementError:7,NoSuchFrameError:8,UnknownCommandError:9,StaleElementReferenceError:10,ElementNotVisibleError:11,InvalidElementStateError:12,UnknownError:13,ElementNotSelectableError:15,XPathLookupError:19,NoSuchWindowError:23,InvalidCookieDomainError:24,UnableToSetCookieError:25,ModalDialogOpenedError:26,NoModalDialogOpenError:27,ScriptTimeoutError:28,InvalidSelectorError:32,SqlDatabaseError:33,MoveTargetOutOfBoundsError:34},L={},M;for(M in K)L[K[M]]=M;J=L;
|
18
|
-
I.prototype.toString=function(){return"["+this.name+"] "+this.message};function N(b,a){a.unshift(b);H.call(this,g.apply(d,a));a.shift();this.f=b}f(N,H);N.prototype.name="AssertionError";function O(b){var a=P;if(typeof a=="string"){if(typeof b!="string"||b.length!=1)return-1;return a.indexOf(b,0)}for(var c=0;c<a.length;c++)if(c in a&&a[c]===b)return c;return-1};!t||G("9");!u&&!t||t&&G("9")||u&&G("1.9.1");t&&G("9");function Q(b,a,c,h,v){this.b=!!a;if(b&&(this.a=b))this.c=typeof h=="number"?h:this.a.nodeType!=1?0:this.b?-1:1;this.d=v!=void 0?v:this.c||0;this.b&&(this.d*=-1);this.e=!c}f(Q,function(){});Q.prototype.a=d;Q.prototype.c=0;f(function(b,a,c,h){Q.call(this,b,a,c,d,h)},Q);var P=["async","autofocus","autoplay","checked","compact","complete","controls","declare","defaultchecked","defaultselected","defer","disabled","draggable","ended","formnovalidate","hidden","indeterminate","iscontenteditable","ismap","itemscope","loop","multiple","muted","nohref","noresize","noshade","novalidate","nowrap","open","paused","pubdate","readonly","required","reversed","scoped","seamless","seeking","selected","spellcheck","truespeed","willvalidate"];function R(b,a){if(8==b.nodeType)return d;a=a.toLowerCase();if(a=="style"){var c=i(b.style.cssText).toLowerCase();return c.charAt(c.length-1)==";"?c:c+";"}c=b.getAttributeNode(a);t&&!c&&G(8)&&O(a)>=0&&(c=b[a]);if(!c)return d;if(O(a)>=0)return t&&c.value=="false"?d:"true";return c.specified?c.value:d}var S="_".split("."),T=e;!(S[0]in T)&&T.execScript&&T.execScript("var "+S[0]);for(var Y;S.length&&(Y=S.shift());)!S.length&&R!==void 0?T[Y]=R:T=T[Y]?T[Y]:T[Y]={};; return this._.apply(null,arguments);}.apply({navigator:typeof window!='undefined'?window.navigator:null}, arguments);}
|
@@ -1,65 +0,0 @@
|
|
1
|
-
module Watir
|
2
|
-
module Locators
|
3
|
-
class Element
|
4
|
-
class SelectorBuilder
|
5
|
-
class CSS
|
6
|
-
def build(selectors)
|
7
|
-
return unless use_css?(selectors)
|
8
|
-
|
9
|
-
if selectors.empty?
|
10
|
-
css = '*'
|
11
|
-
else
|
12
|
-
css = ''
|
13
|
-
css << (selectors.delete(:tag_name) || '')
|
14
|
-
|
15
|
-
klass = selectors.delete(:class)
|
16
|
-
if klass
|
17
|
-
if klass.include? ' '
|
18
|
-
css << %([class="#{css_escape klass}"])
|
19
|
-
else
|
20
|
-
css << ".#{klass}"
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
href = selectors.delete(:href)
|
25
|
-
if href
|
26
|
-
css << %([href~="#{css_escape href}"])
|
27
|
-
end
|
28
|
-
|
29
|
-
selectors.each do |key, value|
|
30
|
-
key = key.to_s.tr("_", "-")
|
31
|
-
css << %([#{key}="#{css_escape value}"]) # TODO: proper escaping
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
[:css, css]
|
36
|
-
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def use_css?(selectors)
|
41
|
-
return false unless Watir.prefer_css?
|
42
|
-
|
43
|
-
if selectors.key?(:text) || selectors.key?(:label) || selectors.key?(:index)
|
44
|
-
return false
|
45
|
-
end
|
46
|
-
|
47
|
-
if selectors[:tag_name] == 'input' && selectors.key?(:type)
|
48
|
-
return false
|
49
|
-
end
|
50
|
-
|
51
|
-
if selectors.key?(:class) && selectors[:class] !~ /^[\w-]+$/ui
|
52
|
-
return false
|
53
|
-
end
|
54
|
-
|
55
|
-
true
|
56
|
-
end
|
57
|
-
|
58
|
-
def css_escape(str)
|
59
|
-
str.gsub('"', '\\"')
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
data/spec/always_locate_spec.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require File.expand_path('watirspec/spec_helper', File.dirname(__FILE__))
|
2
|
-
|
3
|
-
describe 'Watir' do
|
4
|
-
describe '#always_locate?' do
|
5
|
-
|
6
|
-
before do
|
7
|
-
browser.goto WatirSpec.url_for('removed_element.html')
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'determines whether #exist? returns false for stale element' do
|
11
|
-
element = browser.div(id: "text")
|
12
|
-
expect(element.exists?).to be true
|
13
|
-
|
14
|
-
browser.refresh
|
15
|
-
|
16
|
-
expect(element.exists?).to be Watir.always_locate?
|
17
|
-
end
|
18
|
-
|
19
|
-
it 'allows using cached elements regardless of setting, when element is not stale' do
|
20
|
-
element = browser.div(id: "text")
|
21
|
-
expect(element.exists?).to be true
|
22
|
-
|
23
|
-
# exception raised if element is re-looked up
|
24
|
-
allow(browser.driver).to receive(:find_element).with(:id, 'text') { raise }
|
25
|
-
|
26
|
-
expect { element.exists? }.to_not raise_error
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'determines whether an exception is raised when taking an action on a stale element' do
|
30
|
-
element = browser.div(id: "text")
|
31
|
-
expect(element.exists?).to be true
|
32
|
-
|
33
|
-
browser.refresh
|
34
|
-
browser.div(id: "text").wait_until_present
|
35
|
-
|
36
|
-
if Watir.always_locate?
|
37
|
-
expect { element.text }.to_not raise_error
|
38
|
-
else
|
39
|
-
expect { element.text }.to raise_error Watir::Exception::UnknownObjectException
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|