watir-webdriver 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. data/Gemfile +2 -0
  2. data/Gemfile.lock +48 -0
  3. data/Rakefile +23 -8
  4. data/VERSION +1 -1
  5. data/lib/watir-webdriver.rb +7 -5
  6. data/lib/watir-webdriver/browser.rb +9 -2
  7. data/lib/watir-webdriver/browserbot.js +5 -2
  8. data/lib/watir-webdriver/container.rb +6 -9
  9. data/lib/watir-webdriver/{collections/element_collection.rb → element_collection.rb} +5 -0
  10. data/lib/watir-webdriver/elements/button.rb +5 -4
  11. data/lib/watir-webdriver/{element.rb → elements/element.rb} +29 -5
  12. data/lib/watir-webdriver/elements/file_field.rb +21 -4
  13. data/lib/watir-webdriver/elements/frame.rb +1 -1
  14. data/lib/watir-webdriver/elements/generated.rb +750 -750
  15. data/lib/watir-webdriver/elements/image.rb +6 -0
  16. data/lib/watir-webdriver/elements/link.rb +0 -4
  17. data/lib/watir-webdriver/elements/select.rb +22 -24
  18. data/lib/watir-webdriver/elements/table_row.rb +11 -1
  19. data/lib/watir-webdriver/elements/text_field.rb +5 -15
  20. data/lib/watir-webdriver/extensions/wait.rb +107 -0
  21. data/lib/watir-webdriver/html/generator.rb +1 -1
  22. data/lib/watir-webdriver/html/util.rb +1 -10
  23. data/lib/watir-webdriver/html/visitor.rb +2 -14
  24. data/lib/watir-webdriver/locators/button_locator.rb +22 -3
  25. data/lib/watir-webdriver/locators/element_locator.rb +54 -28
  26. data/lib/watir-webdriver/locators/table_row_locator.rb +3 -1
  27. data/lib/watir-webdriver/locators/text_field_locator.rb +7 -3
  28. data/lib/watir-webdriver/window_switching.rb +78 -0
  29. data/spec/browser_spec.rb +43 -0
  30. data/spec/container_spec.rb +43 -0
  31. data/spec/element_locator_spec.rb +305 -0
  32. data/spec/element_spec.rb +34 -5
  33. data/spec/html/closeable.html +13 -0
  34. data/spec/html/data_attributes.html +9 -0
  35. data/spec/html/wait.html +27 -0
  36. data/spec/html/window_switching.html +12 -0
  37. data/spec/input_spec.rb +14 -2
  38. data/spec/locator_spec_helper.rb +37 -0
  39. data/spec/spec_helper.rb +3 -0
  40. data/spec/wait_spec.rb +98 -0
  41. data/spec/watirspec/area_spec.rb +4 -4
  42. data/spec/watirspec/browser_spec.rb +37 -35
  43. data/spec/watirspec/button_spec.rb +22 -17
  44. data/spec/watirspec/buttons_spec.rb +1 -1
  45. data/spec/watirspec/checkbox_spec.rb +4 -0
  46. data/spec/watirspec/checkboxes_spec.rb +1 -1
  47. data/spec/watirspec/collections_spec.rb +4 -2
  48. data/spec/watirspec/dd_spec.rb +4 -0
  49. data/spec/watirspec/dds_spec.rb +1 -1
  50. data/spec/watirspec/del_spec.rb +4 -0
  51. data/spec/watirspec/dels_spec.rb +1 -1
  52. data/spec/watirspec/div_spec.rb +38 -12
  53. data/spec/watirspec/divs_spec.rb +1 -1
  54. data/spec/watirspec/dl_spec.rb +20 -6
  55. data/spec/watirspec/dls_spec.rb +1 -1
  56. data/spec/watirspec/dt_spec.rb +4 -0
  57. data/spec/watirspec/dts_spec.rb +1 -1
  58. data/spec/watirspec/em_spec.rb +4 -0
  59. data/spec/watirspec/ems_spec.rb +1 -1
  60. data/spec/watirspec/filefield_spec.rb +37 -2
  61. data/spec/watirspec/filefields_spec.rb +1 -1
  62. data/spec/watirspec/font_spec.rb +4 -0
  63. data/spec/watirspec/form_spec.rb +4 -0
  64. data/spec/watirspec/forms_spec.rb +6 -4
  65. data/spec/watirspec/frame_spec.rb +6 -0
  66. data/spec/watirspec/hidden_spec.rb +5 -4
  67. data/spec/watirspec/hiddens_spec.rb +1 -1
  68. data/spec/watirspec/hn_spec.rb +4 -0
  69. data/spec/watirspec/image_spec.rb +4 -0
  70. data/spec/watirspec/images_spec.rb +1 -1
  71. data/spec/watirspec/ins_spec.rb +4 -0
  72. data/spec/watirspec/inses_spec.rb +1 -1
  73. data/spec/watirspec/label_spec.rb +4 -0
  74. data/spec/watirspec/labels_spec.rb +2 -2
  75. data/spec/watirspec/li_spec.rb +4 -0
  76. data/spec/watirspec/link_spec.rb +15 -10
  77. data/spec/watirspec/links_spec.rb +6 -0
  78. data/spec/watirspec/lis_spec.rb +1 -1
  79. data/spec/watirspec/map_spec.rb +4 -0
  80. data/spec/watirspec/maps_spec.rb +1 -1
  81. data/spec/watirspec/meta_spec.rb +4 -0
  82. data/spec/watirspec/metas_spec.rb +1 -1
  83. data/spec/watirspec/ol_spec.rb +23 -9
  84. data/spec/watirspec/option_spec.rb +19 -7
  85. data/spec/watirspec/p_spec.rb +4 -0
  86. data/spec/watirspec/pre_spec.rb +4 -0
  87. data/spec/watirspec/pres_spec.rb +1 -1
  88. data/spec/watirspec/ps_spec.rb +1 -1
  89. data/spec/watirspec/radio_spec.rb +22 -13
  90. data/spec/watirspec/radios_spec.rb +6 -0
  91. data/spec/watirspec/select_list_spec.rb +29 -17
  92. data/spec/watirspec/select_lists_spec.rb +6 -0
  93. data/spec/watirspec/span_spec.rb +10 -2
  94. data/spec/watirspec/spans_spec.rb +1 -1
  95. data/spec/watirspec/strong_spec.rb +14 -4
  96. data/spec/watirspec/table_body_spec.rb +4 -0
  97. data/spec/watirspec/table_cell_spec.rb +9 -3
  98. data/spec/watirspec/table_cells_spec.rb +0 -1
  99. data/spec/watirspec/table_footer_spec.rb +4 -0
  100. data/spec/watirspec/table_header_spec.rb +4 -0
  101. data/spec/watirspec/table_row_spec.rb +15 -7
  102. data/spec/watirspec/table_rows_spec.rb +2 -2
  103. data/spec/watirspec/table_spec.rb +13 -7
  104. data/spec/watirspec/tables_spec.rb +1 -1
  105. data/spec/watirspec/text_field_spec.rb +21 -12
  106. data/spec/watirspec/text_fields_spec.rb +6 -0
  107. data/spec/watirspec/ul_spec.rb +4 -0
  108. data/spec/window_switching_spec.rb +116 -0
  109. data/watir-webdriver.gemspec +38 -16
  110. metadata +51 -27
  111. data/lib/watir-webdriver/collections/table_row_collection.rb +0 -11
@@ -5,6 +5,8 @@ module Watir
5
5
  find_all_by_multiple
6
6
  end
7
7
 
8
+ private
9
+
8
10
  def build_xpath(selectors)
9
11
  return if selectors.values.any? { |e| e.kind_of? Regexp }
10
12
 
@@ -22,4 +24,4 @@ module Watir
22
24
  end
23
25
 
24
26
  end # TableRowLocator
25
- end # Watir
27
+ end # Watir
@@ -9,6 +9,8 @@ module Watir
9
9
  find_all_by_multiple
10
10
  end
11
11
 
12
+ private
13
+
12
14
  def build_xpath(selectors)
13
15
  return if selectors.values.any? { |e| e.kind_of? Regexp }
14
16
 
@@ -34,14 +36,14 @@ module Watir
34
36
  def lhs_for(key)
35
37
  if @building == :input && key == :text
36
38
  "@value"
37
- elsif @building == :textarea && :value == :key
39
+ elsif @building == :textarea && key == :value
38
40
  "text()"
39
41
  else
40
42
  super
41
43
  end
42
44
  end
43
45
 
44
- def matches_selector?(rx_selector, element)
46
+ def matches_selector?(element, rx_selector)
45
47
  rx_selector = rx_selector.dup
46
48
 
47
49
  [:text, :value, :label].each do |key|
@@ -54,8 +56,10 @@ module Watir
54
56
  super
55
57
  end
56
58
 
59
+ VALID_TEXT_FIELD_TAGS = %w[input textarea]
60
+
57
61
  def tag_name_matches?(element, _)
58
- !!(/^(input|textarea)$/ === element.tag_name)
62
+ VALID_TEXT_FIELD_TAGS.include?(element.tag_name)
59
63
  end
60
64
  end # TextFieldLocator
61
65
  end # Watir
@@ -0,0 +1,78 @@
1
+ module Watir
2
+ module WindowSwitching
3
+
4
+ def windows(*args)
5
+ wins = @driver.window_handles.map do |id|
6
+ Window.new(@driver, id)
7
+ end
8
+
9
+ if args.empty?
10
+ wins
11
+ else
12
+ filter_windows(args, wins, :select)
13
+ end
14
+ end
15
+
16
+ def window(*args, &blk)
17
+ win = filter_windows(args, windows, :find)
18
+
19
+ if win && block_given?
20
+ win.use(&blk)
21
+ end
22
+
23
+ win
24
+ end
25
+
26
+ private
27
+
28
+ def filter_windows(args, wins, method)
29
+ sel = extract_selector(args)
30
+
31
+ unless sel.keys.all? { |k| [:title, :url].include? k }
32
+ raise ArgumentError, "invalid window selector: #{sel}"
33
+ end
34
+
35
+ wins.send(method) do |win|
36
+ sel.all? { |key, value| value === win.send(key) }
37
+ end
38
+ end
39
+ end # WindowSwitching
40
+
41
+ class Window
42
+ def initialize(driver, id)
43
+ @driver, @id = driver, id
44
+ end
45
+
46
+
47
+ def inspect
48
+ '#<%s:0x%x id=%s>' % [self.class, hash*2, @id.to_s]
49
+ end
50
+
51
+ def current?
52
+ @driver.window_handle == @id
53
+ end
54
+
55
+ def close
56
+ use { @driver.close }
57
+ end
58
+
59
+ def title
60
+ title = nil
61
+ use { title = @driver.title }
62
+
63
+ title
64
+ end
65
+
66
+ def url
67
+ url = nil
68
+ use { url = @driver.current_url }
69
+
70
+ url
71
+ end
72
+
73
+ def use(&blk)
74
+ @driver.switch_to.window(@id, &blk)
75
+ self
76
+ end
77
+ end # Window
78
+ end # Watir
@@ -0,0 +1,43 @@
1
+ require File.expand_path('watirspec/spec_helper', File.dirname(__FILE__))
2
+
3
+
4
+ describe Watir::Browser do
5
+
6
+ describe ".new" do
7
+ it "passes the args to webdriver" do
8
+ Selenium::WebDriver.should_receive(:for).with(:firefox, :foo).and_return(nil)
9
+ Watir::Browser.new(:firefox, :foo)
10
+ end
11
+
12
+ it "takes a Driver instance as argument" do
13
+ mock_driver = mock(Selenium::WebDriver::Driver)
14
+ Selenium::WebDriver::Driver.should_receive(:===).with(mock_driver).and_return(true)
15
+
16
+ lambda { Watir::Browser.new(mock_driver) }.should_not raise_error
17
+ end
18
+
19
+ it "raises ArgumentError for invalid args" do
20
+ lambda { Watir::Browser.new(Object.new) }.should raise_error(ArgumentError)
21
+ end
22
+ end
23
+
24
+ describe "#execute_script" do
25
+ it "returns DOM elements as Watir objects" do
26
+ browser.goto(WatirSpec.files + "/definition_lists.html")
27
+ returned = browser.execute_script("return document.getElementById('experience-list')")
28
+ returned.should be_kind_of(Watir::DList)
29
+ end
30
+ end
31
+
32
+ bug "http://github.com/jarib/watirspec/issues/issue/8", [:webdriver, :ie], [:webdriver, :chrome] do
33
+ it "raises an error when trying to interact with a closed browser" do
34
+ b = WatirSpec.new_browser
35
+ b.goto(WatirSpec.files + "/definition_lists.html")
36
+ b.close
37
+
38
+ lambda { b.dl(:id => "experience-list").id }.should raise_error(Error, "browser was closed")
39
+ end
40
+ end
41
+
42
+
43
+ end
@@ -0,0 +1,43 @@
1
+ require File.expand_path('watirspec/spec_helper', File.dirname(__FILE__))
2
+
3
+
4
+ describe Watir::Container do
5
+ before { @container = Object.new.extend(Watir::Container) }
6
+
7
+ describe "#extract_selector" do
8
+ before do
9
+ def @container.public_extract_selector(*args)
10
+ extract_selector(*args)
11
+ end
12
+ end
13
+
14
+ it "converts 2-arg selector into a hash" do
15
+ @container.public_extract_selector([:how, 'what']).
16
+ should == { :how => 'what' }
17
+ end
18
+
19
+ it "returns the hash given" do
20
+ @container.public_extract_selector([:how => "what"]).
21
+ should == { :how => "what" }
22
+ end
23
+
24
+ it "returns an empty hash if given no args" do
25
+ @container.public_extract_selector([]).should == {}
26
+ end
27
+
28
+ it "raises ArgumentError if given 1 arg which is not a Hash" do
29
+ lambda {
30
+ @container.public_extract_selector([:how])
31
+ }.should raise_error(ArgumentError)
32
+ end
33
+
34
+ it "raises ArgumentError if given > 2 args" do
35
+ lambda {
36
+ @container.public_extract_selector([:how, 'what', 'value'])
37
+ }.should raise_error(ArgumentError)
38
+ end
39
+
40
+
41
+
42
+ end
43
+ end
@@ -0,0 +1,305 @@
1
+ require File.expand_path("spec_helper", File.dirname(__FILE__))
2
+
3
+ describe Watir::ElementLocator do
4
+ include LocatorSpecHelper
5
+
6
+ describe "finds a single element" do
7
+ describe "by delegating to webdriver" do
8
+ WEBDRIVER_SELECTORS.each do |loc|
9
+ it "delegates to webdriver's #{loc} locator" do
10
+ expect_one(loc, "bar").and_return(element(:tag_name => "div"))
11
+ locate_one loc => "bar"
12
+ end
13
+ end
14
+ end
15
+
16
+ describe "with selectors not supported by webdriver" do
17
+ it "handles selector with tag name and a single attribute" do
18
+ expect_one :xpath, ".//div[@class='foo']"
19
+
20
+ locate_one :tag_name => "div",
21
+ :class => "foo"
22
+ end
23
+
24
+ it "handles selector with no tag name and and a single attribute" do
25
+ expect_one :xpath, ".//*[@title='foo']"
26
+ locate_one :title => "foo"
27
+ end
28
+
29
+ it "handles selector with tag name and multiple attributes" do
30
+ expect_one :xpath, %r".//div\[(@class='foo' and @title='bar'|@title='bar' and @class='foo')\]"
31
+
32
+ locate_one :tag_name => "div",
33
+ :class => "foo",
34
+ :title => 'bar'
35
+ end
36
+
37
+ it "handles selector with no tag name and multiple attributes" do
38
+ expect_one :xpath, %r".//\*\[(@class='foo' and @title='bar'|@title='bar' and @class='foo')\]"
39
+
40
+ locate_one :class => "foo",
41
+ :title => "bar"
42
+ end
43
+ end
44
+
45
+
46
+ describe "with special cased selectors" do
47
+ it "normalizes space for :text" do
48
+ expect_one :xpath, ".//div[normalize-space()='foo']"
49
+ locate_one :tag_name => "div",
50
+ :text => "foo"
51
+ end
52
+
53
+ it "translates :caption to :text" do
54
+ expect_one :xpath, ".//div[normalize-space()='foo']"
55
+
56
+ locate_one :tag_name => "div",
57
+ :caption => "foo"
58
+ end
59
+
60
+ it "translates :class_name to :class" do
61
+ expect_one :xpath, ".//div[@class='foo']"
62
+
63
+ locate_one :tag_name => "div",
64
+ :class_name => "foo"
65
+ end
66
+
67
+ it "handles data-* attributes" do
68
+ expect_one :xpath, ".//div[@data-name='foo']"
69
+
70
+ locate_one :tag_name => "div",
71
+ :data_name => "foo"
72
+ end
73
+
74
+ it "normalizes space for the :href attribute" do
75
+ expect_one :xpath, ".//a[normalize-space(@href)='foo']"
76
+
77
+ selector = {
78
+ :tag_name => "a",
79
+ :href => "foo"
80
+ }
81
+
82
+ locate_one selector, Watir::Anchor.attributes
83
+ end
84
+
85
+ it "uses the corresponding <label>'s @for attribute when locating by label" do
86
+ expect_one :xpath, ".//input[@type='text' and @id=//label[normalize-space()='foo']/@for]"
87
+
88
+ selector = {
89
+ :tag_name => "input",
90
+ :type => "text",
91
+ :label => "foo"
92
+ }
93
+
94
+ locate_one selector, Watir::Input.attributes
95
+ end
96
+
97
+ it "does not use the label element for <option> elements" do
98
+ expect_one :xpath, ".//option[@label='foo']"
99
+
100
+ locate_one :tag_name => "option",
101
+ :label => "foo"
102
+ end
103
+
104
+ it "translates ruby attribute names to content attribute names" do
105
+ expect_one :xpath, ".//meta[@http-equiv='foo']"
106
+
107
+ selector = {
108
+ :tag_name => "meta",
109
+ :http_equiv => "foo"
110
+ }
111
+
112
+ locate_one selector, Watir::Meta.attributes
113
+
114
+ # TODO: check edge cases
115
+ end
116
+ end
117
+
118
+ describe "with regexp selectors" do
119
+ it "handles selector with tag name and a single regexp attribute" do
120
+ elements = [
121
+ element(:tag_name => "div", :attributes => { :class => "foo" }),
122
+ element(:tag_name => "div", :attributes => { :class => "foob"})
123
+ ]
124
+
125
+ expect_all(:xpath, ".//div").and_return(elements)
126
+ locate_one(:tag_name => "div", :class => /oob/).should == elements[1]
127
+ end
128
+
129
+ it "handles :tag_name, :index and a single regexp attribute" do
130
+ elements = [
131
+ element(:tag_name => "div", :attributes => { :class => "foo" }),
132
+ element(:tag_name => "div", :attributes => { :class => "foo" })
133
+ ]
134
+
135
+ expect_all(:xpath, ".//div").and_return(elements)
136
+
137
+ selector = {
138
+ :tag_name => "div",
139
+ :class => /foo/,
140
+ :index => 1
141
+ }
142
+
143
+ locate_one(selector).should == elements[1]
144
+ end
145
+
146
+ it "handles mix of string and regexp attributes" do
147
+ elements = [
148
+ element(:tag_name => "div", :attributes => { :class => "foo", :title => "bar" }),
149
+ element(:tag_name => "div", :attributes => { :class => "foo", :title => "baz" })
150
+ ]
151
+
152
+ expect_all(:xpath, ".//div[@class='foo']").and_return(elements)
153
+
154
+ selector = {
155
+ :tag_name => "div",
156
+ :class => "foo",
157
+ :title => /baz/
158
+ }
159
+
160
+ locate_one(selector).should == elements[1]
161
+ end
162
+
163
+ it "handles :label => /regexp/ selector" do
164
+ label_elements = [
165
+ element(:tag_name => "label", :text => "foo", :attributes => { :for => "bar"}),
166
+ element(:tag_name => "label", :text => "foob", :attributes => { :for => "baz"})
167
+ ]
168
+ div_elements = [element(:tag_name => "div")]
169
+
170
+ expect_all(:tag_name, "label").ordered.and_return(label_elements)
171
+ expect_all(:xpath, ".//div[@id='baz']").ordered.and_return(div_elements)
172
+
173
+ locate_one(:tag_name => "div", :label => /oob/).should == div_elements.first
174
+ end
175
+
176
+ it "returns nil when no label matching the regexp is found" do
177
+ expect_all(:tag_name, "label").and_return([])
178
+ locate_one(:tag_name => "div", :label => /foo/).should be_nil
179
+ end
180
+
181
+ end
182
+
183
+ it "finds all if :index is given" do
184
+ # or could we use XPath indeces reliably instead?
185
+ elements = [
186
+ element(:tag_name => "div"),
187
+ element(:tag_name => "div")
188
+ ]
189
+
190
+ expect_all(:xpath, ".//div[@class='foo']").and_return(elements)
191
+
192
+ selector = {
193
+ :tag_name => "div",
194
+ :class => "foo",
195
+ :index => 1
196
+ }
197
+
198
+ locate_one(selector).should == elements[1]
199
+ end
200
+
201
+ it "returns nil if found element didn't match the selector tag_name" do
202
+ expect_one(:xpath, "//div").and_return(element(:tag_name => "div"))
203
+
204
+ selector = {
205
+ :tag_name => "input",
206
+ :type => "radio",
207
+ :xpath => "//div"
208
+ }
209
+
210
+ locate_one(selector, Watir::Input.attributes).should be_nil
211
+ end
212
+
213
+ describe "errors" do
214
+ it "raises a TypeError if :index is not a Fixnum" do
215
+ lambda {
216
+ locate_one(:tag_name => "div", :index => "bar")
217
+ }.should raise_error(TypeError, %[expected Fixnum, got "bar":String])
218
+ end
219
+
220
+ it "raises a TypeError if selector value is not a String or Regexp" do
221
+ lambda {
222
+ locate_one(:tag_name => 123)
223
+ }.should raise_error(TypeError, %[expected one of [String, Regexp], got 123:Fixnum])
224
+ end
225
+
226
+ it "raises a MissingWayOfFindingObjectException if the attribute is not valid" do
227
+ bad_selector = {:tag_name => "input", :href => "foo"}
228
+ valid_attributes = Watir::Input.attributes
229
+
230
+ lambda {
231
+ locate_one(bad_selector, valid_attributes)
232
+ }.should raise_error(MissingWayOfFindingObjectException, "invalid attribute: :href")
233
+ end
234
+ end
235
+ end
236
+
237
+ describe "finds several elements" do
238
+ describe "by delegating to webdriver" do
239
+ WEBDRIVER_SELECTORS.each do |loc|
240
+ it "delegates to webdriver's #{loc} locator" do
241
+ expect_all(loc, "bar").and_return([element(:tag_name => "div")])
242
+ locate_all(loc => "bar")
243
+ end
244
+ end
245
+ end
246
+
247
+ describe "with selectors not supported by webdriver" do
248
+ it "handles selector with tag name and a single attribute" do
249
+ expect_all :xpath, ".//div[@class='foo']"
250
+
251
+ locate_all :tag_name => "div",
252
+ :class => "foo"
253
+ end
254
+
255
+ it "handles selector with tag name and multiple attributes" do
256
+ expect_all :xpath, ".//div[@class='foo' and @title='bar']"
257
+
258
+ locate_all :tag_name => "div",
259
+ :class => "foo",
260
+ :title => 'bar'
261
+ end
262
+ end
263
+
264
+ describe "with regexp selectors" do
265
+ it "handles selector with tag name and a single regexp attribute" do
266
+ elements = [
267
+ element(:tag_name => "div", :attributes => { :class => "foo" }),
268
+ element(:tag_name => "div", :attributes => { :class => "foob"}),
269
+ element(:tag_name => "div", :attributes => { :class => "doob"}),
270
+ element(:tag_name => "div", :attributes => { :class => "noob"})
271
+ ]
272
+
273
+ expect_all(:xpath, ".//div").and_return(elements)
274
+ locate_all(:tag_name => "div", :class => /oob/).should == elements.last(3)
275
+ end
276
+
277
+ it "handles mix of string and regexp attributes" do
278
+ elements = [
279
+ element(:tag_name => "div", :attributes => { :class => "foo", :title => "bar" }),
280
+ element(:tag_name => "div", :attributes => { :class => "foo", :title => "baz" }),
281
+ element(:tag_name => "div", :attributes => { :class => "foo", :title => "bazt"})
282
+ ]
283
+
284
+ expect_all(:xpath, ".//div[@class='foo']").and_return(elements)
285
+
286
+ selector = {
287
+ :tag_name => "div",
288
+ :class => "foo",
289
+ :title => /baz/
290
+ }
291
+
292
+ locate_all(selector).should == elements.last(2)
293
+ end
294
+ end
295
+
296
+ describe "errors" do
297
+ it "raises ArgumentError if :index is given" do
298
+ lambda {
299
+ locate_all(:tag_name => "div", :index => 1)
300
+ }.should raise_error(ArgumentError, "can't locate all elements by :index")
301
+ end
302
+ end
303
+ end
304
+
305
+ end