celerity 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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,20 @@
1
+ module Celerity
2
+ module DisabledElement
3
+ def enabled?
4
+ !disabled?
5
+ end
6
+
7
+ def disabled?
8
+ assert_exists
9
+ @object.isDisabled
10
+ end
11
+ alias_method :disabled, :disabled?
12
+
13
+ def assert_enabled
14
+ if disabled?
15
+ raise ObjectDisabledException, "Object #{@how.inspect} and #{@what.inspect} is disabled"
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,114 @@
1
+ module Celerity
2
+ class Element
3
+ include Exception
4
+ include Container
5
+ attr_accessor :container, :object
6
+
7
+ # HTML 4.01 Transitional DTD
8
+ CELLHALIGN_ATTRIBUTES = [:align, :char, :charoff]
9
+ CELLVALIGN_ATTRIBUTES = [:valign]
10
+ CORE_ATTRIBUTES = [:class, :id, :style, :title] # Not valid in base, head, html, meta, param, script, style, and title elements.
11
+ I18N_ATTRIBUTES = [:dir, :lang] # Not valid in base, br, frame, frameset, hr, iframe, param, and script elements.
12
+ EVENT_ATTRIBUTES = [:onclick, :ondblclick, :onmousedown, :onmouseup, :onmouseover, :onmousemove, :onmouseout, :onkeypress, :onkeydown, :onkeyup]
13
+ SLOPPY_ATTRIBUTES = [:name, :value]
14
+ BASE_ATTRIBUTES = CORE_ATTRIBUTES | I18N_ATTRIBUTES | EVENT_ATTRIBUTES | SLOPPY_ATTRIBUTES
15
+ ATTRIBUTES = BASE_ATTRIBUTES
16
+
17
+ class Identifier < Struct.new(:tag, :attributes)
18
+ def initialize(t, a={}); super(t, a); end
19
+ end
20
+
21
+ def initialize(container, *args)
22
+ set_container container
23
+ process_arguments(*args)
24
+ end
25
+
26
+ def process_arguments(*args)
27
+ if args.size == 1 #&& !args.first.kind_of?(Hash) #(support multiple attributes)
28
+ raise ArgumentError, "wrong number of arguments (1 for 2), DEFAULT_HOW not defined" unless defined? self.class::DEFAULT_HOW
29
+ raise NotImplementedError if args[0].class == Hash
30
+ @how = self.class::DEFAULT_HOW
31
+ @what = args.shift
32
+ else
33
+ @how, @what = *args
34
+ end
35
+ end
36
+
37
+ def locate
38
+ @object = @container.locate_tagged_element(self, @how, @what)
39
+ end
40
+
41
+ def to_s
42
+ assert_exists
43
+ create_string(@object)
44
+ end
45
+
46
+ # number of spaces that separate the property from the value in the create_string method
47
+ TO_S_SIZE = 14
48
+
49
+ def create_string(element)
50
+ n = []
51
+ n << "tag:".ljust(TO_S_SIZE) + element.getTagName if element.getTagName.length > 0
52
+ iterator = element.getAttributeEntriesIterator
53
+ while (iterator.hasNext)
54
+ attribute = iterator.next
55
+ n << " #{attribute.getName}:".ljust(TO_S_SIZE+2) + attribute.getHtmlValue.to_s
56
+ end
57
+ n << " text:".ljust(TO_S_SIZE+2) + element.asText if element.asText.length > 0
58
+ return n.join("\n")
59
+ end
60
+
61
+ def attribute_value(attribute)
62
+ assert_exists
63
+ @object.getAttribute(attribute)
64
+ end
65
+
66
+ def assert_exists
67
+ locate if defined?(locate)
68
+ unless @object
69
+ raise UnknownObjectException, "Unable to locate object, using #{@how.inspect} and #{@what.inspect}"
70
+ end
71
+ end
72
+
73
+ def exists?
74
+ begin
75
+ assert_exists
76
+ true
77
+ rescue UnknownObjectException
78
+ false
79
+ end
80
+ end
81
+ alias_method :exist?, :exists?
82
+ alias_method :exists, :exists?
83
+
84
+ def text
85
+ assert_exists
86
+ @object.asText.strip
87
+ end
88
+ alias_method :innerText, :text
89
+ alias_method :inner_text, :text
90
+
91
+ def to_xml
92
+ assert_exists
93
+ @object.asXml
94
+ end
95
+ alias_method :asXml, :to_xml
96
+ alias_method :as_xml, :to_xml
97
+ alias_method :html, :to_xml
98
+
99
+ # used to get attributes
100
+ def method_missing(meth, *args, &blk)
101
+ assert_exists
102
+ meth = :class if meth == :class_name
103
+ meth = :value if meth == :caption
104
+
105
+ if self.class::ATTRIBUTES.include?(meth)
106
+ @object.getAttributeValue(meth.to_s)
107
+ else
108
+ Log.info "Element\#method_missing calling super with #{meth.inspect}"
109
+ super
110
+ end
111
+ end
112
+
113
+ end # Element
114
+ end # Celerity
@@ -0,0 +1,67 @@
1
+ module Celerity
2
+ # this class is the super class for the iterator classes (buttons, links, spans etc
3
+ # it would normally only be accessed by the iterator methods (spans, links etc) of IE
4
+ class ElementCollections
5
+ include Enumerable
6
+
7
+ def element_tags
8
+ element_class::TAGS
9
+ end
10
+
11
+ def length
12
+ if @object
13
+ @object.length
14
+ elsif Element::Identifier === element_tags.first
15
+ idents = element_tags
16
+ tags = idents.map { |e| e.tag }
17
+ tags.map! { |t| t.downcase }
18
+ elements = @container.object.getAllHtmlChildElements.iterator.to_a.select do |elem|
19
+ tags.include?(elem.getTagName)
20
+ end
21
+ elements = elements.select do |e|
22
+ idents.any? do |ident|
23
+ next unless ident.tag == e.getTagName
24
+ if ident.attributes.empty?
25
+ true
26
+ else
27
+ ident.attributes.any? { |key, value| value.include?(e.getAttributeValue(key.to_s)) }
28
+ end
29
+ end
30
+ end
31
+ return elements.length
32
+ else
33
+ length = 0
34
+ element_tags.each { |element_tag| length += @container.object.getHtmlElementsByTagName(element_tag).toArray.size }
35
+ return length
36
+ end
37
+ end
38
+ alias_method :size, :length
39
+
40
+ def initialize(container, how = nil, what = nil)
41
+ @container = container
42
+ if how == :object
43
+ @object = what
44
+ end
45
+ @length = length # defined by subclasses
46
+ end
47
+
48
+ def each
49
+ 0.upto(@length-1) { |i| yield iterator_object(i) }
50
+ end
51
+
52
+ def [](n)
53
+ return iterator_object(n-1)
54
+ end
55
+
56
+ def to_s
57
+ return self.collect { |i| i.to_s }.join("\n")
58
+ end
59
+
60
+ # this method creates an object of the correct type that the iterators use
61
+ private
62
+ def iterator_object(i)
63
+ element_class.new(@container, :index, i+1)
64
+ end
65
+
66
+ end # ElementCollections
67
+ end # Celerity
@@ -0,0 +1,13 @@
1
+ module Celerity
2
+ #
3
+ # Input: Button
4
+ #
5
+ # Class representing button elements
6
+ #
7
+ class Button < InputElement
8
+ TAGS = [ Identifier.new('button'),
9
+ Identifier.new('input', :type => %w(submit reset image button)) ]
10
+ DEFAULT_HOW = :value
11
+ end
12
+
13
+ end
@@ -0,0 +1,12 @@
1
+
2
+ module Celerity
3
+ # For fields that accept file uploads
4
+ class FileField < InputElement
5
+ TAGS = [ Identifier.new('input', :type => %w(file)) ]
6
+
7
+ def set(value)
8
+ assert_exists
9
+ @object.setValueAttribute(value.to_s)
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ module Celerity
2
+ class Form < Element
3
+ include Container
4
+ TAGS = ['form']
5
+ # HTML 4.01 Transitional DTD
6
+ ATTRIBUTES = BASE_ATTRIBUTES | [:action, :method, :enctype, :accept, :name, :onsubmit, :onreset, :target, :'accept-charset']
7
+ DEFAULT_HOW = :name
8
+
9
+ def submit
10
+ assert_exists
11
+ raise NotImplementedError
12
+ end
13
+
14
+ end
15
+ end
@@ -0,0 +1,44 @@
1
+ module Celerity
2
+ class Frame < Element
3
+ include Container
4
+ attr_accessor :page
5
+ TAGS = {'frame' => nil, 'iframe' => nil}
6
+ ATTRIBUTES = BASE_ATTRIBUTES | [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :noresize, :scrolling]
7
+ DEFAULT_HOW = :name
8
+
9
+ def locate
10
+ # Log.debug(@container.object.inspect)
11
+ frame_elements = @container.object.getByXPath(".//iframe | .//frame").collect { |frame| frame.getEnclosedWindow.getFrameElement }
12
+ unless frame_elements.empty?
13
+ case @how
14
+ when :id, :name, :src, :class
15
+ matching_frame_elements = frame_elements.select { |frame_element| matches?(frame_element.getAttribute(@how.to_s), @what) }
16
+ if @frame_element = matching_frame_elements.first
17
+ @object = @frame_element.getEnclosedPage.getDocumentElement
18
+ end
19
+ when :index
20
+ if @frame_element = frame_elements[@what-1]
21
+ @object = @frame_element.getEnclosedPage.getDocumentElement
22
+ end
23
+ when :xpath
24
+ raise NotImplementedError
25
+ else
26
+ raise MissingWayOfFindingObjectException
27
+ end
28
+ end
29
+ raise UnknownFrameException unless @object
30
+ end
31
+
32
+ def update_page(value)
33
+ # Log.debug(value.asXml)
34
+ @page_container.set_page(value.getEnclosingWindow.getTopWindow.getEnclosedPage)
35
+ end
36
+
37
+ def to_s
38
+ assert_exists
39
+ create_string(@frame_element)
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,70 @@
1
+ module Celerity
2
+
3
+ # This class is the means of accessing an image on a page.
4
+ # Normally a user would not need to create this object as it is returned by the Watir::Container#image method
5
+ #
6
+ # many of the methods available to this object are inherited from the Element class
7
+ #
8
+ class Image < Element
9
+ include ClickableElement
10
+ include DisabledElement
11
+
12
+ TAGS = ['img']
13
+ ATTRIBUTES = BASE_ATTRIBUTES | [:src, :alt, :longdesc, :name, :height, :width, :usemap, :ismap, :align, :border, :hspace, :vspace]
14
+
15
+ # this method returns the file created date of the image
16
+ def file_created_date
17
+ assert_exists
18
+ web_response = @object.getWebResponse(true)
19
+ return Time.parse(web_response.getResponseHeaderValue("Last-Modified").to_s)
20
+ end
21
+ alias_method :fileCreatedDate, :file_created_date
22
+
23
+ # this method returns the filesize of the image
24
+ def file_size
25
+ assert_exists
26
+ web_response = @object.getWebResponse(true)
27
+ return web_response.getResponseBody().length
28
+ end
29
+ alias_method :fileSize, :file_size
30
+
31
+ # returns the width in pixels of the image, as a string
32
+ def width
33
+ assert_exists
34
+ @object.getWidth
35
+ end
36
+
37
+ # returns the height in pixels of the image, as a string
38
+ def height
39
+ assert_exists
40
+ @object.getHeight
41
+ end
42
+
43
+ def disabled?
44
+ assert_exists
45
+ raise NotImplementedError
46
+ end
47
+ alias_method :disabled, :disabled?
48
+
49
+ def loaded?
50
+ assert_exists
51
+ begin
52
+ @object.getImageReader
53
+ return true
54
+ rescue
55
+ return false
56
+ end
57
+ end
58
+ alias_method :hasLoaded?, :loaded?
59
+ alias_method :has_loaded?, :loaded?
60
+
61
+ def save(filename)
62
+ assert_exists
63
+ image_reader = @object.getImageReader
64
+ file = java.io.File.new(filename)
65
+ buffered_image = image_reader.read(0);
66
+ return javax.imageio.ImageIO.write(buffered_image, image_reader.getFormatName(), file);
67
+ end
68
+ end
69
+
70
+ end
@@ -0,0 +1,10 @@
1
+ module Celerity
2
+
3
+ class Label < Element
4
+ TAGS = ['label']
5
+ ATTRIBUTES = BASE_ATTRIBUTES | [:for, :accesskey, :onfocus, :onblur]
6
+
7
+
8
+ end
9
+
10
+ end
@@ -0,0 +1,13 @@
1
+ module Celerity
2
+ class Link < Element
3
+ TAGS = ['a']
4
+ ATTRIBUTES = BASE_ATTRIBUTES | [:charset, :type, :name, :href, :hreflang, :target, :rel, :rev, :accesskey, :shape, :coords, :tabindex, :onfocus, :onblur]
5
+
6
+ def click
7
+ assert_exists
8
+ @container.update_page @object.click
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,59 @@
1
+ module Celerity
2
+ # This class is the class for radio buttons and check boxes.
3
+ # It contains methods common to both.
4
+ # Normally a user would not need to create this object as it is returned by the Watir::Container#checkbox or Watir::Container#radio methods
5
+ #
6
+ # most of the methods available to this element are inherited from the Element class
7
+ #
8
+ class RadioCheckCommon < InputElement
9
+ def locate
10
+ @object = @container.locate_input_element(self, @how, @what, @value)
11
+ end
12
+
13
+ def initialize(container, how, what, type, value = nil)
14
+ @type = type
15
+ @value = value
16
+ super(container, how, what)
17
+ end
18
+
19
+ def set?
20
+ assert_exists
21
+ @object.isChecked
22
+ end
23
+ alias_method :is_set?, :set?
24
+ alias_method :isSet?, :set?
25
+ alias_method :get_state, :set?
26
+ alias_method :getState, :set?
27
+ alias_method :checked?, :set?
28
+
29
+ def clear
30
+ set(false)
31
+ end
32
+ end
33
+
34
+ # This class is the celerity representation of a radio button.
35
+ class Radio < RadioCheckCommon
36
+ TAGS = [Identifier.new('input', :type => %w(radio))]
37
+
38
+ def set(value = true)
39
+ assert_exists
40
+ assert_enabled
41
+ @container.update_page(value ? @object.click : @object.setChecked(value))
42
+ end
43
+
44
+ end
45
+
46
+ # This class is the celerity representation of a check box.
47
+ class CheckBox < RadioCheckCommon
48
+ TAGS = [Identifier.new('input', :type => %w(checkbox))]
49
+
50
+ def set(value = true)
51
+ assert_exists
52
+ assert_enabled
53
+ if (value && !set?) || (!value && set?)
54
+ @container.update_page(@object.click)
55
+ end
56
+ end
57
+ end
58
+
59
+ end