celerity 0.0.1 → 0.0.2
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/History.txt +10 -0
- data/README.txt +8 -11
- data/Rakefile +5 -3
- data/benchmark/bm_2000_spans.rb +48 -0
- data/benchmark/bm_digg.rb +26 -0
- data/benchmark/bm_google_images.rb +36 -0
- data/benchmark/bm_input_locator.rb +69 -0
- data/benchmark/loader.rb +9 -0
- data/lib/celerity.rb +3 -1
- data/lib/celerity/container.rb +23 -171
- data/lib/celerity/disabled_element.rb +1 -1
- data/lib/celerity/element.rb +78 -47
- data/lib/celerity/element_collections.rb +16 -32
- data/lib/celerity/element_locator.rb +135 -0
- data/lib/celerity/elements/button.rb +15 -0
- data/lib/celerity/elements/file_field.rb +1 -1
- data/lib/celerity/elements/form.rb +2 -1
- data/lib/celerity/elements/frame.rb +18 -21
- data/lib/celerity/elements/image.rb +2 -8
- data/lib/celerity/elements/label.rb +1 -3
- data/lib/celerity/elements/link.rb +1 -1
- data/lib/celerity/elements/option.rb +16 -0
- data/lib/celerity/elements/radio_check.rb +18 -7
- data/lib/celerity/elements/select_list.rb +1 -17
- data/lib/celerity/elements/table.rb +4 -4
- data/lib/celerity/elements/table_body.rb +6 -8
- data/lib/celerity/elements/table_cell.rb +3 -14
- data/lib/celerity/elements/table_row.rb +4 -10
- data/lib/celerity/elements/text_field.rb +16 -4
- data/lib/celerity/extra/method_generator.rb +144 -0
- data/lib/celerity/identifier.rb +10 -0
- data/lib/celerity/ie.rb +28 -13
- data/lib/celerity/input_element.rb +0 -4
- data/lib/celerity/non_control_elements.rb +12 -12
- data/lib/celerity/version.rb +1 -1
- data/spec/area_spec.rb +41 -41
- data/spec/areas_spec.rb +11 -11
- data/spec/button_spec.rb +73 -68
- data/spec/buttons_spec.rb +10 -10
- data/spec/checkbox_spec.rb +102 -96
- data/spec/checkboxes_spec.rb +10 -10
- data/spec/div_spec.rb +78 -73
- data/spec/divs_spec.rb +10 -10
- data/spec/element_spec.rb +20 -11
- data/spec/filefield_spec.rb +36 -41
- data/spec/filefields_spec.rb +10 -10
- data/spec/form_spec.rb +29 -29
- data/spec/forms_spec.rb +11 -11
- data/spec/frame_spec.rb +54 -49
- data/spec/hidden_spec.rb +43 -43
- data/spec/hiddens_spec.rb +10 -10
- data/spec/html/2000_spans.html +2009 -0
- data/spec/html/forms_with_input_elements.html +15 -9
- data/spec/html/non_control_elements.html +4 -2
- data/spec/ie_spec.rb +82 -48
- data/spec/image_spec.rb +83 -100
- data/spec/images_spec.rb +10 -10
- data/spec/label_spec.rb +29 -29
- data/spec/labels_spec.rb +10 -10
- data/spec/li_spec.rb +41 -41
- data/spec/link_spec.rb +65 -59
- data/spec/links_spec.rb +11 -11
- data/spec/lis_spec.rb +10 -10
- data/spec/map_spec.rb +30 -30
- data/spec/maps_spec.rb +10 -10
- data/spec/p_spec.rb +49 -49
- data/spec/pre_spec.rb +41 -41
- data/spec/pres_spec.rb +10 -10
- data/spec/ps_spec.rb +10 -10
- data/spec/radio_spec.rb +104 -97
- data/spec/radios_spec.rb +11 -11
- data/spec/select_list_spec.rb +118 -106
- data/spec/select_lists_spec.rb +15 -15
- data/spec/span_spec.rb +54 -54
- data/spec/spans_spec.rb +11 -11
- data/spec/spec.opts +1 -1
- data/spec/spec_helper.rb +23 -3
- data/spec/table_bodies.rb +8 -8
- data/spec/table_bodies_spec.rb +9 -9
- data/spec/table_body_spec.rb +28 -27
- data/spec/table_cell_spec.rb +25 -25
- data/spec/table_cells_spec.rb +16 -16
- data/spec/table_row_spec.rb +16 -16
- data/spec/table_rows_spec.rb +12 -12
- data/spec/table_spec.rb +36 -36
- data/spec/tables_spec.rb +12 -12
- data/spec/text_field_spec.rb +111 -92
- data/spec/text_fields_spec.rb +13 -13
- data/tasks/benchmark.rake +3 -0
- data/tasks/rspec.rake +2 -2
- data/tasks/testserver.rake +15 -0
- metadata +58 -46
- data/tasks/simple_ci.rake +0 -94
data/History.txt
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
== 0.0.2 2008-05-15
|
2
|
+
* 3 major enhancements:
|
3
|
+
* Support for multiple how => what conditions
|
4
|
+
* Fixed performance issue with collections
|
5
|
+
* Specs will now run on Windows
|
6
|
+
* 3 minor enhancements:
|
7
|
+
* Benchmark scripts
|
8
|
+
* Method generator
|
9
|
+
* Fixed multi-byte characters issue for text fields
|
10
|
+
|
1
11
|
== 0.0.1 2008-05-07
|
2
12
|
|
3
13
|
* 1 major enhancement:
|
data/README.txt
CHANGED
@@ -7,9 +7,14 @@
|
|
7
7
|
Celerity is a JRuby/RJB wrapper around the HtmlUnit Java library (http://htmlunit.sourceforge.net/).
|
8
8
|
The goal of the project is to implement the Watir API (http://wtf.rubyforge.org/) on top of HtmlUnit.
|
9
9
|
|
10
|
-
== FEATURES/PROBLEMS:
|
11
10
|
|
12
|
-
|
11
|
+
== FEATURES:
|
12
|
+
|
13
|
+
* Fast: No time-consuming GUI rendering or unessential downloads
|
14
|
+
* Scalable: Java threads lets you run tests in parallel
|
15
|
+
* Easy to use: Simple API
|
16
|
+
* Portable: Cross-platform
|
17
|
+
* Unintrusive: No browser window interrupting your workflow (runs in background)
|
13
18
|
|
14
19
|
== SYNOPSIS:
|
15
20
|
|
@@ -25,20 +30,12 @@
|
|
25
30
|
|
26
31
|
* JRuby 1.1
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
* Ruby Java Bridge (on MRI)
|
31
|
-
|
32
|
-
NOTE: RJB currently has problems with threading. Use JRuby if you want to run your tests concurrently.
|
33
|
+
* Java 6
|
33
34
|
|
34
35
|
== INSTALL:
|
35
36
|
|
36
37
|
* jruby -S gem install celerity
|
37
38
|
|
38
|
-
or
|
39
|
-
|
40
|
-
* (sudo) gem install rjb celerity
|
41
|
-
|
42
39
|
== LICENSE:
|
43
40
|
|
44
41
|
Celerity - JRuby wrapper for HtmlUnit
|
data/Rakefile
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
2
|
-
require 'config/
|
3
|
-
|
1
|
+
begin
|
2
|
+
require 'config/requirements'
|
3
|
+
require 'config/hoe' # setup Hoe + all gem configuration
|
4
|
+
rescue LoadError
|
5
|
+
end
|
4
6
|
Dir['tasks/**/*.rake'].each { |rake| load rake }
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/loader"
|
2
|
+
|
3
|
+
# Create browser object
|
4
|
+
browser = FRAMEWORK::IE.new
|
5
|
+
browser.goto(TEST_HOST + "/2000_spans.html")
|
6
|
+
|
7
|
+
TESTS = 100
|
8
|
+
res = Benchmark.bmbm do |results|
|
9
|
+
results.report("Loop through all spans (n = 1)") do
|
10
|
+
1.times do # Hard coded 1 run
|
11
|
+
browser.spans.each do |span|
|
12
|
+
span.text
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
# results.report("Loop through all spans (raw)") do
|
18
|
+
# TESTS.times do
|
19
|
+
# if RUBY_PLATFORM =~ /java/
|
20
|
+
# browser.document.getHtmlElementsByTagName("span").each do |span|
|
21
|
+
# span.asText
|
22
|
+
# end
|
23
|
+
# else
|
24
|
+
# browser.document.getElementsByTagName("span").each do |span|
|
25
|
+
# span.innerText
|
26
|
+
# end
|
27
|
+
# end
|
28
|
+
# end
|
29
|
+
# end
|
30
|
+
|
31
|
+
results.report("Last span by id (String)") do
|
32
|
+
TESTS.times do
|
33
|
+
browser.span(:id, "id_2000").exists?
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
results.report("Last span by id (Regexp)") do
|
38
|
+
TESTS.times do
|
39
|
+
browser.span(:id, "/2000/").exists?
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
puts
|
46
|
+
total = res.inject(0.0) { |mem, bm| mem + bm.real }
|
47
|
+
puts "total : " + total.to_s
|
48
|
+
puts "average: " + (total/res.size.to_f).to_s
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/loader"
|
2
|
+
|
3
|
+
TESTS = 5
|
4
|
+
res = Benchmark.bmbm do |results|
|
5
|
+
results.report("Diggs on front page") do
|
6
|
+
TESTS.times do
|
7
|
+
# Create browser object
|
8
|
+
browser = FRAMEWORK::IE.new
|
9
|
+
|
10
|
+
# Go to digg.com
|
11
|
+
browser.goto('http://digg.com/')
|
12
|
+
|
13
|
+
# Gather statistics
|
14
|
+
total_diggs = 0
|
15
|
+
digg_number_elements = browser.links.select { |link| link.id =~ /diggs/ }
|
16
|
+
digg_numbers = digg_number_elements.collect { |digg_number_element| digg_number_element.text }
|
17
|
+
digg_numbers.each { |digg_number| total_diggs += digg_number.to_i }
|
18
|
+
#puts "Found #{digg_numbers.size} stories, with a total of #{total_diggs} diggs."
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
puts
|
24
|
+
total = res.inject(0.0) { |mem, bm| mem + bm.real }
|
25
|
+
puts "total : " + total.to_s
|
26
|
+
puts "average: " + (total/res.size.to_f).to_s
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/loader"
|
2
|
+
|
3
|
+
TESTS = 5
|
4
|
+
res = Benchmark.bmbm do |results|
|
5
|
+
results.report("Google image search results") do
|
6
|
+
TESTS.times do
|
7
|
+
# Create browser object
|
8
|
+
browser = FRAMEWORK::IE.new
|
9
|
+
|
10
|
+
# Goto images.google.com
|
11
|
+
browser.goto('http://images.google.com/ncr')
|
12
|
+
|
13
|
+
# Search for Watir
|
14
|
+
browser.text_field(:name, 'q').set('Watir')
|
15
|
+
browser.button(:value, 'Search Images').click
|
16
|
+
|
17
|
+
src_pool = []
|
18
|
+
pages = 1
|
19
|
+
# Gather statistics and click Next if there are more results
|
20
|
+
while browser.link(:text, 'Next').exists?
|
21
|
+
pages += 1
|
22
|
+
browser.link(:text, 'Next').click unless src_pool.empty?
|
23
|
+
table_cells = browser.cells.select { |cell| cell.id =~ /tDataImage\d+/ }
|
24
|
+
table_cells.each do |cell|
|
25
|
+
src_pool << cell.image(:index, 1).src if cell.image(:index, 1).exists?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
#puts "Looked at #{pages} pages of image search results. Got #{src_pool.size} images."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
puts
|
34
|
+
total = res.inject(0.0) { |mem, bm| mem + bm.real }
|
35
|
+
puts "total : " + total.to_s
|
36
|
+
puts "average: " + (total/res.size.to_f).to_s
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/loader"
|
2
|
+
|
3
|
+
browser = FRAMEWORK::IE.new
|
4
|
+
browser.goto(TEST_HOST + "/forms_with_input_elements.html")
|
5
|
+
|
6
|
+
TESTS = 1000
|
7
|
+
res = Benchmark.bmbm do |results|
|
8
|
+
results.report("text input by id (String)") do
|
9
|
+
TESTS.times { browser.text_field(:id, "new_user_first_name").exists? }
|
10
|
+
end
|
11
|
+
results.report("text input by id (Regexp)") do
|
12
|
+
TESTS.times { browser.text_field(:id, /first_name/).exists? }
|
13
|
+
end
|
14
|
+
results.report("text input by name (String)") do
|
15
|
+
TESTS.times { browser.text_field(:name, "new_user_email").exists? }
|
16
|
+
end
|
17
|
+
results.report("text input by name (Regexp)") do
|
18
|
+
TESTS.times { browser.text_field(:name, /user_email/).exists? }
|
19
|
+
end
|
20
|
+
|
21
|
+
results.report("select list by id (String)") do
|
22
|
+
TESTS.times { browser.select_list(:id, 'new_user_country').exists? }
|
23
|
+
end
|
24
|
+
results.report("select list by id (Regexp)") do
|
25
|
+
TESTS.times { browser.select_list(:id, /user_country/).exists? }
|
26
|
+
end
|
27
|
+
results.report("select list by name (String)") do
|
28
|
+
TESTS.times { browser.select_list(:name, 'new_user_country').exists? }
|
29
|
+
end
|
30
|
+
results.report("select list by name (Regexp)") do
|
31
|
+
TESTS.times { browser.select_list(:name, /user_country/).exists? }
|
32
|
+
end
|
33
|
+
|
34
|
+
results.report("checkbox by id (String)") do
|
35
|
+
TESTS.times { browser.checkbox(:id, 'new_user_interests_books').exists? }
|
36
|
+
end
|
37
|
+
results.report("checkbox by id (Regexp)") do
|
38
|
+
TESTS.times { browser.checkbox(:id, /interests_books/).exists? }
|
39
|
+
end
|
40
|
+
|
41
|
+
results.report("checkbox by name (String)") do
|
42
|
+
TESTS.times { browser.checkbox(:name, 'new_user_interests').exists? }
|
43
|
+
end
|
44
|
+
results.report("checkbox by name (Regexp)") do
|
45
|
+
TESTS.times { browser.checkbox(:name, /user_interests/).exists? }
|
46
|
+
end
|
47
|
+
|
48
|
+
results.report("checkbox by id (String) and value (String)") do
|
49
|
+
TESTS.times { browser.checkbox(:id, 'new_user_interests_books', 'cars').exists? }
|
50
|
+
end
|
51
|
+
results.report("checkbox by id (Regexp) and value (Regexp)") do
|
52
|
+
TESTS.times { browser.checkbox(:id, /interests_books/, /car/).exists? }
|
53
|
+
end
|
54
|
+
|
55
|
+
results.report("checkbox by name (String) and value (String)") do
|
56
|
+
TESTS.times { browser.checkbox(:name, 'new_user_interests', 'dancing').exists? }
|
57
|
+
end
|
58
|
+
results.report("checkbox by name (Regexp) and value (Regexp)") do
|
59
|
+
TESTS.times { browser.checkbox(:name, /user_interests/, /danc/).exists? }
|
60
|
+
end
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
puts
|
67
|
+
total = res.inject(0.0) { |mem, bm| mem + bm.real }
|
68
|
+
puts "total : " + total.to_s
|
69
|
+
puts "average: " + (total/res.size.to_f).to_s
|
data/benchmark/loader.rb
ADDED
data/lib/celerity.rb
CHANGED
@@ -27,6 +27,8 @@ require "celerity/clickable_element"
|
|
27
27
|
require "celerity/disabled_element"
|
28
28
|
require "celerity/element_collections"
|
29
29
|
require "celerity/collections"
|
30
|
+
require "celerity/element_locator"
|
31
|
+
require "celerity/identifier"
|
30
32
|
require "celerity/container"
|
31
33
|
require "celerity/element"
|
32
34
|
require "celerity/input_element"
|
@@ -34,7 +36,6 @@ require "celerity/non_control_elements"
|
|
34
36
|
Dir[File.dirname(__FILE__) + "/celerity/elements/*.rb"].each { |f| require(f) }
|
35
37
|
require "celerity/ie"
|
36
38
|
|
37
|
-
|
38
39
|
require "logger"
|
39
40
|
require "uri"
|
40
41
|
require "pp"
|
@@ -45,3 +46,4 @@ Log.level = Logger::DEBUG
|
|
45
46
|
# undefine deprecated methods to use them for Element attributes
|
46
47
|
Object.send :undef_method, :id
|
47
48
|
Object.send :undef_method, :type
|
49
|
+
|
data/lib/celerity/container.rb
CHANGED
@@ -1,29 +1,16 @@
|
|
1
1
|
module Celerity
|
2
2
|
module Container
|
3
3
|
include Celerity::Exception
|
4
|
-
|
5
4
|
attr_accessor :page_container
|
6
5
|
|
7
6
|
def set_container(container)
|
8
7
|
@container = container
|
9
8
|
@page_container = container.page_container
|
10
9
|
end
|
11
|
-
|
10
|
+
|
12
11
|
def update_page(page)
|
13
12
|
@page_container.set_page(page)
|
14
13
|
end
|
15
|
-
|
16
|
-
def contains_text(expected_text)
|
17
|
-
assert_exists
|
18
|
-
case expected_text
|
19
|
-
when Regexp
|
20
|
-
text().match(expected_text)
|
21
|
-
when String
|
22
|
-
text().index(expected_text)
|
23
|
-
else
|
24
|
-
raise ArgumentError, "Argument #{expected_text.inspect} should be a String or Regexp."
|
25
|
-
end
|
26
|
-
end
|
27
14
|
|
28
15
|
def frame(*args)
|
29
16
|
assert_exists
|
@@ -33,21 +20,21 @@ module Celerity
|
|
33
20
|
def table(*args)
|
34
21
|
assert_exists
|
35
22
|
Table.new(self, *args)
|
36
|
-
end
|
23
|
+
end
|
37
24
|
def tables
|
38
25
|
assert_exists
|
39
26
|
Tables.new(self)
|
40
27
|
end
|
41
|
-
|
28
|
+
|
42
29
|
def cell(*args)
|
43
|
-
assert_exists
|
30
|
+
assert_exists
|
44
31
|
TableCell.new(self, *args)
|
45
32
|
end
|
46
33
|
def cells
|
47
34
|
assert_exists
|
48
35
|
TableCells.new(self)
|
49
36
|
end
|
50
|
-
|
37
|
+
|
51
38
|
def row(*args)
|
52
39
|
assert_exists
|
53
40
|
TableRow.new(self, *args)
|
@@ -56,7 +43,7 @@ module Celerity
|
|
56
43
|
assert_exists
|
57
44
|
TableRows.new(self)
|
58
45
|
end
|
59
|
-
|
46
|
+
|
60
47
|
def button(*args)
|
61
48
|
assert_exists
|
62
49
|
Button.new(self, *args)
|
@@ -74,7 +61,7 @@ module Celerity
|
|
74
61
|
assert_exists
|
75
62
|
FileFields.new(self)
|
76
63
|
end
|
77
|
-
|
64
|
+
|
78
65
|
def text_field(*args)
|
79
66
|
assert_exists
|
80
67
|
TextField.new(self, *args)
|
@@ -83,7 +70,7 @@ module Celerity
|
|
83
70
|
assert_exists
|
84
71
|
TextFields.new(self)
|
85
72
|
end
|
86
|
-
|
73
|
+
|
87
74
|
def hidden(*args)
|
88
75
|
assert_exists
|
89
76
|
Hidden.new(self, *args)
|
@@ -92,7 +79,7 @@ module Celerity
|
|
92
79
|
assert_exists
|
93
80
|
Hiddens.new(self)
|
94
81
|
end
|
95
|
-
|
82
|
+
|
96
83
|
def select_list(*args)
|
97
84
|
assert_exists
|
98
85
|
SelectList.new(self, *args)
|
@@ -101,28 +88,28 @@ module Celerity
|
|
101
88
|
assert_exists
|
102
89
|
SelectLists.new(self)
|
103
90
|
end
|
104
|
-
|
105
|
-
def check_box(
|
91
|
+
|
92
|
+
def check_box(*args)
|
106
93
|
assert_exists
|
107
|
-
CheckBox.new(self,
|
94
|
+
CheckBox.new(self, *args)
|
108
95
|
end
|
109
96
|
alias_method :checkbox, :check_box
|
110
97
|
alias_method :checkBox, :check_box
|
111
|
-
|
98
|
+
|
112
99
|
def checkboxes
|
113
100
|
assert_exists
|
114
101
|
CheckBoxes.new(self)
|
115
102
|
end
|
116
|
-
|
117
|
-
def radio(
|
103
|
+
|
104
|
+
def radio(*args)
|
118
105
|
assert_exists
|
119
|
-
Radio.new(self,
|
106
|
+
Radio.new(self, *args)
|
120
107
|
end
|
121
108
|
def radios
|
122
109
|
assert_exists
|
123
110
|
Radios.new(self)
|
124
111
|
end
|
125
|
-
|
112
|
+
|
126
113
|
def link(*args)
|
127
114
|
assert_exists
|
128
115
|
Link.new(self, *args)
|
@@ -141,7 +128,7 @@ module Celerity
|
|
141
128
|
assert_exists
|
142
129
|
Lis.new(self)
|
143
130
|
end
|
144
|
-
|
131
|
+
|
145
132
|
def map(*args)
|
146
133
|
assert_exists
|
147
134
|
Map.new(self, *args)
|
@@ -150,7 +137,7 @@ module Celerity
|
|
150
137
|
assert_exists
|
151
138
|
Maps.new(self)
|
152
139
|
end
|
153
|
-
|
140
|
+
|
154
141
|
def area(*args)
|
155
142
|
assert_exists
|
156
143
|
Area.new(self, *args)
|
@@ -159,7 +146,7 @@ module Celerity
|
|
159
146
|
assert_exists
|
160
147
|
Areas.new(self)
|
161
148
|
end
|
162
|
-
|
149
|
+
|
163
150
|
def image(*args)
|
164
151
|
assert_exists
|
165
152
|
Image.new(self, *args)
|
@@ -168,9 +155,7 @@ module Celerity
|
|
168
155
|
assert_exists
|
169
156
|
Images.new(self)
|
170
157
|
end
|
171
|
-
|
172
|
-
#TODO: Popup method here?
|
173
|
-
|
158
|
+
|
174
159
|
def div(*args)
|
175
160
|
assert_exists
|
176
161
|
Div.new(self, *args)
|
@@ -216,7 +201,7 @@ module Celerity
|
|
216
201
|
assert_exists
|
217
202
|
Pres.new(self)
|
218
203
|
end
|
219
|
-
|
204
|
+
|
220
205
|
def label(*args)
|
221
206
|
assert_exists
|
222
207
|
Label.new(self, *args)
|
@@ -225,145 +210,12 @@ module Celerity
|
|
225
210
|
assert_exists
|
226
211
|
Labels.new(self)
|
227
212
|
end
|
228
|
-
|
229
|
-
#
|
230
|
-
# Locator Methods
|
231
|
-
#
|
232
|
-
|
233
|
-
# Returns the specified ole object for input elements on a web page.
|
234
|
-
#
|
235
|
-
# This method is used internally by Watir and should not be used externally. It cannot be marked as private because of the way mixins and inheritance work in watir
|
236
|
-
# * element_instance - an Element subclass instance
|
237
|
-
# * how - symbol - the way we look for the object. Supported values are
|
238
|
-
# - :name
|
239
|
-
# - :id
|
240
|
-
# - :index
|
241
|
-
# - :value etc
|
242
|
-
# * what - string that we are looking for, ex. the name, or id tag attribute or index of the object we are looking for.
|
243
|
-
# * value - used for objects that have one name, but many values. ex. radio lists and checkboxes
|
244
|
-
def locate_input_element(element_instance, how, what, value = nil)
|
245
|
-
idents = element_instance.class::TAGS
|
246
|
-
tags = idents.map { |e| e.tag }
|
247
|
-
begin
|
248
|
-
case how
|
249
|
-
when :id
|
250
|
-
case what
|
251
|
-
when Regexp
|
252
|
-
elements_by_tag_names(tags).find { |elem| elem.getIdAttribute =~ what }
|
253
|
-
when String
|
254
|
-
@object.getHtmlElementById(what)
|
255
|
-
else
|
256
|
-
raise ArgumentError, "Argument #{what.inspect} should be a String or Regexp"
|
257
|
-
end
|
258
|
-
when :name, :value
|
259
|
-
elements_by_idents(idents).find do |e|
|
260
|
-
matches?(e.getAttribute(how.to_s), what) && (value ? matches?(e.getValueAttribute, value) : true)
|
261
|
-
end
|
262
|
-
when :caption
|
263
|
-
elements_by_idents(idents).find { |e| matches?(e.getValueAttribute, what) }
|
264
|
-
when :class
|
265
|
-
elements_by_idents(idents).find { |e| matches?(e.getClassAttribute, what) }
|
266
|
-
when :text
|
267
|
-
elements_by_idents(idents).find { |e| matches?(e.asText, what) }
|
268
|
-
when :index
|
269
|
-
elements_by_idents(idents)[what.to_i - 1]
|
270
|
-
when :xpath
|
271
|
-
what = ".#{what}" if what[0] == ?/
|
272
|
-
@object.getByXPath(what).to_a.first
|
273
|
-
else
|
274
|
-
raise MissingWayOfFindingObjectException
|
275
|
-
end
|
276
|
-
rescue HtmlUnit::ElementNotFoundException
|
277
|
-
end
|
278
|
-
end
|
279
213
|
|
280
|
-
def locate_tagged_element(element_instance, how, what)
|
281
|
-
tags = element_instance.class::TAGS
|
282
|
-
begin
|
283
|
-
case how
|
284
|
-
when :id
|
285
|
-
case what
|
286
|
-
when Regexp
|
287
|
-
elements_by_tag_names(tags).find { |elem| elem.getIdAttribute =~ what }
|
288
|
-
when String
|
289
|
-
@object.getHtmlElementById(what)
|
290
|
-
else
|
291
|
-
raise ArgumentError, "Argument #{what.inspect} should be a String or Regexp"
|
292
|
-
end
|
293
|
-
when :name, :value, :title
|
294
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getAttributeValue(how.to_s), what) }
|
295
|
-
when :class
|
296
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getClassAttribute, what)}
|
297
|
-
when :text
|
298
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.asText, what) }
|
299
|
-
when :index
|
300
|
-
elements_by_tag_names(tags)[what.to_i-1]
|
301
|
-
when :xpath
|
302
|
-
what = ".#{what}" if what[0] == ?/
|
303
|
-
@object.getByXPath(what).to_a.first
|
304
|
-
when :url
|
305
|
-
case element_instance
|
306
|
-
when Celerity::Link, Celerity::Map, Celerity::Area
|
307
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getHrefAttribute, what) }
|
308
|
-
end
|
309
|
-
when :src
|
310
|
-
case element_instance
|
311
|
-
when Celerity::Image
|
312
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getSrcAttribute, what) }
|
313
|
-
end
|
314
|
-
when :alt
|
315
|
-
case element_instance
|
316
|
-
when Celerity::Image
|
317
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getAltAttribute, what) }
|
318
|
-
end
|
319
|
-
when :action
|
320
|
-
case element_instance
|
321
|
-
when Celerity::Form
|
322
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getActionAttribute, what) }
|
323
|
-
end
|
324
|
-
when :method
|
325
|
-
case element_instance
|
326
|
-
when Celerity::Form
|
327
|
-
elements_by_tag_names(tags).find { |elem| matches?(elem.getMethodAttribute, what) }
|
328
|
-
end
|
329
|
-
else
|
330
|
-
raise MissingWayOfFindingObjectException, "No how #{how.inspect}"
|
331
|
-
end
|
332
|
-
rescue HtmlUnit::ElementNotFoundException
|
333
|
-
end
|
334
|
-
end
|
335
|
-
|
336
214
|
private
|
337
|
-
|
338
|
-
# this could be optimized when iterating - we don't need to check the class of 'what' for each element
|
339
|
-
# perhaps something like this
|
340
|
-
# find_matching_element(collection, method = :to_s, what)
|
215
|
+
|
341
216
|
def matches?(string, what)
|
342
217
|
Regexp === what ? string.match(what) : string == what.to_s
|
343
218
|
end
|
344
219
|
|
345
|
-
def elements_by_tag_names(tags)
|
346
|
-
# HtmlUnit's getHtmlElementsByTagNames won't get elements in the correct order, making :index fail
|
347
|
-
tags.map! { |t| t.downcase }
|
348
|
-
@object.getAllHtmlChildElements.iterator.to_a.select do |elem|
|
349
|
-
tags.include?(elem.getTagName)
|
350
|
-
end
|
351
|
-
end
|
352
|
-
|
353
|
-
def elements_by_idents(idents)
|
354
|
-
elements = elements_by_tag_names(idents.map { |i| i.tag })
|
355
|
-
# Log.debug elements.inspect
|
356
|
-
elements.select do |e|
|
357
|
-
idents.any? do |ident|
|
358
|
-
next unless ident.tag == e.getTagName
|
359
|
-
if ident.attributes.empty?
|
360
|
-
true
|
361
|
-
else
|
362
|
-
ident.attributes.any? { |key, value| value.include?(e.getAttributeValue(key.to_s)) }
|
363
|
-
end
|
364
|
-
end
|
365
|
-
end
|
366
|
-
end
|
367
|
-
|
368
220
|
end # Container
|
369
221
|
end # Celerity
|