fletcherm-culerity 0.2.5
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.
- data/.gitignore +6 -0
- data/CHANGES.md +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +102 -0
- data/Rakefile +47 -0
- data/VERSION.yml +5 -0
- data/culerity.gemspec +165 -0
- data/features/fixtures/jquery +4376 -0
- data/features/fixtures/sample_feature +14 -0
- data/features/installing_culerity.feature +36 -0
- data/features/running_cucumber_without_explicitly_running_external_services.feature +23 -0
- data/features/step_definitions/common_steps.rb +175 -0
- data/features/step_definitions/culerity_setup_steps.rb +7 -0
- data/features/step_definitions/jruby_steps.rb +11 -0
- data/features/step_definitions/rails_setup_steps.rb +36 -0
- data/features/support/common.rb +32 -0
- data/features/support/env.rb +24 -0
- data/features/support/matchers.rb +11 -0
- data/init.rb +1 -0
- data/lib/culerity.rb +44 -0
- data/lib/culerity/celerity_server.rb +81 -0
- data/lib/culerity/jruby_runner.rb +13 -0
- data/lib/culerity/remote_browser_proxy.rb +58 -0
- data/lib/culerity/remote_object_proxy.rb +76 -0
- data/rails/init.rb +1 -0
- data/rails_generators/culerity/culerity_generator.rb +28 -0
- data/rails_generators/culerity/templates/config/environments/culerity_continuousintegration.rb +28 -0
- data/rails_generators/culerity/templates/config/environments/culerity_development.rb +17 -0
- data/rails_generators/culerity/templates/features/step_definitions/culerity_steps.rb +109 -0
- data/rails_generators/culerity/templates/features/support/env.rb +9 -0
- data/rails_generators/culerity/templates/lib/tasks/culerity.rake +38 -0
- data/rails_generators/culerity/templates/public/javascripts/culerity.js +27 -0
- data/script/console +10 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/spec/celerity_server_spec.rb +106 -0
- data/spec/culerity_spec.rb +33 -0
- data/spec/jruby_runner_spec.rb +12 -0
- data/spec/remote_browser_proxy_spec.rb +62 -0
- data/spec/remote_object_proxy_spec.rb +63 -0
- data/spec/spec_helper.rb +3 -0
- data/vendor/gems/celerity-0.7.6/HISTORY +111 -0
- data/vendor/gems/celerity-0.7.6/LICENSE +621 -0
- data/vendor/gems/celerity-0.7.6/README.rdoc +80 -0
- data/vendor/gems/celerity-0.7.6/Rakefile +11 -0
- data/vendor/gems/celerity-0.7.6/VERSION.yml +5 -0
- data/vendor/gems/celerity-0.7.6/celerity.gemspec +120 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity.rb +77 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/browser.rb +893 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/clickable_element.rb +73 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/collections.rb +156 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/container.rb +767 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/default_viewer.rb +14 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/disabled_element.rb +40 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/element.rb +298 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/element_collection.rb +107 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/element_locator.rb +159 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/button.rb +54 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/file_field.rb +29 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/form.rb +33 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/frame.rb +86 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/image.rb +89 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/label.rb +16 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/link.rb +43 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/meta.rb +14 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/non_control_elements.rb +116 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/option.rb +38 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/radio_check.rb +114 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/select_list.rb +147 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table.rb +153 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table_cell.rb +36 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table_elements.rb +42 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/table_row.rb +49 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/elements/text_field.rb +168 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/exception.rb +83 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit.rb +64 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-codec-1.4.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-collections-3.2.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-httpclient-3.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-io-1.4.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-lang-2.4.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/commons-logging-1.1.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/cssparser-0.9.5.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/htmlunit-2.7-SNAPSHOT.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/htmlunit-core-js-2.7-SNAPSHOT.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/nekohtml-1.9.14-20091130.152932-3.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/sac-1.3.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/serializer-2.7.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/xalan-2.7.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/xercesImpl-2.9.1.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/htmlunit/xml-apis-1.3.04.jar +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/identifier.rb +28 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/ignoring_web_connection.rb +15 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/input_element.rb +25 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/javascript_debugger.rb +32 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/listener.rb +143 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/resources/no_viewer.png +0 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/short_inspect.rb +20 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/util.rb +126 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/version.rb +3 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/viewer_connection.rb +89 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/watir_compatibility.rb +70 -0
- data/vendor/gems/celerity-0.7.6/lib/celerity/xpath_support.rb +48 -0
- data/vendor/gems/celerity-0.7.6/tasks/benchmark.rake +4 -0
- data/vendor/gems/celerity-0.7.6/tasks/check.rake +24 -0
- data/vendor/gems/celerity-0.7.6/tasks/clean.rake +3 -0
- data/vendor/gems/celerity-0.7.6/tasks/fix.rake +25 -0
- data/vendor/gems/celerity-0.7.6/tasks/jar.rake +55 -0
- data/vendor/gems/celerity-0.7.6/tasks/jeweler.rake +26 -0
- data/vendor/gems/celerity-0.7.6/tasks/rdoc.rake +4 -0
- data/vendor/gems/celerity-0.7.6/tasks/snapshot.rake +22 -0
- data/vendor/gems/celerity-0.7.6/tasks/spec.rake +26 -0
- data/vendor/gems/celerity-0.7.6/tasks/website.rake +10 -0
- data/vendor/gems/celerity-0.7.6/tasks/yard.rake +16 -0
- data/vendor/jruby/jruby-complete-1.4.0.jar +0 -0
- metadata +194 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
module Celerity
|
|
2
|
+
module Util
|
|
3
|
+
module_function
|
|
4
|
+
|
|
5
|
+
HtmlUnit2CelerityElement = {
|
|
6
|
+
HtmlUnit::Html::HtmlAnchor => Celerity::Link,
|
|
7
|
+
HtmlUnit::Html::HtmlArea => Celerity::Area,
|
|
8
|
+
HtmlUnit::Html::HtmlButton => Celerity::Button,
|
|
9
|
+
HtmlUnit::Html::HtmlSubmitInput => Celerity::Button,
|
|
10
|
+
HtmlUnit::Html::HtmlResetInput => Celerity::Button,
|
|
11
|
+
HtmlUnit::Html::HtmlImageInput => Celerity::Button,
|
|
12
|
+
HtmlUnit::Html::HtmlButtonInput => Celerity::Button,
|
|
13
|
+
HtmlUnit::Html::HtmlCaption => Celerity::Button, # ?
|
|
14
|
+
HtmlUnit::Html::HtmlCheckBoxInput => Celerity::CheckBox,
|
|
15
|
+
HtmlUnit::Html::HtmlDefinitionDescription => Celerity::Dd,
|
|
16
|
+
HtmlUnit::Html::HtmlDefinitionList => Celerity::Dl,
|
|
17
|
+
HtmlUnit::Html::HtmlDefinitionTerm => Celerity::Dt,
|
|
18
|
+
HtmlUnit::Html::HtmlDivision => Celerity::Div,
|
|
19
|
+
HtmlUnit::Html::HtmlFileInput => Celerity::FileField,
|
|
20
|
+
HtmlUnit::Html::HtmlForm => Celerity::Form,
|
|
21
|
+
HtmlUnit::Html::HtmlFrame => Celerity::Frame,
|
|
22
|
+
HtmlUnit::Html::HtmlHeading1 => Celerity::H1,
|
|
23
|
+
HtmlUnit::Html::HtmlHeading2 => Celerity::H2,
|
|
24
|
+
HtmlUnit::Html::HtmlHeading3 => Celerity::H3,
|
|
25
|
+
HtmlUnit::Html::HtmlHeading4 => Celerity::H4,
|
|
26
|
+
HtmlUnit::Html::HtmlHeading5 => Celerity::H5,
|
|
27
|
+
HtmlUnit::Html::HtmlHeading6 => Celerity::H6,
|
|
28
|
+
HtmlUnit::Html::HtmlHiddenInput => Celerity::Hidden,
|
|
29
|
+
HtmlUnit::Html::HtmlImage => Celerity::Image,
|
|
30
|
+
HtmlUnit::Html::HtmlLabel => Celerity::Label,
|
|
31
|
+
HtmlUnit::Html::HtmlListItem => Celerity::Li,
|
|
32
|
+
HtmlUnit::Html::HtmlMap => Celerity::Map,
|
|
33
|
+
HtmlUnit::Html::HtmlOption => Celerity::Option,
|
|
34
|
+
HtmlUnit::Html::HtmlOrderedList => Celerity::Ol,
|
|
35
|
+
HtmlUnit::Html::HtmlParagraph => Celerity::P,
|
|
36
|
+
HtmlUnit::Html::HtmlPasswordInput => Celerity::TextField,
|
|
37
|
+
HtmlUnit::Html::HtmlPreformattedText => Celerity::Pre,
|
|
38
|
+
HtmlUnit::Html::HtmlRadioButtonInput => Celerity::Radio,
|
|
39
|
+
HtmlUnit::Html::HtmlSelect => Celerity::SelectList,
|
|
40
|
+
HtmlUnit::Html::HtmlSpan => Celerity::Span,
|
|
41
|
+
HtmlUnit::Html::HtmlTable => Celerity::Table,
|
|
42
|
+
HtmlUnit::Html::HtmlTableBody => Celerity::TableBody,
|
|
43
|
+
HtmlUnit::Html::HtmlTableCell => Celerity::TableCell,
|
|
44
|
+
HtmlUnit::Html::HtmlTableFooter => Celerity::TableFooter,
|
|
45
|
+
HtmlUnit::Html::HtmlTableHeader => Celerity::TableHeader,
|
|
46
|
+
HtmlUnit::Html::HtmlTableRow => Celerity::TableRow,
|
|
47
|
+
HtmlUnit::Html::HtmlTextArea => Celerity::TextField,
|
|
48
|
+
HtmlUnit::Html::HtmlTextInput => Celerity::TextField,
|
|
49
|
+
HtmlUnit::Html::HtmlUnorderedList => Celerity::Ul
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
def htmlunit2celerity(klass)
|
|
53
|
+
HtmlUnit2CelerityElement[klass]
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
#
|
|
57
|
+
# HtmlUnit will recognize most common file types, but custom ones can be added here.
|
|
58
|
+
# Used for FileField uploads.
|
|
59
|
+
#
|
|
60
|
+
|
|
61
|
+
ContentTypes = {
|
|
62
|
+
".bmp" => "image/x-ms-bmp",
|
|
63
|
+
".doc" => "application/msword",
|
|
64
|
+
".odg" => "application/vnd.oasis.opendocument.graphics",
|
|
65
|
+
".odp" => "application/vnd.oasis.opendocument.presentation",
|
|
66
|
+
".ods" => "application/vnd.oasis.opendocument.spreadsheet",
|
|
67
|
+
".odt" => "application/vnd.oasis.opendocument.text",
|
|
68
|
+
".ppt" => "application/vnd.ms-powerpoint",
|
|
69
|
+
".xls" => "application/vnd.ms-excel",
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
def content_type_for(path)
|
|
73
|
+
if ct = java.net.URLConnection.getFileNameMap.getContentTypeFor(path)
|
|
74
|
+
return ct
|
|
75
|
+
else
|
|
76
|
+
ContentTypes[File.extname(path).downcase]
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def normalize_text(string)
|
|
81
|
+
string.gsub("\302\240", ' '). # non-breaking space 00A0
|
|
82
|
+
gsub(/\n|\t/, ''). # get rid of newlines/tabs
|
|
83
|
+
strip
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def logger_for(package_string)
|
|
87
|
+
java.util.logging.Logger.getLogger(package_string)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# number of spaces that separate the property from the value in the create_string method
|
|
91
|
+
TO_S_SIZE = 14
|
|
92
|
+
|
|
93
|
+
def create_string(element)
|
|
94
|
+
ret = []
|
|
95
|
+
|
|
96
|
+
unless (tag = element.getTagName).empty?
|
|
97
|
+
ret << "tag:".ljust(TO_S_SIZE) + tag
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
element.getAttributes.each do |attribute|
|
|
101
|
+
ret << " #{attribute.getName}:".ljust(TO_S_SIZE + 2) + attribute.getValue.to_s
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
unless (text = element.asText).empty?
|
|
105
|
+
ret << " text:".ljust(TO_S_SIZE + 2) + element.asText
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
ret.join("\n")
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
#
|
|
112
|
+
# Used internally.
|
|
113
|
+
#
|
|
114
|
+
# @param [String] string The string to match against.
|
|
115
|
+
# @param [Regexp, String, #to_s] what The match we're looking for.
|
|
116
|
+
# @return [Fixnum, true, false, nil]
|
|
117
|
+
#
|
|
118
|
+
# @api private
|
|
119
|
+
#
|
|
120
|
+
|
|
121
|
+
def matches?(string, what)
|
|
122
|
+
Regexp === what ? string.strip =~ what : string == what.to_s
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
module Celerity
|
|
2
|
+
class ViewerConnection
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# Create a new connection to the given host/port
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
def self.create(host, port)
|
|
9
|
+
# if the connection fails, we won't spend time loading json
|
|
10
|
+
socket = TCPSocket.new(host, port)
|
|
11
|
+
require "json"
|
|
12
|
+
new(socket)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def initialize(socket)
|
|
16
|
+
@socket = socket
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
#
|
|
20
|
+
# Tells the viewer to render the given HTML, with the given URL as base url.
|
|
21
|
+
#
|
|
22
|
+
|
|
23
|
+
def render_html(html, url)
|
|
24
|
+
send_data('method' => 'page_changed', 'html' => html, 'url' => url)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
#
|
|
28
|
+
# Tells the viewer to save a screenshot of the current page to the given path.
|
|
29
|
+
# May not be available on all viewers.
|
|
30
|
+
#
|
|
31
|
+
|
|
32
|
+
def save(path)
|
|
33
|
+
send_data('method' => 'save', 'path' => path)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# Tells the viewer to dump the render tree to the given path.
|
|
39
|
+
# Only available in the Qt viewer.
|
|
40
|
+
#
|
|
41
|
+
|
|
42
|
+
def save_render_tree(path)
|
|
43
|
+
send_data('method' => 'save_render_tree', 'path' => path)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
#
|
|
47
|
+
# Get the currently rendered page as a Base64-encoded PNG image.
|
|
48
|
+
# Only available in the Qt viewer.
|
|
49
|
+
#
|
|
50
|
+
|
|
51
|
+
def image_data
|
|
52
|
+
send_data('method' => 'image_data')
|
|
53
|
+
data = read_data
|
|
54
|
+
data['image'] || data['error']
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
#
|
|
58
|
+
# Close the connection.
|
|
59
|
+
#
|
|
60
|
+
|
|
61
|
+
def close
|
|
62
|
+
@socket.close rescue nil
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def send_data(msg)
|
|
68
|
+
json = msg.to_json
|
|
69
|
+
data = "Content-Length: #{json.size}\n\n#{json}"
|
|
70
|
+
@socket.write data
|
|
71
|
+
@socket.flush
|
|
72
|
+
|
|
73
|
+
nil
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def read_data
|
|
77
|
+
buf = ''
|
|
78
|
+
until buf =~ /\n\n\z/ || @socket.eof? || @socket.closed?
|
|
79
|
+
buf << @socket.read(1).to_s
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
return if buf.empty?
|
|
83
|
+
|
|
84
|
+
length = buf[/Content-Length: (\d+)/, 1].to_i
|
|
85
|
+
JSON.parse @socket.read(length)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
module Celerity
|
|
2
|
+
class Browser
|
|
3
|
+
class << self
|
|
4
|
+
|
|
5
|
+
# Added for Watir compatibility - not in use by Celerity
|
|
6
|
+
attr_accessor :speed, :attach_timeout, :visible
|
|
7
|
+
# Added for Watir compatibility - not in use by Celerity
|
|
8
|
+
alias_method :start_window, :start
|
|
9
|
+
# Added for Watir compatibility - not in use by Celerity
|
|
10
|
+
def each; end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Added for Watir compatibility - not in use by Celerity
|
|
14
|
+
attr_accessor :visible
|
|
15
|
+
|
|
16
|
+
# Added for Watir compatibility - not in use by Celerity
|
|
17
|
+
def bring_to_front; true; end
|
|
18
|
+
# Added for Watir compatibility - not in use by Celerity
|
|
19
|
+
def speed=(s); s end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
module ClickableElement
|
|
24
|
+
alias_method :click_no_wait, :click
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
module Container
|
|
28
|
+
alias_method :checkbox, :check_box
|
|
29
|
+
alias_method :checkBox, :check_box
|
|
30
|
+
alias_method :body, :tbody
|
|
31
|
+
alias_method :bodies, :tbodies
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
class Element
|
|
35
|
+
alias_method :exists, :exists?
|
|
36
|
+
alias_method :innerText, :text
|
|
37
|
+
alias_method :inner_text, :text
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class Image
|
|
41
|
+
alias_method :hasLoaded?, :loaded?
|
|
42
|
+
alias_method :fileSize, :file_size
|
|
43
|
+
alias_method :fileCreatedDate, :file_created_date
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
class Link
|
|
47
|
+
alias_method :click_no_wait, :click
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
class RadioCheckCommon
|
|
51
|
+
alias_method :isSet?, :set?
|
|
52
|
+
alias_method :getState, :set?
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class SelectList
|
|
56
|
+
alias_method :getSelectedItems, :selected_options
|
|
57
|
+
alias_method :getAllContents, :options
|
|
58
|
+
alias_method :clearSelection, :clear
|
|
59
|
+
alias_method :includes?, :include?
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
class TextField
|
|
63
|
+
alias_method :dragContentsTo, :drag_contents_to
|
|
64
|
+
alias_method :getContents, :value
|
|
65
|
+
|
|
66
|
+
def requires_typing; end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
Celerity::IE = Celerity::Browser
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
module Celerity
|
|
2
|
+
|
|
3
|
+
#
|
|
4
|
+
# Module to search by xpath
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
module XpathSupport
|
|
8
|
+
|
|
9
|
+
#
|
|
10
|
+
# Get the first element found matching the given XPath.
|
|
11
|
+
#
|
|
12
|
+
# @param [String] xpath
|
|
13
|
+
# @return [Celerity::Element] An element subclass (or Element if none is found)
|
|
14
|
+
#
|
|
15
|
+
|
|
16
|
+
def element_by_xpath(xpath)
|
|
17
|
+
assert_exists
|
|
18
|
+
obj = @page.getFirstByXPath(xpath)
|
|
19
|
+
element_from_dom_node(obj)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# Get all the elements matching the given XPath.
|
|
24
|
+
#
|
|
25
|
+
# @param [String] xpath
|
|
26
|
+
# @return [Array<Celerity::Element>] array of elements
|
|
27
|
+
#
|
|
28
|
+
|
|
29
|
+
def elements_by_xpath(xpath)
|
|
30
|
+
assert_exists
|
|
31
|
+
objects = @page.getByXPath(xpath)
|
|
32
|
+
# should use an ElementCollection here?
|
|
33
|
+
objects.map { |o| element_from_dom_node(o) }.compact
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
#
|
|
37
|
+
# Convert the given HtmlUnit DomNode to a Celerity object
|
|
38
|
+
#
|
|
39
|
+
|
|
40
|
+
def element_from_dom_node(obj)
|
|
41
|
+
element_class = Util.htmlunit2celerity(obj.class) || Element
|
|
42
|
+
element_class.new(self, :object, obj)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
namespace :check do
|
|
2
|
+
|
|
3
|
+
desc 'Check syntax of all .rb files'
|
|
4
|
+
task :syntax do
|
|
5
|
+
failed = []
|
|
6
|
+
|
|
7
|
+
Dir['**/*.rb'].each do |f|
|
|
8
|
+
begin
|
|
9
|
+
eval("lambda do\n return true\n #{File.read f} \nend").call
|
|
10
|
+
print "."
|
|
11
|
+
rescue SyntaxError => e
|
|
12
|
+
print "!"
|
|
13
|
+
failed << [f, e.message]
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
if failed.empty?
|
|
18
|
+
puts "ok."
|
|
19
|
+
else
|
|
20
|
+
puts "\n\t#{failed.join("\n\t")}"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
namespace :fix do
|
|
2
|
+
|
|
3
|
+
desc 'Make all ruby files use LF line endings'
|
|
4
|
+
task :crlf do
|
|
5
|
+
files = FileList['**/*.rb']
|
|
6
|
+
files.each do |f|
|
|
7
|
+
next if File.directory?(f)
|
|
8
|
+
s = IO.read(f)
|
|
9
|
+
s.gsub!(/\r?\n/, "\n")
|
|
10
|
+
File.open(f, "w") { |io| io.write(s) }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
desc 'Remove trailing whitespace from all ruby files'
|
|
15
|
+
task :trailing_whitespace do
|
|
16
|
+
files = FileList['**/*.rb']
|
|
17
|
+
files.each do |f|
|
|
18
|
+
next if File.directory?(f)
|
|
19
|
+
s = IO.read(f)
|
|
20
|
+
s.gsub!(/\s*?($)/, '\1')
|
|
21
|
+
File.open(f, "w") { |io| io.write(s) }
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
namespace :jar do
|
|
2
|
+
target_dir = "classes"
|
|
3
|
+
|
|
4
|
+
desc "Compile and create celerity-complete-#{Celerity::VERSION}.jar (includes HtmlUnit)"
|
|
5
|
+
task :fat do
|
|
6
|
+
file_name = "pkg/celerity-complete-#{Celerity::VERSION}.jar"
|
|
7
|
+
|
|
8
|
+
ruby_files = Dir['lib/**/*.rb']
|
|
9
|
+
jar_files = Dir['lib/**/*.jar']
|
|
10
|
+
resources = Dir['lib/celerity/resources/*']
|
|
11
|
+
|
|
12
|
+
rm_rf target_dir if File.exist? target_dir
|
|
13
|
+
mkdir target_dir
|
|
14
|
+
mkdir_p resource_dir = "#{target_dir}/celerity/resources"
|
|
15
|
+
|
|
16
|
+
sh "jrubyc", "-d", "lib", "-t", target_dir, *ruby_files
|
|
17
|
+
resources.each { |extra| cp extra, resource_dir }
|
|
18
|
+
|
|
19
|
+
jar_files.each do |f|
|
|
20
|
+
cp f, target_dir
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
top_dir = Dir.pwd
|
|
24
|
+
chdir target_dir, :verbose => true
|
|
25
|
+
Dir['*.jar'].each do |file|
|
|
26
|
+
sh "jar", "xf", file
|
|
27
|
+
rm_f file
|
|
28
|
+
end
|
|
29
|
+
chdir top_dir, :verbose => true
|
|
30
|
+
|
|
31
|
+
mkdir_p "pkg"
|
|
32
|
+
sh "jar", "cvf", file_name, '-C', target_dir, '.'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
desc "Compile and create celerity-#{Celerity::VERSION}.jar"
|
|
36
|
+
task :tiny do
|
|
37
|
+
file_name = "pkg/celerity-#{Celerity::VERSION}.jar"
|
|
38
|
+
|
|
39
|
+
ruby_files = Dir['lib/**/*.rb']
|
|
40
|
+
resources = Dir['lib/celerity/resources/*']
|
|
41
|
+
|
|
42
|
+
rm_rf target_dir if File.exist? target_dir
|
|
43
|
+
mkdir target_dir
|
|
44
|
+
mkdir_p resource_dir = "#{target_dir}/celerity/resources"
|
|
45
|
+
|
|
46
|
+
sh "jrubyc", "-d", "lib", "-t", target_dir, *ruby_files
|
|
47
|
+
resources.each { |extra| cp extra, resource_dir }
|
|
48
|
+
|
|
49
|
+
mkdir_p "pkg"
|
|
50
|
+
sh "jar", "cvf", file_name, '-C', target_dir, '.'
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
desc 'Alias for jar:tiny'
|
|
55
|
+
task :jar => %w[jar:tiny]
|