watir-webdriver 0.5.3 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -10,7 +10,7 @@ before_script:
10
10
  env:
11
11
  - WATIR_WEBDRIVER_BROWSER=firefox
12
12
  - WATIR_WEBDRIVER_BROWSER=firefox ALWAYS_LOCATE=false
13
- # - WATIR_WEBDRIVER_BROWSER=firefox NATIVE_EVENTS=true
13
+ - WATIR_WEBDRIVER_BROWSER=firefox PREFER_CSS=1 SELECTOR_STATS=1
14
14
  - WATIR_WEBDRIVER_BROWSER=chrome
15
15
  - WATIR_WEBDRIVER_BROWSER=chrome ALWAYS_LOCATE=false
16
- # - WATIR_WEBDRIVER_BROWSER=chrome NATIVE_EVENTS=true
16
+ - WATIR_WEBDRIVER_BROWSER=chrome PREFER_CSS=1 SELECTOR_STATS=1
@@ -34,6 +34,19 @@ module Watir
34
34
  @always_locate = bool
35
35
  end
36
36
 
37
+ def prefer_css?
38
+ @prefer_css
39
+ end
40
+
41
+ #
42
+ # Whether or not Watir should prefer CSS when translating the Watir selectors to WebDriver.
43
+ # Defaults to false.
44
+ #
45
+
46
+ def prefer_css=(bool)
47
+ @prefer_css = bool
48
+ end
49
+
37
50
  #
38
51
  # @api private
39
52
  #
@@ -161,7 +161,7 @@ module Watir
161
161
 
162
162
  def assert_exists
163
163
  if @closed
164
- raise Error, "browser was closed"
164
+ raise Exception::Error, "browser was closed"
165
165
  else
166
166
  driver.switch_to.default_content
167
167
  true
@@ -28,9 +28,9 @@ module Watir
28
28
 
29
29
  private
30
30
 
31
- def to_time(dt)
32
- if dt.respond_to?(:to_time)
33
- dt.to_time
31
+ def to_time(t)
32
+ if t.respond_to?(:to_time)
33
+ t.to_time
34
34
  else
35
35
  Time.local t.year, t.month, t.day, t.hour, t.min, t.sec
36
36
  end
@@ -42,16 +42,6 @@ module Watir
42
42
  browser.execute_script(*args)
43
43
  end
44
44
 
45
- def element_by_xpath(*args)
46
- assert_exists
47
- super
48
- end
49
-
50
- def elements_by_xpath(*args)
51
- assert_exists
52
- super
53
- end
54
-
55
45
  private
56
46
 
57
47
  def locate_iframe
@@ -206,7 +206,7 @@ module Watir
206
206
 
207
207
  def safe_text(element)
208
208
  element.text
209
- rescue Selenium::WebDriver::Error::ObsoleteElementError
209
+ rescue Selenium::WebDriver::Error::ObsoleteElementError, Selenium::WebDriver::Error::UnhandledAlertError
210
210
  # guard for scenario where selecting the element changes the page, making our element obsolete
211
211
 
212
212
  ''
@@ -16,7 +16,7 @@ module Watir
16
16
  super
17
17
  end
18
18
 
19
- def build_xpath(selectors)
19
+ def build_wd_selector(selectors)
20
20
  return if selectors.values.any? { |e| e.kind_of? Regexp }
21
21
 
22
22
  selectors.delete(:tag_name) || raise("internal error: no tag_name?!")
@@ -33,9 +33,9 @@ module Watir
33
33
  xpath << " | .//input"
34
34
  xpath << "[#{input_attr_exp}]"
35
35
 
36
- p :build_xpath => xpath if $DEBUG
36
+ p :build_wd_selector => xpath if $DEBUG
37
37
 
38
- xpath
38
+ [:xpath, xpath]
39
39
  end
40
40
 
41
41
  def lhs_for(key)
@@ -11,7 +11,7 @@ module Watir
11
11
  nil
12
12
  end
13
13
 
14
- def build_xpath(selectors)
14
+ def build_wd_selector(selectors)
15
15
  return if selectors.values.any? { |e| e.kind_of? Regexp }
16
16
 
17
17
  expressions = %w[./th ./td]
@@ -23,9 +23,9 @@ module Watir
23
23
 
24
24
  xpath = expressions.join(" | ")
25
25
 
26
- p :build_xpath => xpath if $DEBUG
26
+ p :build_wd_selector => xpath if $DEBUG
27
27
 
28
- xpath
28
+ [:xpath, xpath]
29
29
  end
30
30
 
31
31
  end # ChildCellLocator
@@ -11,7 +11,7 @@ module Watir
11
11
  nil # avoid this
12
12
  end
13
13
 
14
- def build_xpath(selectors)
14
+ def build_wd_selector(selectors)
15
15
  return if selectors.values.any? { |e| e.kind_of? Regexp }
16
16
  selectors.delete(:tag_name) || raise("internal error: no tag_name?!")
17
17
 
@@ -28,9 +28,9 @@ module Watir
28
28
 
29
29
  xpath = expressions.join(" | ")
30
30
 
31
- p :build_xpath => xpath if $DEBUG
31
+ p :build_wd_selector => xpath if $DEBUG
32
32
 
33
- xpath
33
+ [:xpath, xpath]
34
34
  end
35
35
 
36
36
  end # ChildRowLocator
@@ -10,7 +10,7 @@ module Watir
10
10
  :id,
11
11
  :link,
12
12
  :link_text,
13
- :name,
13
+ # :name, # deliberately excluded to be watirspec compliant
14
14
  :partial_link_text,
15
15
  :tag_name,
16
16
  :xpath
@@ -75,14 +75,14 @@ module Watir
75
75
  selector = normalized_selector
76
76
 
77
77
  idx = selector.delete(:index)
78
- xpath = given_xpath(selector) || build_xpath(selector)
78
+ how, what = given_xpath(selector) || build_wd_selector(selector)
79
79
 
80
- if xpath
80
+ if how
81
81
  # could build xpath for selector
82
82
  if idx
83
- @wd.find_elements(:xpath, xpath)[idx]
83
+ @wd.find_elements(how, what)[idx]
84
84
  else
85
- @wd.find_element(:xpath, xpath)
85
+ @wd.find_element(how, what)
86
86
  end
87
87
  else
88
88
  # can't use xpath, probably a regexp in there
@@ -101,9 +101,9 @@ module Watir
101
101
  raise ArgumentError, "can't locate all elements by :index"
102
102
  end
103
103
 
104
- xpath = given_xpath(selector) || build_xpath(selector)
105
- if xpath
106
- @wd.find_elements(:xpath, xpath)
104
+ how, what = given_xpath(selector) || build_wd_selector(selector)
105
+ if how
106
+ @wd.find_elements(how, what)
107
107
  else
108
108
  wd_find_by_regexp_selector(selector, :select)
109
109
  end
@@ -132,9 +132,13 @@ module Watir
132
132
  selector[:id] = id_from_label(rx_selector.delete(:label)) || return
133
133
  end
134
134
 
135
- xpath = build_xpath(selector) || raise("internal error: unable to build xpath from #{selector.inspect}")
135
+ how, what = build_wd_selector(selector)
136
+
137
+ unless how
138
+ raise Error, "internal error: unable to build WebDriver selector from #{selector.inspect}"
139
+ end
136
140
 
137
- elements = @wd.find_elements(:xpath, xpath)
141
+ elements = @wd.find_elements(how, what)
138
142
  elements.__send__(method) { |el| matches_selector?(el, rx_selector) }
139
143
  end
140
144
 
@@ -264,13 +268,17 @@ module Watir
264
268
  @selector[:tag_name] != "option"
265
269
  end
266
270
 
267
- def build_xpath(selectors)
268
- return if selectors.values.any? { |e| e.kind_of? Regexp }
271
+ def build_wd_selector(selectors)
272
+ unless selectors.values.any? { |e| e.kind_of? Regexp }
273
+ build_css(selectors) || build_xpath(selectors)
274
+ end
275
+ end
269
276
 
277
+ def build_xpath(selectors)
270
278
  xpath = ".//"
271
279
  xpath << (selectors.delete(:tag_name) || '*').to_s
272
280
 
273
- idx = selectors.delete(:index)
281
+ idx = selectors.delete :index
274
282
 
275
283
  # the remaining entries should be attributes
276
284
  unless selectors.empty?
@@ -283,7 +291,49 @@ module Watir
283
291
 
284
292
  p :xpath => xpath, :selectors => selectors if $DEBUG
285
293
 
286
- xpath
294
+ [:xpath, xpath]
295
+ end
296
+
297
+ def build_css(selectors)
298
+ return unless use_css?(selectors)
299
+
300
+ css = ''
301
+ css << (selectors.delete(:tag_name) || '')
302
+
303
+ klass = selectors.delete(:class)
304
+ if klass
305
+ if klass.include? ' '
306
+ css << %([class="#{css_escape klass}"])
307
+ else
308
+ css << ".#{klass}"
309
+ end
310
+ end
311
+
312
+ href = selectors.delete(:href)
313
+ if href
314
+ css << %([href~="#{css_escape href}"])
315
+ end
316
+
317
+ selectors.each do |key, value|
318
+ key = key.to_s.gsub("_", "-")
319
+ css << %([#{key}="#{css_escape value}"]) # TODO: proper escaping
320
+ end
321
+
322
+ [:css, css]
323
+ end
324
+
325
+ def use_css?(selectors)
326
+ return false unless Watir.prefer_css?
327
+
328
+ if selectors.has_key?(:text) || selectors.has_key?(:label) || selectors.has_key?(:index)
329
+ return false
330
+ end
331
+
332
+ if selectors.has_key?(:class) && selectors[:class] !~ /^[\w-]+$/ui
333
+ return false
334
+ end
335
+
336
+ true
287
337
  end
288
338
 
289
339
  def attribute_expression(selectors)
@@ -296,6 +346,10 @@ module Watir
296
346
  end.join(" and ")
297
347
  end
298
348
 
349
+ def css_escape(str)
350
+ str.gsub('"', '\\"')
351
+ end
352
+
299
353
  def equal_pair(key, value)
300
354
  if key == :class
301
355
  klass = XpathSupport.escape " #{value} "
@@ -340,7 +394,7 @@ module Watir
340
394
  raise ArgumentError, ":xpath cannot be combined with other selectors (#{selector.inspect})"
341
395
  end
342
396
 
343
- xpath
397
+ [:xpath, xpath]
344
398
  end
345
399
 
346
400
  def can_be_combined_with_xpath?(selector)
@@ -11,7 +11,7 @@ module Watir
11
11
 
12
12
  private
13
13
 
14
- def build_xpath(selectors)
14
+ def build_wd_selector(selectors)
15
15
  return if selectors.values.any? { |e| e.kind_of? Regexp }
16
16
 
17
17
  selectors.delete(:tag_name)
@@ -28,9 +28,9 @@ module Watir
28
28
  xpath << "| .//textarea"
29
29
  xpath << "[#{textarea_attr_exp}]" unless textarea_attr_exp.empty?
30
30
 
31
- p :build_xpath => xpath if $DEBUG
31
+ p :build_wd_selector => xpath if $DEBUG
32
32
 
33
- xpath
33
+ [:xpath, xpath]
34
34
  end
35
35
 
36
36
  def lhs_for(key)
@@ -1,3 +1,3 @@
1
1
  module Watir
2
- VERSION = "0.5.3"
2
+ VERSION = "0.5.4"
3
3
  end
@@ -15,24 +15,42 @@ describe Watir::ElementLocator do
15
15
 
16
16
  describe "with selectors not supported by webdriver" do
17
17
  it "handles selector with tag name and a single attribute" do
18
- expect_one :xpath, ".//div[@title='foo']"
18
+ if Watir.prefer_css?
19
+ expect_one :css, 'div[title="foo"]'
20
+ else
21
+ expect_one :xpath, ".//div[@title='foo']"
22
+ end
19
23
 
20
24
  locate_one :tag_name => "div",
21
25
  :title => "foo"
22
26
  end
23
27
 
24
28
  it "handles selector with no tag name and and a single attribute" do
25
- expect_one :xpath, ".//*[@title='foo']"
29
+ if Watir.prefer_css?
30
+ expect_one :css, '[title="foo"]'
31
+ else
32
+ expect_one :xpath, ".//*[@title='foo']"
33
+ end
34
+
26
35
  locate_one :title => "foo"
27
36
  end
28
37
 
29
38
  it "handles single quotes in the attribute string" do
30
- expect_one :xpath, %{.//*[@title=concat('foo and ',"'",'bar',"'",'')]}
39
+ if Watir.prefer_css?
40
+ expect_one :css, %{[title="foo and 'bar'"]}
41
+ else
42
+ expect_one :xpath, %{.//*[@title=concat('foo and ',"'",'bar',"'",'')]}
43
+ end
44
+
31
45
  locate_one :title => "foo and 'bar'"
32
46
  end
33
47
 
34
48
  it "handles selector with tag name and multiple attributes" do
35
- expect_one :xpath, ".//div[@title='foo' and @dir='bar']"
49
+ if Watir.prefer_css?
50
+ expect_one :css, 'div[title="foo"][dir="bar"]'
51
+ else
52
+ expect_one :xpath, ".//div[@title='foo' and @dir='bar']"
53
+ end
36
54
 
37
55
  locate_one [:tag_name, "div",
38
56
  :title , "foo",
@@ -40,7 +58,11 @@ describe Watir::ElementLocator do
40
58
  end
41
59
 
42
60
  it "handles selector with no tag name and multiple attributes" do
43
- expect_one :xpath, ".//*[@dir='foo' and @title='bar']"
61
+ if Watir.prefer_css?
62
+ expect_one :css, '[dir="foo"][title="bar"]'
63
+ else
64
+ expect_one :xpath, ".//*[@dir='foo' and @title='bar']"
65
+ end
44
66
 
45
67
  locate_one [:dir, "foo",
46
68
  :title, "bar"]
@@ -63,21 +85,33 @@ describe Watir::ElementLocator do
63
85
  end
64
86
 
65
87
  it "translates :class_name to :class" do
66
- expect_one :xpath, ".//div[contains(concat(' ', @class, ' '), ' foo ')]"
88
+ if Watir.prefer_css?
89
+ expect_one :css, "div.foo"
90
+ else
91
+ expect_one :xpath, ".//div[contains(concat(' ', @class, ' '), ' foo ')]"
92
+ end
67
93
 
68
94
  locate_one :tag_name => "div",
69
95
  :class_name => "foo"
70
96
  end
71
97
 
72
98
  it "handles data-* attributes" do
73
- expect_one :xpath, ".//div[@data-name='foo']"
99
+ if Watir.prefer_css?
100
+ expect_one :css, 'div[data-name="foo"]'
101
+ else
102
+ expect_one :xpath, ".//div[@data-name='foo']"
103
+ end
74
104
 
75
105
  locate_one :tag_name => "div",
76
106
  :data_name => "foo"
77
107
  end
78
108
 
79
109
  it "normalizes space for the :href attribute" do
80
- expect_one :xpath, ".//a[normalize-space(@href)='foo']"
110
+ if Watir.prefer_css?
111
+ expect_one :css, 'a[href~="foo"]'
112
+ else
113
+ expect_one :xpath, ".//a[normalize-space(@href)='foo']"
114
+ end
81
115
 
82
116
  selector = {
83
117
  :tag_name => "a",
@@ -107,7 +141,11 @@ describe Watir::ElementLocator do
107
141
  end
108
142
 
109
143
  it "translates ruby attribute names to content attribute names" do
110
- expect_one :xpath, ".//meta[@http-equiv='foo']"
144
+ if Watir.prefer_css?
145
+ expect_one :css, 'meta[http-equiv="foo"]'
146
+ else
147
+ expect_one :xpath, ".//meta[@http-equiv='foo']"
148
+ end
111
149
 
112
150
  selector = {
113
151
  :tag_name => "meta",
@@ -127,7 +165,12 @@ describe Watir::ElementLocator do
127
165
  element(:tag_name => "div", :attributes => { :class => "foob"})
128
166
  ]
129
167
 
130
- expect_all(:xpath, ".//div").and_return(elements)
168
+ if Watir.prefer_css?
169
+ expect_all(:css, "div").and_return(elements)
170
+ else
171
+ expect_all(:xpath, ".//div").and_return(elements)
172
+ end
173
+
131
174
  locate_one(:tag_name => "div", :class => /oob/).should == elements[1]
132
175
  end
133
176
 
@@ -137,7 +180,11 @@ describe Watir::ElementLocator do
137
180
  element(:tag_name => "div", :attributes => { :class => "foo" })
138
181
  ]
139
182
 
140
- expect_all(:xpath, ".//div").and_return(elements)
183
+ if Watir.prefer_css?
184
+ expect_all(:css, "div").and_return(elements)
185
+ else
186
+ expect_all(:xpath, ".//div").and_return(elements)
187
+ end
141
188
 
142
189
  selector = {
143
190
  :tag_name => "div",
@@ -154,7 +201,12 @@ describe Watir::ElementLocator do
154
201
  element(:tag_name => "div", :attributes => { :dir => "foo", :title => "baz" })
155
202
  ]
156
203
 
157
- expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
204
+ if Watir.prefer_css?
205
+ expect_all(:css, 'div[dir="foo"]').and_return(elements)
206
+ else
207
+ expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
208
+ end
209
+
158
210
 
159
211
  selector = {
160
212
  :tag_name => "div",
@@ -173,7 +225,12 @@ describe Watir::ElementLocator do
173
225
  div_elements = [element(:tag_name => "div")]
174
226
 
175
227
  expect_all(:tag_name, "label").ordered.and_return(label_elements)
176
- expect_all(:xpath, ".//div[@id='baz']").ordered.and_return(div_elements)
228
+
229
+ if Watir.prefer_css?
230
+ expect_all(:css, 'div[id="baz"]').ordered.and_return(div_elements)
231
+ else
232
+ expect_all(:xpath, ".//div[@id='baz']").ordered.and_return(div_elements)
233
+ end
177
234
 
178
235
  locate_one(:tag_name => "div", :label => /oob/).should == div_elements.first
179
236
  end
@@ -192,7 +249,11 @@ describe Watir::ElementLocator do
192
249
  element(:tag_name => "div")
193
250
  ]
194
251
 
195
- expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
252
+ if Watir.prefer_css?
253
+ expect_all(:css, 'div[dir="foo"]').and_return(elements)
254
+ else
255
+ expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
256
+ end
196
257
 
197
258
  selector = {
198
259
  :tag_name => "div",
@@ -250,14 +311,22 @@ describe Watir::ElementLocator do
250
311
 
251
312
  describe "with selectors not supported by webdriver" do
252
313
  it "handles selector with tag name and a single attribute" do
253
- expect_all :xpath, ".//div[@dir='foo']"
314
+ if Watir.prefer_css?
315
+ expect_all :css, 'div[dir="foo"]'
316
+ else
317
+ expect_all :xpath, ".//div[@dir='foo']"
318
+ end
254
319
 
255
320
  locate_all :tag_name => "div",
256
321
  :dir => "foo"
257
322
  end
258
323
 
259
324
  it "handles selector with tag name and multiple attributes" do
260
- expect_all :xpath, ".//div[@dir='foo' and @title='bar']"
325
+ if Watir.prefer_css?
326
+ expect_all :css, 'div[dir="foo"][title="bar"]'
327
+ else
328
+ expect_all :xpath, ".//div[@dir='foo' and @title='bar']"
329
+ end
261
330
 
262
331
  locate_all [:tag_name, "div",
263
332
  :dir , "foo",
@@ -274,7 +343,13 @@ describe Watir::ElementLocator do
274
343
  element(:tag_name => "div", :attributes => { :class => "noob"})
275
344
  ]
276
345
 
277
- expect_all(:xpath, ".//div").and_return(elements)
346
+ if Watir.prefer_css?
347
+ expect_all(:css, "div").and_return(elements)
348
+ else
349
+ expect_all(:xpath, ".//div").and_return(elements)
350
+ end
351
+
352
+
278
353
  locate_all(:tag_name => "div", :class => /oob/).should == elements.last(3)
279
354
  end
280
355
 
@@ -285,7 +360,11 @@ describe Watir::ElementLocator do
285
360
  element(:tag_name => "div", :attributes => { :dir => "foo", :title => "bazt"})
286
361
  ]
287
362
 
288
- expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
363
+ if Watir.prefer_css?
364
+ expect_all(:css, 'div[dir="foo"]').and_return(elements)
365
+ else
366
+ expect_all(:xpath, ".//div[@dir='foo']").and_return(elements)
367
+ end
289
368
 
290
369
  selector = {
291
370
  :tag_name => "div",
data/spec/element_spec.rb CHANGED
@@ -44,7 +44,10 @@ describe Watir::Element do
44
44
  end
45
45
 
46
46
  describe "#hover" do
47
- not_compliant_on [:webdriver, :firefox, :synthesized_events], [:webdriver, :ie] do
47
+ not_compliant_on [:webdriver, :firefox, :synthesized_events],
48
+ [:webdriver, :ie],
49
+ [:webdriver, :iphone],
50
+ [:webdriver, :safari] do
48
51
  it "should hover over the element" do
49
52
  browser.goto WatirSpec.url_for('hover.html', :needs_server => true)
50
53
  link = browser.a
@@ -11,7 +11,7 @@ class ImplementationConfig
11
11
  set_guard_proc
12
12
  add_html_routes
13
13
 
14
- WatirSpec.always_use_server = mobile? || ie?
14
+ WatirSpec.always_use_server = mobile? || ie? || safari?
15
15
  end
16
16
 
17
17
  private
@@ -22,14 +22,22 @@ class ImplementationConfig
22
22
  end
23
23
 
24
24
  def set_browser_args
25
- case browser
26
- when :firefox
27
- set_firefox_args
28
- when :chrome
29
- set_chrome_args
30
- else
31
- @imp.browser_args = [browser]
25
+ args = case browser
26
+ when :firefox
27
+ firefox_args
28
+ when :chrome
29
+ chrome_args
30
+ else
31
+ [browser, {}]
32
+ end
33
+
34
+ if ENV['SELECTOR_STATS']
35
+ listener = SelectorListener.new
36
+ args.last.merge!(:listener => listener)
37
+ at_exit { listener.report }
32
38
  end
39
+
40
+ @imp.browser_args = args
33
41
  end
34
42
 
35
43
  def mobile?
@@ -40,6 +48,10 @@ class ImplementationConfig
40
48
  [:ie, :internet_explorer].include? browser
41
49
  end
42
50
 
51
+ def safari?
52
+ browser == :safari
53
+ end
54
+
43
55
  def set_guard_proc
44
56
  matching_guards = [
45
57
  :webdriver, # guard only applies to webdriver
@@ -60,14 +72,14 @@ class ImplementationConfig
60
72
  }
61
73
  end
62
74
 
63
- def set_firefox_args
75
+ def firefox_args
64
76
  profile = Selenium::WebDriver::Firefox::Profile.new
65
77
  profile.native_events = native_events?
66
78
 
67
- @imp.browser_args = [:firefox, {:profile => profile}]
79
+ [:firefox, {:profile => profile}]
68
80
  end
69
81
 
70
- def set_chrome_args
82
+ def chrome_args
71
83
  opts = {
72
84
  :switches => ["--disable-translate"],
73
85
  :native_events => native_events?
@@ -85,7 +97,7 @@ class ImplementationConfig
85
97
  Selenium::WebDriver::Chrome.path = path
86
98
  end
87
99
 
88
- @imp.browser_args = [:chrome, opts]
100
+ [:chrome, opts]
89
101
  end
90
102
 
91
103
  def add_html_routes
@@ -106,6 +118,25 @@ class ImplementationConfig
106
118
  def native_events_by_default?
107
119
  Selenium::WebDriver::Platform.windows? && [:firefox, :ie].include?(browser)
108
120
  end
121
+
122
+ class SelectorListener < Selenium::WebDriver::Support::AbstractEventListener
123
+ def initialize
124
+ @counts = Hash.new(0)
125
+ end
126
+
127
+ def before_find(how, what, driver)
128
+ @counts[how] += 1
129
+ end
130
+
131
+ def report
132
+ total = @counts.values.inject(0) { |mem, var| mem + var }
133
+ puts "\nWebDriver selector stats: "
134
+ @counts.each do |how, count|
135
+ puts "\t#{how.to_s.ljust(20)}: #{count * 100 / total} (#{count})"
136
+ end
137
+ end
138
+
139
+ end
109
140
  end
110
141
 
111
142
  ImplementationConfig.new(WatirSpec.implementation).configure
data/spec/spec_helper.rb CHANGED
@@ -21,7 +21,11 @@ if ENV['ALWAYS_LOCATE'] == "false"
21
21
  Watir.always_locate = false
22
22
  end
23
23
 
24
- WEBDRIVER_SELECTORS = [:class, :class_name, :css, :id, :name, :tag_name, :xpath]
24
+ if ENV['PREFER_CSS']
25
+ Watir.prefer_css = true
26
+ end
27
+
28
+ WEBDRIVER_SELECTORS = [:class, :class_name, :css, :id, :tag_name, :xpath]
25
29
 
26
30
  if ENV['TRAVIS']
27
31
  ENV['DISPLAY'] = ":99.0"
data/spec/wait_spec.rb CHANGED
@@ -1,118 +1,118 @@
1
1
  require File.expand_path("watirspec/spec_helper", File.dirname(__FILE__))
2
2
 
3
- describe Watir::Wait do
4
- describe "#until" do
5
- it "waits until the block returns true" do
6
- Wait.until(0.5) { true }.should be_true
3
+ not_compliant_on [:webdriver, :safari] do
4
+ describe Watir::Wait do
5
+ describe "#until" do
6
+ it "waits until the block returns true" do
7
+ Wait.until(0.5) { true }.should be_true
8
+ end
9
+
10
+ it "times out" do
11
+ lambda do
12
+ Wait.until(0.5) { false }
13
+ end.should raise_error(Watir::Wait::TimeoutError)
14
+ end
15
+
16
+ it "times out with a custom message" do
17
+ lambda do
18
+ Wait.until(0.5, "oops") { false }
19
+ end.should raise_error(Watir::Wait::TimeoutError, "timed out after 0.5 seconds, oops")
20
+ end
7
21
  end
8
22
 
9
- it "times out" do
10
- lambda do
11
- Wait.until(0.5) { false }
12
- end.should raise_error(Watir::Wait::TimeoutError)
13
- end
14
-
15
- it "times out with a custom message" do
16
- lambda do
17
- Wait.until(0.5, "oops") { false }
18
- end.should raise_error(Watir::Wait::TimeoutError, "timed out after 0.5 seconds, oops")
19
- end
20
- end
21
-
22
- describe "#while" do
23
- it "waits while the block returns true" do
24
- Wait.while(0.5) { false }.should == nil
25
- end
26
-
27
- it "times out" do
28
- lambda do
29
- Wait.while(0.5) { true }
30
- end.should raise_error(Watir::Wait::TimeoutError)
31
- end
32
-
33
- it "times out with a custom message" do
34
- lambda do
35
- Wait.while(0.5, "oops") { true }
36
- end.should raise_error(Watir::Wait::TimeoutError, "timed out after 0.5 seconds, oops")
37
- end
38
- end
39
- end
40
-
41
- describe Watir::Element do
42
-
43
- before do
44
- browser.goto WatirSpec.url_for("wait.html", :needs_server => true)
45
- end
46
-
47
- describe "#when_present" do
48
- it "yields when the element becomes present" do
49
- called = false
50
-
51
- browser.a(:id, 'show_bar').click
52
- browser.div(:id, 'bar').when_present(1) { called = true }
53
-
54
- called.should be_true
55
- end
56
-
57
- it "invokes subsequent method calls when the element becomes present" do
58
- browser.a(:id, 'show_bar').click
59
-
60
- bar = browser.div(:id, 'bar')
61
- bar.when_present(1).click
62
- bar.text.should == "changed"
63
- end
64
-
65
- it "times out when given a block" do
66
- lambda {
67
- browser.div(:id, 'bar').when_present(1) {}
68
- }.should raise_error(Watir::Wait::TimeoutError)
69
- end
70
-
71
- it "times out when not given a block" do
72
- lambda {
73
- browser.div(:id, 'bar').when_present(1).click
74
- }.should raise_error(Watir::Wait::TimeoutError,
75
- /^timed out after 1 seconds, waiting for (\{:id=>"bar", :tag_name=>"div"\}|\{:tag_name=>"div", :id=>"bar"\}) to become present$/
76
- )
77
- end
78
-
79
- it "responds to Element methods" do
80
- decorator = browser.div.when_present
81
-
82
- decorator.should respond_to(:exist?)
83
- decorator.should respond_to(:present?)
84
- decorator.should respond_to(:click)
23
+ describe "#while" do
24
+ it "waits while the block returns true" do
25
+ Wait.while(0.5) { false }.should == nil
26
+ end
27
+
28
+ it "times out" do
29
+ lambda do
30
+ Wait.while(0.5) { true }
31
+ end.should raise_error(Watir::Wait::TimeoutError)
32
+ end
33
+
34
+ it "times out with a custom message" do
35
+ lambda do
36
+ Wait.while(0.5, "oops") { true }
37
+ end.should raise_error(Watir::Wait::TimeoutError, "timed out after 0.5 seconds, oops")
38
+ end
85
39
  end
86
40
  end
87
41
 
88
- describe "#wait_until_present" do
89
- it "it waits until the element appears" do
90
- browser.a(:id, 'show_bar').click
91
- browser.div(:id, 'bar').wait_until_present(5)
42
+ describe Watir::Element do
43
+ before do
44
+ browser.goto WatirSpec.url_for("wait.html", :needs_server => true)
92
45
  end
93
46
 
94
- it "times out if the element doesn't appear" do
95
- lambda do
96
- browser.div(:id, 'bar').wait_until_present(1)
97
- end.should raise_error(Watir::Wait::TimeoutError,
98
- /^timed out after 1 seconds, waiting for (\{:id=>"bar", :tag_name=>"div"\}|\{:tag_name=>"div", :id=>"bar"\}) to become present$/
99
- )
47
+ describe "#when_present" do
48
+ it "yields when the element becomes present" do
49
+ called = false
50
+
51
+ browser.a(:id, 'show_bar').click
52
+ browser.div(:id, 'bar').when_present(1) { called = true }
53
+
54
+ called.should be_true
55
+ end
56
+
57
+ it "invokes subsequent method calls when the element becomes present" do
58
+ browser.a(:id, 'show_bar').click
59
+
60
+ bar = browser.div(:id, 'bar')
61
+ bar.when_present(1).click
62
+ bar.text.should == "changed"
63
+ end
64
+
65
+ it "times out when given a block" do
66
+ lambda {
67
+ browser.div(:id, 'bar').when_present(1) {}
68
+ }.should raise_error(Watir::Wait::TimeoutError)
69
+ end
70
+
71
+ it "times out when not given a block" do
72
+ lambda {
73
+ browser.div(:id, 'bar').when_present(1).click
74
+ }.should raise_error(Watir::Wait::TimeoutError,
75
+ /^timed out after 1 seconds, waiting for (\{:id=>"bar", :tag_name=>"div"\}|\{:tag_name=>"div", :id=>"bar"\}) to become present$/
76
+ )
77
+ end
78
+
79
+ it "responds to Element methods" do
80
+ decorator = browser.div.when_present
81
+
82
+ decorator.should respond_to(:exist?)
83
+ decorator.should respond_to(:present?)
84
+ decorator.should respond_to(:click)
85
+ end
100
86
  end
101
- end
102
87
 
103
- describe "#wait_while_present" do
104
- it "waits until the element disappears" do
105
- browser.a(:id, 'hide_foo').click
106
- browser.div(:id, 'foo').wait_while_present(1)
88
+ describe "#wait_until_present" do
89
+ it "it waits until the element appears" do
90
+ browser.a(:id, 'show_bar').click
91
+ browser.div(:id, 'bar').wait_until_present(5)
92
+ end
93
+
94
+ it "times out if the element doesn't appear" do
95
+ lambda do
96
+ browser.div(:id, 'bar').wait_until_present(1)
97
+ end.should raise_error(Watir::Wait::TimeoutError,
98
+ /^timed out after 1 seconds, waiting for (\{:id=>"bar", :tag_name=>"div"\}|\{:tag_name=>"div", :id=>"bar"\}) to become present$/
99
+ )
100
+ end
107
101
  end
108
102
 
109
- it "times out" do
110
- lambda do
103
+ describe "#wait_while_present" do
104
+ it "waits until the element disappears" do
105
+ browser.a(:id, 'hide_foo').click
111
106
  browser.div(:id, 'foo').wait_while_present(1)
112
- end.should raise_error(Watir::Wait::TimeoutError,
113
- /^timed out after 1 seconds, waiting for (\{:id=>"foo", :tag_name=>"div"\}|\{:tag_name=>"div", :id=>"foo"\}) to disappear$/
114
- )
107
+ end
108
+
109
+ it "times out" do
110
+ lambda do
111
+ browser.div(:id, 'foo').wait_while_present(1)
112
+ end.should raise_error(Watir::Wait::TimeoutError,
113
+ /^timed out after 1 seconds, waiting for (\{:id=>"foo", :tag_name=>"div"\}|\{:tag_name=>"div", :id=>"foo"\}) to disappear$/
114
+ )
115
+ end
115
116
  end
116
117
  end
117
-
118
118
  end
data/support/travis.sh CHANGED
@@ -1,6 +1,6 @@
1
1
  #/bin/sh
2
2
 
3
- CHROME_REVISION=119695
3
+ CHROME_REVISION=127410
4
4
  sh -e /etc/init.d/xvfb start && git submodule update --init || exit 1
5
5
 
6
6
  if [[ "$WATIR_WEBDRIVER_BROWSER" = "chrome" ]]; then
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
20
20
  s.require_paths = ["lib"]
21
21
 
22
- s.add_dependency "selenium-webdriver", '>= 2.12.0'
22
+ s.add_dependency "selenium-webdriver", '>= 2.18.0'
23
23
 
24
24
  s.add_development_dependency "rspec", "~> 2.6"
25
25
  s.add_development_dependency "yard", "~> 0.7.4"
metadata CHANGED
@@ -1,172 +1,167 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: watir-webdriver
3
- version: !ruby/object:Gem::Version
4
- hash: 13
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.5.4
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 5
9
- - 3
10
- version: 0.5.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Jari Bakken
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-02-09 00:00:00 Z
19
- dependencies:
20
- - !ruby/object:Gem::Dependency
12
+ date: 2012-03-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
21
15
  name: selenium-webdriver
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
24
17
  none: false
25
- requirements:
26
- - - ">="
27
- - !ruby/object:Gem::Version
28
- hash: 63
29
- segments:
30
- - 2
31
- - 12
32
- - 0
33
- version: 2.12.0
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 2.18.0
34
22
  type: :runtime
35
- version_requirements: *id001
36
- - !ruby/object:Gem::Dependency
37
- name: rspec
38
23
  prerelease: false
39
- requirement: &id002 !ruby/object:Gem::Requirement
24
+ version_requirements: !ruby/object:Gem::Requirement
40
25
  none: false
41
- requirements:
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 2.18.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
42
35
  - - ~>
43
- - !ruby/object:Gem::Version
44
- hash: 15
45
- segments:
46
- - 2
47
- - 6
48
- version: "2.6"
36
+ - !ruby/object:Gem::Version
37
+ version: '2.6'
49
38
  type: :development
50
- version_requirements: *id002
51
- - !ruby/object:Gem::Dependency
52
- name: yard
53
39
  prerelease: false
54
- requirement: &id003 !ruby/object:Gem::Requirement
40
+ version_requirements: !ruby/object:Gem::Requirement
55
41
  none: false
56
- requirements:
42
+ requirements:
57
43
  - - ~>
58
- - !ruby/object:Gem::Version
59
- hash: 11
60
- segments:
61
- - 0
62
- - 7
63
- - 4
44
+ - !ruby/object:Gem::Version
45
+ version: '2.6'
46
+ - !ruby/object:Gem::Dependency
47
+ name: yard
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
64
53
  version: 0.7.4
65
54
  type: :development
66
- version_requirements: *id003
67
- - !ruby/object:Gem::Dependency
68
- name: webidl
69
55
  prerelease: false
70
- requirement: &id004 !ruby/object:Gem::Requirement
56
+ version_requirements: !ruby/object:Gem::Requirement
71
57
  none: false
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- hash: 29
76
- segments:
77
- - 0
78
- - 1
79
- - 3
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: 0.7.4
62
+ - !ruby/object:Gem::Dependency
63
+ name: webidl
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
80
69
  version: 0.1.3
81
70
  type: :development
82
- version_requirements: *id004
83
- - !ruby/object:Gem::Dependency
84
- name: sinatra
85
71
  prerelease: false
86
- requirement: &id005 !ruby/object:Gem::Requirement
72
+ version_requirements: !ruby/object:Gem::Requirement
87
73
  none: false
88
- requirements:
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.1.3
78
+ - !ruby/object:Gem::Dependency
79
+ name: sinatra
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
89
83
  - - ~>
90
- - !ruby/object:Gem::Version
91
- hash: 15
92
- segments:
93
- - 1
94
- - 0
95
- version: "1.0"
84
+ - !ruby/object:Gem::Version
85
+ version: '1.0'
96
86
  type: :development
97
- version_requirements: *id005
98
- - !ruby/object:Gem::Dependency
99
- name: rake
100
87
  prerelease: false
101
- requirement: &id006 !ruby/object:Gem::Requirement
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ~>
92
+ - !ruby/object:Gem::Version
93
+ version: '1.0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: rake
96
+ requirement: !ruby/object:Gem::Requirement
102
97
  none: false
103
- requirements:
98
+ requirements:
104
99
  - - ~>
105
- - !ruby/object:Gem::Version
106
- hash: 63
107
- segments:
108
- - 0
109
- - 9
110
- - 2
100
+ - !ruby/object:Gem::Version
111
101
  version: 0.9.2
112
102
  type: :development
113
- version_requirements: *id006
114
- - !ruby/object:Gem::Dependency
115
- name: fuubar
116
103
  prerelease: false
117
- requirement: &id007 !ruby/object:Gem::Requirement
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ~>
108
+ - !ruby/object:Gem::Version
109
+ version: 0.9.2
110
+ - !ruby/object:Gem::Dependency
111
+ name: fuubar
112
+ requirement: !ruby/object:Gem::Requirement
118
113
  none: false
119
- requirements:
114
+ requirements:
120
115
  - - ~>
121
- - !ruby/object:Gem::Version
122
- hash: 19
123
- segments:
124
- - 0
125
- - 0
126
- - 6
116
+ - !ruby/object:Gem::Version
127
117
  version: 0.0.6
128
118
  type: :development
129
- version_requirements: *id007
130
- - !ruby/object:Gem::Dependency
131
- name: nokogiri
132
119
  prerelease: false
133
- requirement: &id008 !ruby/object:Gem::Requirement
120
+ version_requirements: !ruby/object:Gem::Requirement
134
121
  none: false
135
- requirements:
136
- - - ">="
137
- - !ruby/object:Gem::Version
138
- hash: 3
139
- segments:
140
- - 0
141
- version: "0"
122
+ requirements:
123
+ - - ~>
124
+ - !ruby/object:Gem::Version
125
+ version: 0.0.6
126
+ - !ruby/object:Gem::Dependency
127
+ name: nokogiri
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
142
134
  type: :development
143
- version_requirements: *id008
144
- - !ruby/object:Gem::Dependency
145
- name: activesupport
146
135
  prerelease: false
147
- requirement: &id009 !ruby/object:Gem::Requirement
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: activesupport
144
+ requirement: !ruby/object:Gem::Requirement
148
145
  none: false
149
- requirements:
146
+ requirements:
150
147
  - - ~>
151
- - !ruby/object:Gem::Version
152
- hash: 9
153
- segments:
154
- - 2
155
- - 3
156
- - 5
148
+ - !ruby/object:Gem::Version
157
149
  version: 2.3.5
158
150
  type: :development
159
- version_requirements: *id009
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ~>
156
+ - !ruby/object:Gem::Version
157
+ version: 2.3.5
160
158
  description: WebDriver-backed Watir
161
- email:
159
+ email:
162
160
  - jari.bakken@gmail.com
163
161
  executables: []
164
-
165
162
  extensions: []
166
-
167
163
  extra_rdoc_files: []
168
-
169
- files:
164
+ files:
170
165
  - .document
171
166
  - .gitignore
172
167
  - .gitmodules
@@ -257,55 +252,38 @@ files:
257
252
  - watir-webdriver.gemspec
258
253
  homepage: http://github.com/watir/watir-webdriver
259
254
  licenses: []
260
-
261
- post_install_message: |+
262
- Please note that watir-webdriver 0.5.0 brings some backwards incompatible changes:
263
-
264
- * Watir::Select#selected_options no longer returns Array<String>, but Array<Watir::Option>
265
- [ https://github.com/watir/watir-webdriver/issues/21 ]
266
- * Finding elements by :class now matches partial class attributes.
267
- [ https://github.com/watir/watir-webdriver/issues/36 ]
268
-
269
- Additionally, watir-webdriver 0.5.1 removes the following deprecated methods:
270
-
271
- * element_by_xpath : replaced by .element(:xpath, '...')
272
- * elements_by_xpath : replaced by .elements(:xpath, '...')
273
-
274
- And deprecates the following methods:
275
-
276
- * Browser#clear_cookies - replaced by Browser#cookies API
277
- [ https://github.com/watir/watir-webdriver/issues/24 ]
278
-
255
+ post_install_message: ! "Please note that watir-webdriver 0.5.0 brings some backwards
256
+ incompatible changes:\n\n * Watir::Select#selected_options no longer returns Array<String>,
257
+ but Array<Watir::Option>\n [ https://github.com/watir/watir-webdriver/issues/21
258
+ ]\n * Finding elements by :class now matches partial class attributes.\n [
259
+ https://github.com/watir/watir-webdriver/issues/36 ]\n\nAdditionally, watir-webdriver
260
+ 0.5.1 removes the following deprecated methods:\n\n * element_by_xpath : replaced
261
+ by .element(:xpath, '...')\n * elements_by_xpath : replaced by .elements(:xpath,
262
+ '...')\n\nAnd deprecates the following methods:\n\n * Browser#clear_cookies - replaced
263
+ by Browser#cookies API\n [ https://github.com/watir/watir-webdriver/issues/24
264
+ ]\n\n"
279
265
  rdoc_options: []
280
-
281
- require_paths:
266
+ require_paths:
282
267
  - lib
283
- required_ruby_version: !ruby/object:Gem::Requirement
268
+ required_ruby_version: !ruby/object:Gem::Requirement
284
269
  none: false
285
- requirements:
286
- - - ">="
287
- - !ruby/object:Gem::Version
288
- hash: 3
289
- segments:
290
- - 0
291
- version: "0"
292
- required_rubygems_version: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ! '>='
272
+ - !ruby/object:Gem::Version
273
+ version: '0'
274
+ required_rubygems_version: !ruby/object:Gem::Requirement
293
275
  none: false
294
- requirements:
295
- - - ">="
296
- - !ruby/object:Gem::Version
297
- hash: 3
298
- segments:
299
- - 0
300
- version: "0"
276
+ requirements:
277
+ - - ! '>='
278
+ - !ruby/object:Gem::Version
279
+ version: '0'
301
280
  requirements: []
302
-
303
281
  rubyforge_project: watir-webdriver
304
- rubygems_version: 1.8.15
282
+ rubygems_version: 1.8.20
305
283
  signing_key:
306
284
  specification_version: 3
307
285
  summary: Watir on WebDriver
308
- test_files:
286
+ test_files:
309
287
  - spec/alert_spec.rb
310
288
  - spec/browser_spec.rb
311
289
  - spec/click_spec.rb