watir-webdriver 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. data/README.rdoc +9 -1
  2. data/Rakefile +2 -1
  3. data/VERSION +1 -1
  4. data/lib/watir-webdriver.rb +6 -7
  5. data/lib/watir-webdriver/attribute_helper.rb +17 -10
  6. data/lib/watir-webdriver/browser.rb +1 -1
  7. data/lib/watir-webdriver/cell_container.rb +19 -0
  8. data/lib/watir-webdriver/container.rb +8 -0
  9. data/lib/watir-webdriver/element_collection.rb +2 -2
  10. data/lib/watir-webdriver/elements/button.rb +3 -2
  11. data/lib/watir-webdriver/elements/element.rb +41 -1
  12. data/lib/watir-webdriver/elements/generated.rb +3 -3
  13. data/lib/watir-webdriver/elements/input.rb +0 -52
  14. data/lib/watir-webdriver/elements/select.rb +0 -1
  15. data/lib/watir-webdriver/elements/table.rb +26 -4
  16. data/lib/watir-webdriver/elements/table_cell.rb +36 -0
  17. data/lib/watir-webdriver/elements/table_row.rb +23 -14
  18. data/lib/watir-webdriver/elements/table_section.rb +9 -0
  19. data/lib/watir-webdriver/extensions/alerts.rb +69 -0
  20. data/lib/watir-webdriver/extensions/performance.rb +54 -0
  21. data/lib/watir-webdriver/locators/button_locator.rb +3 -5
  22. data/lib/watir-webdriver/locators/{table_row_locator.rb → child_cell_locator.rb} +11 -6
  23. data/lib/watir-webdriver/locators/child_row_locator.rb +37 -0
  24. data/lib/watir-webdriver/locators/element_locator.rb +24 -14
  25. data/lib/watir-webdriver/row_container.rb +19 -0
  26. data/lib/watir-webdriver/window_switching.rb +37 -10
  27. data/spec/alert_spec.rb +49 -0
  28. data/spec/element_locator_spec.rb +15 -16
  29. data/spec/element_spec.rb +0 -32
  30. data/spec/html/alerts.html +11 -0
  31. data/spec/input_spec.rb +8 -46
  32. data/spec/locator_spec_helper.rb +19 -5
  33. data/spec/spec_helper.rb +3 -0
  34. data/spec/watirspec/areas_spec.rb +8 -0
  35. data/spec/watirspec/browser_spec.rb +4 -4
  36. data/spec/watirspec/button_spec.rb +3 -4
  37. data/spec/watirspec/buttons_spec.rb +8 -0
  38. data/spec/watirspec/checkboxes_spec.rb +8 -0
  39. data/spec/watirspec/dds_spec.rb +8 -0
  40. data/spec/watirspec/dels_spec.rb +8 -0
  41. data/spec/watirspec/divs_spec.rb +8 -0
  42. data/spec/watirspec/dls_spec.rb +8 -0
  43. data/spec/watirspec/dts_spec.rb +8 -0
  44. data/spec/watirspec/element_spec.rb +71 -2
  45. data/spec/watirspec/ems_spec.rb +8 -0
  46. data/spec/watirspec/filefield_spec.rb +16 -11
  47. data/spec/watirspec/filefields_spec.rb +8 -0
  48. data/spec/watirspec/font_spec.rb +21 -19
  49. data/spec/watirspec/form_spec.rb +5 -3
  50. data/spec/watirspec/forms_spec.rb +11 -5
  51. data/spec/watirspec/frames_spec.rb +8 -0
  52. data/spec/watirspec/hiddens_spec.rb +8 -0
  53. data/spec/watirspec/hns_spec.rb +8 -0
  54. data/spec/watirspec/images_spec.rb +8 -0
  55. data/spec/watirspec/inses_spec.rb +8 -0
  56. data/spec/watirspec/label_spec.rb +2 -0
  57. data/spec/watirspec/labels_spec.rb +8 -0
  58. data/spec/watirspec/lib/server.rb +19 -1
  59. data/spec/watirspec/lib/spec_helper.rb +1 -1
  60. data/spec/watirspec/links_spec.rb +8 -0
  61. data/spec/watirspec/lis_spec.rb +8 -0
  62. data/spec/watirspec/maps_spec.rb +8 -0
  63. data/spec/watirspec/metas_spec.rb +8 -0
  64. data/spec/watirspec/ols_spec.rb +8 -0
  65. data/spec/watirspec/pres_spec.rb +8 -0
  66. data/spec/watirspec/ps_spec.rb +8 -0
  67. data/spec/watirspec/radios_spec.rb +8 -0
  68. data/spec/watirspec/select_list_spec.rb +6 -6
  69. data/spec/watirspec/select_lists_spec.rb +8 -0
  70. data/spec/watirspec/spans_spec.rb +8 -0
  71. data/spec/watirspec/strongs_spec.rb +8 -0
  72. data/spec/watirspec/table_nesting_spec.rb +50 -0
  73. data/spec/watirspec/table_spec.rb +62 -102
  74. data/spec/watirspec/tables_spec.rb +8 -0
  75. data/spec/watirspec/{table_body_spec.rb → tbody_spec.rb} +21 -31
  76. data/spec/watirspec/{table_bodies_spec.rb → tbodys_spec.rb} +8 -0
  77. data/spec/watirspec/td_spec.rb +72 -0
  78. data/spec/watirspec/{table_cells_spec.rb → tds_spec.rb} +18 -25
  79. data/spec/watirspec/text_fields_spec.rb +8 -0
  80. data/spec/watirspec/{table_footer_spec.rb → tfoot_spec.rb} +21 -28
  81. data/spec/watirspec/{table_footers_spec.rb → tfoots_spec.rb} +8 -0
  82. data/spec/watirspec/{table_header_spec.rb → thead_spec.rb} +21 -29
  83. data/spec/watirspec/{table_headers_spec.rb → theads_spec.rb} +8 -0
  84. data/spec/watirspec/tr_spec.rb +88 -0
  85. data/spec/watirspec/trs_spec.rb +68 -0
  86. data/spec/watirspec/uls_spec.rb +8 -0
  87. data/spec/watirspec/window_switching_spec.rb +165 -0
  88. data/support/html5.html +884 -422
  89. data/watir-webdriver.gemspec +91 -85
  90. metadata +159 -161
  91. data/Gemfile.lock +0 -48
  92. data/spec/html/closeable.html +0 -13
  93. data/spec/html/data_attributes.html +0 -9
  94. data/spec/html/window_switching.html +0 -12
  95. data/spec/watirspec/table_cell_spec.rb +0 -74
  96. data/spec/watirspec/table_row_spec.rb +0 -99
  97. data/spec/watirspec/table_rows_spec.rb +0 -60
  98. data/spec/window_switching_spec.rb +0 -116
@@ -22,10 +22,18 @@ http://jarib.github.com/watir-webdriver/doc/
22
22
 
23
23
  The file in lib/watir/elements/generated.rb is autogenerated from the HTML5 spec. This is done by extracting the IDL parts from the spec and processing them with the WebIDL gem (link below).
24
24
 
25
+ = Specs
26
+
27
+ watir-webdriver uses the watir2 branch of watirspec for testing. After cloning, you should fetch the submodule:
28
+
29
+ git submodule init && git submodule update
30
+
31
+ Specs specific to watir-webdriver are found in spec/*_spec.rb, with watirspec in spec/watirspec.
32
+
25
33
  = See also
26
34
 
27
35
  * http://github.com/jarib/webidl
28
- * http://webdriver.googlecode.com
36
+ * http://github.com/jarib/watirspec/tree/watir2
29
37
  * http://selenium.googlecode.com
30
38
 
31
39
  = Dependencies
data/Rakefile CHANGED
@@ -11,7 +11,7 @@ begin
11
11
  gem.homepage = "http://github.com/jarib/watir-webdriver"
12
12
  gem.authors = ["Jari Bakken"]
13
13
 
14
- gem.add_dependency "selenium-webdriver", '>= 0.0.28'
14
+ gem.add_dependency "selenium-webdriver", '0.0.28'
15
15
 
16
16
  gem.add_development_dependency "rspec"
17
17
  gem.add_development_dependency "yard", "~> 0.6"
@@ -118,6 +118,7 @@ namespace :html5 do
118
118
  mv "#{file}.new", file
119
119
  end
120
120
 
121
+ task :update => [:download, :generate, :overwrite]
121
122
  end # html5
122
123
 
123
124
  task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.9
1
+ 0.1.0
@@ -10,7 +10,8 @@ require "watir-webdriver/container"
10
10
  require "watir-webdriver/locators/element_locator"
11
11
  require "watir-webdriver/locators/button_locator"
12
12
  require "watir-webdriver/locators/text_field_locator"
13
- require "watir-webdriver/locators/table_row_locator"
13
+ require "watir-webdriver/locators/child_row_locator"
14
+ require "watir-webdriver/locators/child_cell_locator"
14
15
  require "watir-webdriver/browser"
15
16
 
16
17
  module Watir
@@ -29,6 +30,8 @@ module Watir
29
30
  end
30
31
 
31
32
  require "watir-webdriver/attribute_helper"
33
+ require "watir-webdriver/row_container"
34
+ require "watir-webdriver/cell_container"
32
35
  require "watir-webdriver/element_collection"
33
36
  require "watir-webdriver/elements/element"
34
37
  require "watir-webdriver/elements/generated"
@@ -48,18 +51,14 @@ require "watir-webdriver/elements/form"
48
51
  require "watir-webdriver/elements/option"
49
52
  require "watir-webdriver/elements/table"
50
53
  require "watir-webdriver/elements/table_row"
54
+ require "watir-webdriver/elements/table_cell"
55
+ require "watir-webdriver/elements/table_section"
51
56
 
52
57
  Watir.tag_to_class.freeze
53
58
 
54
59
  module Watir
55
60
  module Container
56
61
 
57
- # TODO: deprecate cell/row in favor of td/tr?
58
- alias_method :cell, :td
59
- alias_method :cells, :tds
60
- alias_method :row, :tr
61
- alias_method :rows, :trs
62
-
63
62
  end # Container
64
63
  end # Watir
65
64
 
@@ -1,15 +1,15 @@
1
1
  module Watir
2
-
2
+
3
3
  #
4
4
  # @private
5
- #
5
+ #
6
6
  # Extended by Element, provides methods for defining attributes on the element classes.
7
- #
8
-
7
+ #
8
+
9
9
  module AttributeHelper
10
-
10
+
11
11
  IGNORED_ATTRIBUTES = [:text, :hash]
12
-
12
+
13
13
  def typed_attributes
14
14
  @typed_attributes ||= Hash.new { |hash, type| hash[type] = [] }
15
15
  end
@@ -74,7 +74,8 @@ module Watir
74
74
  def define_int_attribute(mname, aname)
75
75
  define_method mname do
76
76
  assert_exists
77
- @element.attribute(aname).to_i
77
+ value = @element.attribute(aname)
78
+ value && Integer(value)
78
79
  end
79
80
  end
80
81
 
@@ -85,7 +86,7 @@ module Watir
85
86
  end
86
87
 
87
88
  def method_name_for(type, attribute)
88
- # TODO: rethink this - this list could get pretty long...
89
+ # http://github.com/jarib/watir-webdriver/issues/issue/26
89
90
  name = case attribute
90
91
  when :html_for
91
92
  'for'
@@ -103,6 +104,8 @@ module Watir
103
104
  end
104
105
 
105
106
  def attribute_for_method(method)
107
+ # http://github.com/jarib/watir-webdriver/issues/issue/26
108
+
106
109
  case method.to_sym
107
110
  when :class_name
108
111
  'class'
@@ -112,10 +115,14 @@ module Watir
112
115
  'readonly'
113
116
  when :http_equiv
114
117
  'http-equiv'
118
+ when :col_span
119
+ 'colspan'
120
+ when :row_span
121
+ 'rowspan'
115
122
  else
116
123
  method.to_s
117
124
  end
118
125
  end
119
-
126
+
120
127
  end # AttributeHelper
121
- end # Watir
128
+ end # Watir
@@ -28,7 +28,7 @@ module Watir
28
28
  # @param args Passed to the underlying driver
29
29
  #
30
30
 
31
- def initialize(browser, *args)
31
+ def initialize(browser = :firefox, *args)
32
32
  case browser
33
33
  when Symbol, String
34
34
  @driver = Selenium::WebDriver.for browser.to_sym, *args
@@ -0,0 +1,19 @@
1
+ module Watir
2
+ module CellContainer
3
+
4
+ def cell(*args)
5
+ cell = TableCell.new(self, extract_selector(args).merge(:tag_name => /^(th|td)$/))
6
+ cell.locator_class = ChildCellLocator
7
+
8
+ cell
9
+ end
10
+
11
+ def cells(*args)
12
+ cells = TableCellCollection.new(self, extract_selector(args).merge(:tag_name => /^(th|td)$/))
13
+ cells.locator_class = ChildCellLocator
14
+
15
+ cells
16
+ end
17
+
18
+ end
19
+ end
@@ -3,6 +3,14 @@ module Watir
3
3
  module Container
4
4
  include XpathSupport
5
5
 
6
+ def element(*args)
7
+ HTMLElement.new(self, extract_selector(args))
8
+ end
9
+
10
+ def elements(*args)
11
+ HTMLElementCollection.new(self, extract_selector(args))
12
+ end
13
+
6
14
  private
7
15
 
8
16
  def browserbot(function_name, *arguments)
@@ -53,7 +53,7 @@ module Watir
53
53
  #
54
54
 
55
55
  def first
56
- to_a[0] || element_class.new(@parent, :index => 0)
56
+ self[0]
57
57
  end
58
58
 
59
59
  #
@@ -63,7 +63,7 @@ module Watir
63
63
  #
64
64
 
65
65
  def last
66
- to_a[-1] || element_class.new(@parent, :index => -1)
66
+ self[-1]
67
67
  end
68
68
 
69
69
  #
@@ -12,13 +12,14 @@ module Watir
12
12
  # add the attributes from <input>
13
13
  attributes Watir::Input.typed_attributes
14
14
 
15
+ VALID_TYPES = %w[button reset submit image]
15
16
 
16
17
  def self.from(parent, element)
17
18
  if element.tag_name == "button" ||
18
- element.tag_name == "input" && ButtonLocator::VALID_TYPES.include?(element.attribute(:type))
19
+ element.tag_name == "input" && VALID_TYPES.include?(element.attribute(:type))
19
20
  Button.new(parent, :element => element)
20
21
  else
21
- raise TypeError, "expected button or input[@type=#{ButtonLocator::VALID_TYPES.join("|")}] for #{element.inspect}"
22
+ raise TypeError, "expected button or input[@type=#{VALID_TYPES.join("|")}] for #{element.inspect}"
22
23
  end
23
24
  end
24
25
 
@@ -42,6 +42,8 @@ module Watir
42
42
  end
43
43
 
44
44
  def ==(other)
45
+ return false unless other.kind_of? self.class
46
+
45
47
  assert_exists
46
48
  @element == other.element
47
49
  end
@@ -173,6 +175,40 @@ module Watir
173
175
  @parent.run_checkers
174
176
  end
175
177
 
178
+ #
179
+ # Cast this Element instance to a more specific subtype.
180
+ #
181
+ # Example:
182
+ #
183
+ # browser.element(:xpath => "//input[@type='submit']").to_subtype #=> #<Watir::Button>
184
+ #
185
+
186
+ def to_subtype
187
+ elem = element()
188
+ tag_name = elem.tag_name
189
+
190
+ klass = nil
191
+
192
+ if tag_name == "input"
193
+ klass = case elem.attribute(:type)
194
+ when *Button::VALID_TYPES
195
+ Button
196
+ when 'checkbox'
197
+ CheckBox
198
+ when 'radio'
199
+ Radio
200
+ when 'file'
201
+ FileField
202
+ else
203
+ TextField
204
+ end
205
+ else
206
+ klass = Watir.element_class_for(tag_name)
207
+ end
208
+
209
+ klass.new(@parent, :element => elem)
210
+ end
211
+
176
212
  protected
177
213
 
178
214
  def assert_exists
@@ -189,11 +225,15 @@ module Watir
189
225
 
190
226
  def locate
191
227
  @parent.assert_exists
192
- ElementLocator.new(@parent.wd, @selector, self.class.attribute_list).locate
228
+ locator_class.new(@parent.wd, @selector, self.class.attribute_list).locate
193
229
  end
194
230
 
195
231
  private
196
232
 
233
+ def locator_class
234
+ ElementLocator
235
+ end
236
+
197
237
  def selector_string
198
238
  @selector.inspect
199
239
  end
@@ -74,7 +74,7 @@ module Watir
74
74
  end
75
75
  end
76
76
  class Frame < HTMLElement
77
- attributes(:string => [:frame_border, :long_desc, :margin_height, :margin_width, :name, :scrolling, :src], :bool => [:no_resize], :document => [:content_document])
77
+ attributes(:string => [:frame_border, :long_desc, :margin_height, :margin_width, :name, :scrolling, :src, :content_window], :bool => [:no_resize], :document => [:content_document])
78
78
  end
79
79
  class FrameCollection < ElementCollection
80
80
  def element_class
@@ -90,7 +90,7 @@ module Watir
90
90
  end
91
91
  end
92
92
  class Marquee < HTMLElement
93
- attributes(:string => [:behavior, :bg_color, :direction, :height, :true_speed, :width], :int => [:hspace, :loop, :scroll_amount, :scroll_delay, :vspace], :function => [:onbounce, :onfinish, :onstart])
93
+ attributes(:string => [:behavior, :bg_color, :direction, :height, :width], :int => [:hspace, :loop, :scroll_amount, :scroll_delay, :vspace], :bool => [:true_speed], :function => [:onbounce, :onfinish, :onstart])
94
94
  end
95
95
  class MarqueeCollection < ElementCollection
96
96
  def element_class
@@ -410,7 +410,7 @@ module Watir
410
410
  end
411
411
  end
412
412
  class Track < HTMLElement
413
- attributes(:string => [:kind, :label, :src, :srclang, :track])
413
+ attributes(:string => [:kind, :src, :charset, :srclang, :label, :track])
414
414
  end
415
415
  class TrackCollection < ElementCollection
416
416
  def element_class
@@ -38,57 +38,5 @@ module Watir
38
38
  TextFieldLocator::NON_TEXT_TYPES.include?(value) ? value : 'text'
39
39
  end
40
40
 
41
- #
42
- # not sure about this
43
- #
44
- # this is mostly useful if you're using Browser#element_by_xpath, and want to
45
- # 'cast' the returned Input instance to one of the subclasses
46
- #
47
-
48
- #
49
- # @return [Watir::CheckBox]
50
- #
51
-
52
- def to_checkbox
53
- assert_exists
54
- CheckBox.from(@parent, @element)
55
- end
56
-
57
- #
58
- # @return [Watir::Radio]
59
- #
60
-
61
- def to_radio
62
- assert_exists
63
- Radio.from(@parent, @element)
64
- end
65
-
66
- #
67
- # @return [Watir::Button]
68
- #
69
-
70
- def to_button
71
- assert_exists
72
- Button.from(@parent, @element)
73
- end
74
-
75
- #
76
- # @return [Watir::TextField]
77
- #
78
-
79
- def to_text_field
80
- assert_exists
81
- TextField.from(@parent, @element)
82
- end
83
-
84
- #
85
- # @return [Watir::FileField]
86
- #
87
-
88
- def to_file_field
89
- assert_exists
90
- FileField.from(@parent, @element)
91
- end
92
-
93
41
  end # Input
94
42
  end # Watir
@@ -44,7 +44,6 @@ module Watir
44
44
  # TODO: optimize similar to selected?
45
45
  options.any? { |e| str_or_rx === e.text }
46
46
  end
47
- alias_method :includes?, :include?
48
47
 
49
48
  #
50
49
  # Select the option(s) whose text or label matches the given string.
@@ -1,19 +1,41 @@
1
1
  # encoding: utf-8
2
+
2
3
  module Watir
3
4
  class Table < HTMLElement
5
+ include RowContainer
4
6
 
5
7
  #
6
- # The table as an 2D Array of strings with the text of each cell.
8
+ # The table as a 2D Array of strings with the text of each cell.
7
9
  #
8
10
  # @return [Array<Array<String>>]
9
11
  #
10
12
 
11
- def to_a
13
+ def strings
12
14
  assert_exists
13
15
 
14
- trs.inject [] do |res, row|
15
- res << row.wd.find_elements(:xpath, ".//td | .//th").map { |cell| cell.text }
16
+ rows.inject [] do |res, row|
17
+ res << row.cells.map { |cell| cell.text }
18
+ end
19
+ end
20
+ alias_method :to_a, :strings
21
+
22
+ def hashes
23
+ all_rows = rows.to_a
24
+ header_row = all_rows.shift or raise Exception::Error, "no rows in table"
25
+
26
+ headers = header_row.ths.map { |header_cell| header_cell.text }
27
+ result = []
28
+
29
+ all_rows.each_with_index do |row, idx|
30
+ cells = row.cells.to_a
31
+ if cells.length != headers.length
32
+ raise Exception::Error, "row at index #{idx} has #{cells.length} cells, expected #{headers.length}"
33
+ end
34
+
35
+ result << headers.inject({}) { |res, header| res.merge(header => cells.shift.text) }
16
36
  end
37
+
38
+ result
17
39
  end
18
40
 
19
41
  #
@@ -0,0 +1,36 @@
1
+ module Watir
2
+ class TableCell < HTMLElement
3
+ # @private
4
+ attr_writer :locator_class
5
+
6
+ def locator_class
7
+ @locator_class || super
8
+ end
9
+
10
+ def colspan
11
+ value = attribute_value :colspan
12
+ value ? Integer(value) : 1
13
+ end
14
+ end
15
+
16
+ class TableCellCollection < ElementCollection
17
+ attr_writer :locator_class
18
+
19
+ def locator_class
20
+ @locator_class || super
21
+ end
22
+
23
+ def elements
24
+ # we do this craziness since the xpath used will find direct child rows
25
+ # before any rows inside thead/tbody/tfoot...
26
+ elements = super
27
+
28
+ if locator_class == ChildCellLocator
29
+ elements = elements.sort_by { |row| row.attribute(:cellIndex).to_i }
30
+ end
31
+
32
+ elements
33
+ end
34
+
35
+ end
36
+ end