celerity 0.0.1

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 (120) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +621 -0
  3. data/README.txt +58 -0
  4. data/Rakefile +4 -0
  5. data/lib/celerity.rb +47 -0
  6. data/lib/celerity/clickable_element.rb +11 -0
  7. data/lib/celerity/collections.rb +99 -0
  8. data/lib/celerity/container.rb +369 -0
  9. data/lib/celerity/disabled_element.rb +20 -0
  10. data/lib/celerity/element.rb +114 -0
  11. data/lib/celerity/element_collections.rb +67 -0
  12. data/lib/celerity/elements/button.rb +13 -0
  13. data/lib/celerity/elements/file_field.rb +12 -0
  14. data/lib/celerity/elements/form.rb +15 -0
  15. data/lib/celerity/elements/frame.rb +44 -0
  16. data/lib/celerity/elements/image.rb +70 -0
  17. data/lib/celerity/elements/label.rb +10 -0
  18. data/lib/celerity/elements/link.rb +13 -0
  19. data/lib/celerity/elements/radio_check.rb +59 -0
  20. data/lib/celerity/elements/select_list.rb +84 -0
  21. data/lib/celerity/elements/table.rb +94 -0
  22. data/lib/celerity/elements/table_body.rb +38 -0
  23. data/lib/celerity/elements/table_cell.rb +30 -0
  24. data/lib/celerity/elements/table_row.rb +34 -0
  25. data/lib/celerity/elements/text_field.rb +80 -0
  26. data/lib/celerity/exception.rb +48 -0
  27. data/lib/celerity/htmlunit/commons-codec-1.3.jar +0 -0
  28. data/lib/celerity/htmlunit/commons-collections-3.2.jar +0 -0
  29. data/lib/celerity/htmlunit/commons-httpclient-3.1.jar +0 -0
  30. data/lib/celerity/htmlunit/commons-io-1.4.jar +0 -0
  31. data/lib/celerity/htmlunit/commons-lang-2.4.jar +0 -0
  32. data/lib/celerity/htmlunit/commons-logging-1.1.1.jar +0 -0
  33. data/lib/celerity/htmlunit/cssparser-0.9.5.jar +0 -0
  34. data/lib/celerity/htmlunit/htmlunit-2.2-SNAPSHOT.jar +0 -0
  35. data/lib/celerity/htmlunit/js-1.7R1.jar +0 -0
  36. data/lib/celerity/htmlunit/nekohtml-1.9.7.jar +0 -0
  37. data/lib/celerity/htmlunit/sac-1.3.jar +0 -0
  38. data/lib/celerity/htmlunit/xalan-2.7.0.jar +0 -0
  39. data/lib/celerity/htmlunit/xercesImpl-2.8.1.jar +0 -0
  40. data/lib/celerity/htmlunit/xml-apis-1.0.b2.jar +0 -0
  41. data/lib/celerity/ie.rb +126 -0
  42. data/lib/celerity/input_element.rb +29 -0
  43. data/lib/celerity/non_control_elements.rb +50 -0
  44. data/lib/celerity/version.rb +9 -0
  45. data/setup.rb +1585 -0
  46. data/spec/area_spec.rb +79 -0
  47. data/spec/areas_spec.rb +41 -0
  48. data/spec/button_spec.rb +171 -0
  49. data/spec/buttons_spec.rb +40 -0
  50. data/spec/checkbox_spec.rb +259 -0
  51. data/spec/checkboxes_spec.rb +39 -0
  52. data/spec/div_spec.rb +174 -0
  53. data/spec/divs_spec.rb +40 -0
  54. data/spec/element_spec.rb +29 -0
  55. data/spec/filefield_spec.rb +110 -0
  56. data/spec/filefields_spec.rb +41 -0
  57. data/spec/form_spec.rb +53 -0
  58. data/spec/forms_spec.rb +42 -0
  59. data/spec/frame_spec.rb +103 -0
  60. data/spec/hidden_spec.rb +105 -0
  61. data/spec/hiddens_spec.rb +40 -0
  62. data/spec/html/forms_with_input_elements.html +107 -0
  63. data/spec/html/frame_1.html +17 -0
  64. data/spec/html/frame_2.html +16 -0
  65. data/spec/html/frames.html +11 -0
  66. data/spec/html/iframes.html +12 -0
  67. data/spec/html/images.html +24 -0
  68. data/spec/html/images/1.gif +0 -0
  69. data/spec/html/images/2.gif +0 -0
  70. data/spec/html/images/3.gif +0 -0
  71. data/spec/html/images/button.jpg +0 -0
  72. data/spec/html/images/circle.jpg +0 -0
  73. data/spec/html/images/map.gif +0 -0
  74. data/spec/html/images/map2.gif +0 -0
  75. data/spec/html/images/minus.gif +0 -0
  76. data/spec/html/images/originaltriangle.jpg +0 -0
  77. data/spec/html/images/plus.gif +0 -0
  78. data/spec/html/images/square.jpg +0 -0
  79. data/spec/html/images/triangle.jpg +0 -0
  80. data/spec/html/non_control_elements.html +85 -0
  81. data/spec/html/tables.html +119 -0
  82. data/spec/ie_spec.rb +146 -0
  83. data/spec/image_spec.rb +210 -0
  84. data/spec/images_spec.rb +39 -0
  85. data/spec/label_spec.rb +65 -0
  86. data/spec/labels_spec.rb +41 -0
  87. data/spec/li_spec.rb +114 -0
  88. data/spec/link_spec.rb +147 -0
  89. data/spec/links_spec.rb +43 -0
  90. data/spec/lis_spec.rb +40 -0
  91. data/spec/map_spec.rb +83 -0
  92. data/spec/maps_spec.rb +41 -0
  93. data/spec/p_spec.rb +140 -0
  94. data/spec/pre_spec.rb +110 -0
  95. data/spec/pres_spec.rb +41 -0
  96. data/spec/ps_spec.rb +40 -0
  97. data/spec/radio_spec.rb +260 -0
  98. data/spec/radios_spec.rb +43 -0
  99. data/spec/select_list_spec.rb +286 -0
  100. data/spec/select_lists_spec.rb +47 -0
  101. data/spec/span_spec.rb +156 -0
  102. data/spec/spans_spec.rb +65 -0
  103. data/spec/spec.opts +1 -0
  104. data/spec/spec_helper.rb +90 -0
  105. data/spec/table_bodies.rb +40 -0
  106. data/spec/table_bodies_spec.rb +42 -0
  107. data/spec/table_body_spec.rb +72 -0
  108. data/spec/table_cell_spec.rb +61 -0
  109. data/spec/table_cells_spec.rb +60 -0
  110. data/spec/table_row_spec.rb +59 -0
  111. data/spec/table_rows_spec.rb +57 -0
  112. data/spec/table_spec.rb +111 -0
  113. data/spec/tables_spec.rb +42 -0
  114. data/spec/text_field_spec.rb +234 -0
  115. data/spec/text_fields_spec.rb +45 -0
  116. data/tasks/environment.rake +7 -0
  117. data/tasks/rspec.rake +23 -0
  118. data/tasks/simple_ci.rake +94 -0
  119. data/tasks/testserver.rake +17 -0
  120. metadata +174 -0
@@ -0,0 +1,84 @@
1
+ module Celerity
2
+ #
3
+ # Input: Select
4
+ #
5
+ # This class is the way in which select boxes are manipulated
6
+ # Normally a user would not need to create this object as it is returned by the Watir::Container#select_list method
7
+ class SelectList < InputElement
8
+ TAGS = [ Identifier.new('select') ]
9
+
10
+ def get_all_contents
11
+ assert_exists
12
+ @object.getOptions.map { |e| e.asText }
13
+ end
14
+ alias_method :getAllContents, :get_all_contents
15
+
16
+ def get_selected_items
17
+ assert_exists
18
+ @object.getSelectedOptions.map { |e| e.asText }
19
+ end
20
+ alias_method :getSelectedItems, :get_selected_items
21
+
22
+ def clear_selection
23
+ # assert_exists called by SelectList#type here
24
+ @object.getSelectedOptions.each { |e| e.setSelected(false) } unless type() == 'select-one'
25
+ end
26
+ alias_method :clearSelection, :clear_selection
27
+
28
+ def select(value)
29
+ assert_exists
30
+ raise NoValueFoundException, "unknown option with value #{value.inspect}" unless include?(value)
31
+ @object.getOptions.select { |e| matches?(e.asText, value) }.each do |option|
32
+ @container.update_page(option.click)
33
+ end
34
+ end
35
+ alias_method :select_value, :select
36
+ alias_method :set, :select
37
+
38
+ def include?(value)
39
+ assert_exists
40
+ !!@object.getOptions.find { |e| matches?(e.asText, value) }
41
+ end
42
+ alias_method :includes?, :include?
43
+
44
+ def selected?(value)
45
+ assert_exists
46
+ # This should probably raise NoValueFoundException as well?
47
+ raise UnknownObjectException, "unknown option with value #{value.inspect}" unless include?(value)
48
+ !!@object.getOptions.find { |e| matches?(e.asText, value) && e.isSelected }
49
+ end
50
+
51
+ def type
52
+ assert_exists
53
+ 'select-' + (@object.isAttributeDefined('multiple') ? 'multiple' : 'one')
54
+ end
55
+
56
+ def value
57
+ assert_exists
58
+ if (optn = @object.getSelectedOptions.to_a.first)
59
+ optn.getValueAttribute
60
+ end
61
+ end
62
+
63
+ def option(attribute, value)
64
+ assert_exists
65
+ Option.new(self, attribute, value)
66
+ end
67
+ end
68
+
69
+ class Option < Element
70
+ TAGS = ['option']
71
+ ATTRIBUTES = BASE_ATTRIBUTES | [:selected, :disabled, :label, :value]
72
+
73
+ def select
74
+ assert_exists
75
+ # click?
76
+ @object.setSelected(true)
77
+ end
78
+
79
+ def selected?
80
+ assert_exists
81
+ @object.isSelected
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,94 @@
1
+ module Celerity
2
+
3
+ class Table < Element
4
+ include Container
5
+ TAGS = ['table']
6
+ ATTRIBUTES = BASE_ATTRIBUTES | [:summary, :width, :border, :frame, :rules, :cellspacing, :cellpadding, :align, :bgcolor]
7
+ DEFAULT_HOW = :name
8
+
9
+ def locate
10
+ @object = @container.locate_tagged_element(self, @how, @what)
11
+ if @object # cant call the assert_exists here, as an exists? method call will fail
12
+ @rows = @object.getRows
13
+ @cells = []
14
+ @rows.each do |row|
15
+ row.getCells.each do |c|
16
+ @cells << c
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ def rows
23
+ assert_exists
24
+ return TableRows.new(self, :object, @rows)
25
+ end
26
+
27
+ def cells
28
+ assert_exists
29
+ return TableCells.new(self, :object, @cells)
30
+ end
31
+
32
+ def each
33
+ assert_exists
34
+ 0.upto(@object.getRowCount-1) { |index| yield TableRow.new(self, :object, @rows[index]) }
35
+ end
36
+
37
+ def [](index)
38
+ assert_exists
39
+ return TableRow.new(self, :object, @rows[index-1])
40
+ end
41
+
42
+ def row_count
43
+ assert_exists
44
+ @object.getRowCount
45
+ end
46
+
47
+ def column_count(index = 1)
48
+ assert_exists
49
+ @object.getRow(index-1).getCells.length
50
+ end
51
+
52
+ # This method returns the table as a 2 dimensional array. Dont expect too much if there are nested tables, colspan etc.
53
+ # Raises an UnknownObjectException if the table doesn't exist.
54
+ # http://www.w3.org/TR/html4/struct/tables.html
55
+ def to_a
56
+ assert_exists
57
+ y = []
58
+ table_rows = @object.getRows
59
+ for table_row in table_rows
60
+ x = []
61
+ for td in table_row.getCells
62
+ x << td.asText
63
+ end
64
+ y << x
65
+ end
66
+ return y
67
+ end
68
+
69
+ def table_body(index = 1)
70
+ return @object.getBodies.get(index)
71
+ end
72
+ private :table_body
73
+
74
+ def body(how, what)
75
+ assert_exists
76
+ return TableBody.new(@container, how, what, self)
77
+ end
78
+
79
+ def bodies
80
+ assert_exists
81
+ return TableBodies.new(self)
82
+ end
83
+
84
+ def column_values(columnnumber)
85
+ return (1..row_count).collect { |index| self[index][columnnumber].text }
86
+ end
87
+
88
+ def row_values(rownumber)
89
+ return (1..column_count(rownumber)).collect { |index| self[rownumber][index].text }
90
+ end
91
+
92
+ end
93
+
94
+ end
@@ -0,0 +1,38 @@
1
+ module Celerity
2
+
3
+ class TableBody < Element
4
+ TAGS = ['tbody']
5
+
6
+ def locate
7
+ if @how == :object
8
+ @object = @what
9
+ else
10
+ @object = @container.locate_tagged_element(self, @how, @what)
11
+ end
12
+ if @object # cant call the assert_exists here, as an exists? method call will fail
13
+ @rows = @object.getRows
14
+ @cells = []
15
+ @rows.each do |row|
16
+ row.getCells.each do |c|
17
+ @cells << c
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def [](index)
24
+ assert_exists
25
+ return TableRow.new(self, :object, @rows[index-1])
26
+ end
27
+
28
+ def length
29
+ assert_exists
30
+ return @object.getRows.length
31
+ end
32
+
33
+ def each
34
+ 0.upto(length-1) { |index| yield TableRow.new(self, :object, @rows[index]) }
35
+ end
36
+
37
+ end
38
+ end
@@ -0,0 +1,30 @@
1
+ module Celerity
2
+
3
+ class TableCell < Element
4
+ include Celerity::Exception
5
+ include Container
6
+
7
+ TAGS = ['td']
8
+ ATTRIBUTES = BASE_ATTRIBUTES | [:abbr, :axis, :headers, :scope, :rowspan, :colspan] | CELLHALIGN_ATTRIBUTES | CELLVALIGN_ATTRIBUTES
9
+
10
+ def locate
11
+ if @how == :object
12
+ @object = @what
13
+ else
14
+ @object = @container.locate_tagged_element(self, @how, @what)
15
+ end
16
+ end
17
+
18
+ def colspan
19
+ assert_exists
20
+ attribute_value = @object.getAttributeValue('colspan').to_i
21
+ if attribute_value > 0
22
+ attribute_value
23
+ else
24
+ 1
25
+ end
26
+ end
27
+
28
+ alias_method :to_s, :text
29
+ end
30
+ end
@@ -0,0 +1,34 @@
1
+ module Celerity
2
+
3
+ class TableRow < Element
4
+ TAGS = ['tr']
5
+
6
+ def locate
7
+ if @how == :object
8
+ @object = @what
9
+ else
10
+ @object = @container.locate_tagged_element(self, @how, @what)
11
+ end
12
+ if @object # cant call the assert_exists here, as an exists? method call will fail
13
+ @cells = @object.getCells
14
+ end
15
+ end
16
+
17
+ def each
18
+ locate
19
+ 0.upto(@cells.length-1) { |index| yield TableCell.new(self, :object, @cells[index]) }
20
+ end
21
+
22
+ def [](index)
23
+ assert_exists
24
+ raise UnknownCellException, "Unable to locate a cell at index #{index}" if @cells.length < index
25
+ return TableCell.new(self, :object, @cells[index-1])
26
+ end
27
+
28
+ def column_count
29
+ locate
30
+ @cells.length
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ module Celerity
2
+ #
3
+ # Class representing text field elements
4
+ #
5
+ # This class is the main class for Text Fields
6
+ # Normally a user would not need to create this object as it is returned by the Watir::Container#text_field method
7
+ class TextField < InputElement
8
+ TAGS = [ Identifier.new('textarea'),
9
+ Identifier.new('input', :type => %w(text password)) ]
10
+
11
+ def clear
12
+ assert_exists
13
+ case @object.getTagName
14
+ when 'textarea'
15
+ @object.setText('')
16
+ when 'input'
17
+ @object.setValueAttribute('')
18
+ end
19
+ end
20
+
21
+ def set(value)
22
+ assert_enabled
23
+ assert_not_readonly
24
+ clear
25
+ # not sure what else to do here
26
+ if @object.class == com.gargoylesoftware.htmlunit.html.HtmlPasswordInput
27
+ @object.setValueAttribute(value.to_s)
28
+ else
29
+ value.to_s.to_java_bytes.each do |char|
30
+ @container.update_page @object.type(char)
31
+ end
32
+ end
33
+ end
34
+
35
+ def value=(value)
36
+ assert_enabled
37
+ assert_not_readonly
38
+ clear
39
+ case @object.getTagName
40
+ when 'textarea'
41
+ @object.setText(value.to_s)
42
+ when 'input'
43
+ @object.setValueAttribute(value.to_s)
44
+ end
45
+ end
46
+
47
+ def append(value)
48
+ assert_enabled
49
+ assert_not_readonly
50
+ value.to_s.to_java_bytes.each { |char| @container.update_page @object.type(char) }
51
+ end
52
+
53
+ # This bascially just moves the text to the other text field using TextField#append
54
+ # Should check if the HtmlUnit API supports some kind of dragging.
55
+ def drag_contents_to(how, what)
56
+ assert_exists # assert_enabled?
57
+ val = self.value
58
+ self.value = ''
59
+ @container.text_field(how, what).append(val)
60
+ end
61
+ alias_method :dragContentsTo, :drag_contents_to
62
+
63
+ def get_contents
64
+ self.value
65
+ end
66
+ alias_method :getContents, :get_contents
67
+
68
+ def verify_contains(expected)
69
+ assert_exists
70
+ !!contains_text(expected)
71
+ end
72
+ end
73
+
74
+ # this class can be used to access hidden field objects
75
+ # Normally a user would not need to create this object as it is returned by the Watir::Container#hidden method
76
+ class Hidden < TextField
77
+ TAGS = [ Identifier.new('input', :type => %w(hidden)) ]
78
+ end
79
+
80
+ end
@@ -0,0 +1,48 @@
1
+ module Celerity
2
+ module Exception
3
+
4
+ # Root class for all Celerity Exceptions
5
+ class CelerityException < RuntimeError
6
+ def initialize(message="")
7
+ super(message)
8
+ end
9
+ end
10
+
11
+ # This exception is thrown if an attempt is made to access an object that doesn't exist
12
+ class UnknownObjectException < CelerityException; end
13
+
14
+ # This exception is thrown if an attempt is made to access an object that is in a disabled state
15
+ class ObjectDisabledException < CelerityException; end
16
+
17
+ # This exception is thrown if an attempt is made to access a frame that cannot be found
18
+ class UnknownFrameException < CelerityException; end
19
+
20
+ # This exception is thrown if an attempt is made to access a form that cannot be found
21
+ class UnknownFormException < CelerityException; end
22
+
23
+ # This exception is thrown if an attempt is made to access an object that is in a read only state
24
+ class ObjectReadOnlyException < CelerityException; end
25
+
26
+ # This exception is thrown if an attempt is made to access an object when the specified value cannot be found
27
+ class NoValueFoundException < CelerityException; end
28
+
29
+ # This exception gets raised if part of finding an object is missing
30
+ class MissingWayOfFindingObjectException < CelerityException; end
31
+
32
+ # this exception is raised if an attempt is made to access a table cell that doesnt exist
33
+ class UnknownCellException < CelerityException; end
34
+
35
+ # This exception is thrown if an http error, such as a 404, 500 etc is encountered while navigating
36
+ class NavigationException < CelerityException; end
37
+
38
+ # This exception is raised if a timeout is exceeded
39
+ class TimeOutException < CelerityException
40
+ def initialize(duration, timeout)
41
+ @duration, @timeout = duration, timeout
42
+ super
43
+ end
44
+ attr_reader :duration, :timeout
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,126 @@
1
+ module Celerity
2
+ class IE
3
+ include Container
4
+ attr_accessor :page, :object
5
+
6
+ def self.start(uri)
7
+ browser = new
8
+ browser.goto(uri)
9
+ browser
10
+ end
11
+
12
+ def initialize(opts = {})
13
+ browser = RUBY_PLATFORM =~ /java/ ? ::HtmlUnit::BrowserVersion::FIREFOX_2 : ::HtmlUnit::BrowserVersion.FIREFOX_2
14
+ @webclient = ::HtmlUnit::WebClient.new(browser)
15
+ @webclient.setThrowExceptionOnScriptError(false) unless $DEBUG || opts[:enable_javascript_exceptions]
16
+ @webclient.setCssEnabled(false) if opts[:disable_css]
17
+ @page_container = self
18
+ @error_checkers = []
19
+ end
20
+
21
+ def goto(uri)
22
+ uri = "http://#{uri}" unless uri =~ %r{^http://}
23
+ set_page @webclient.getPage(uri)
24
+ uri
25
+ end
26
+
27
+ def close
28
+ @page = nil
29
+ end
30
+
31
+ def set_page(value)
32
+ # Log.debug(value.pretty_inspect)
33
+ @page = value
34
+ @object = @page.getDocumentElement
35
+ run_error_checks
36
+ end
37
+
38
+ def url
39
+ assert_exists
40
+ @page.getWebResponse.getUrl.toString
41
+ end
42
+
43
+ def base_url
44
+ "http://" + URI.parse( url() ).host
45
+ end
46
+
47
+ def title
48
+ @page.getTitleText
49
+ end
50
+
51
+ def html
52
+ @page ? @page.getDocumentElement.asXml : ''
53
+ end
54
+
55
+ def text
56
+ # nicer way to do this?
57
+ assert_exists
58
+ @page.getFirstByXPath("//body").asText
59
+ end
60
+
61
+ def back
62
+ raise NotImplementedError
63
+ end
64
+
65
+ def refresh
66
+ raise NotImplementedError
67
+ end
68
+
69
+ def exist?
70
+ !!@page
71
+ end
72
+ alias_method :exists?, :exist?
73
+
74
+ # check that we have a @page object
75
+ # need to find a better way to handle this
76
+ def assert_exists
77
+ raise UnknownObjectException, "no page loaded" unless exist?
78
+ end
79
+
80
+ def contains_text(expected_text)
81
+ return "" unless exist?
82
+ case expected_text
83
+ when Regexp
84
+ text().match(expected_text)
85
+ when String
86
+ text().index(expected_text)
87
+ else
88
+ raise ArgumentError, "Argument #{expected_text.inspect} should be a String or Regexp."
89
+ end
90
+ end
91
+
92
+ def run_error_checks
93
+ @error_checkers.each { |e| e.call(self) }
94
+ end
95
+
96
+ def add_checker(checker = nil, &block)
97
+ if block_given?
98
+ @error_checkers << block
99
+ elsif Proc === checker
100
+ @error_checkers << checker
101
+ else
102
+ raise ArgumentError, "argument must be a Proc or a block"
103
+ end
104
+ end
105
+
106
+ def disable_checker(checker)
107
+ @error_checkers.delete(checker)
108
+ end
109
+
110
+ # these are just for Watir compatability - should we keep them?
111
+ class << self
112
+ attr_accessor :speed, :attach_timeout, :visible
113
+ alias_method :start_window, :start
114
+ def reset_attach_timeout; @attach_timeout = 2.0; end
115
+ def each; end
116
+ def quit; end
117
+ def set_fast_speed; @speed = :fast; end
118
+ def set_slow_speed; @speed = :slow; end
119
+ end
120
+
121
+ attr_accessor :visible
122
+ def bring_to_front; true; end
123
+ def speed=(s); end
124
+
125
+ end # IE
126
+ end # Celerity