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
@@ -2,41 +2,38 @@ module Celerity
|
|
2
2
|
class Frame < Element
|
3
3
|
include Container
|
4
4
|
attr_accessor :page
|
5
|
-
|
5
|
+
|
6
|
+
TAGS = [Identifier.new('frame'), Identifier.new('iframe')]
|
7
|
+
|
6
8
|
ATTRIBUTES = BASE_ATTRIBUTES | [:longdesc, :name, :src, :frameborder, :marginwidth, :marginheight, :noresize, :scrolling]
|
7
9
|
DEFAULT_HOW = :name
|
8
10
|
|
9
11
|
def locate
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
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
|
12
|
+
super
|
13
|
+
if @object
|
14
|
+
@inline_frame_object = @object.getEnclosedWindow.getFrameElement
|
15
|
+
if (frame = @object.getEnclosedPage.getDocumentElement)
|
16
|
+
@object = frame
|
17
|
+
else
|
18
|
+
@object = nil
|
27
19
|
end
|
28
20
|
end
|
29
|
-
|
21
|
+
end
|
22
|
+
|
23
|
+
def assert_exists
|
24
|
+
locate unless @object
|
25
|
+
unless @object
|
26
|
+
raise UnknownFrameException, "unable to locate frame, using #{identifier_string}"
|
27
|
+
end
|
30
28
|
end
|
31
29
|
|
32
30
|
def update_page(value)
|
33
|
-
# Log.debug(value.asXml)
|
34
31
|
@page_container.set_page(value.getEnclosingWindow.getTopWindow.getEnclosedPage)
|
35
32
|
end
|
36
33
|
|
37
34
|
def to_s
|
38
35
|
assert_exists
|
39
|
-
create_string(@
|
36
|
+
create_string(@inline_frame_object)
|
40
37
|
end
|
41
38
|
|
42
39
|
end
|
@@ -9,7 +9,7 @@ module Celerity
|
|
9
9
|
include ClickableElement
|
10
10
|
include DisabledElement
|
11
11
|
|
12
|
-
TAGS = ['img']
|
12
|
+
TAGS = [ Identifier.new('img') ]
|
13
13
|
ATTRIBUTES = BASE_ATTRIBUTES | [:src, :alt, :longdesc, :name, :height, :width, :usemap, :ismap, :align, :border, :hspace, :vspace]
|
14
14
|
|
15
15
|
# this method returns the file created date of the image
|
@@ -39,13 +39,7 @@ module Celerity
|
|
39
39
|
assert_exists
|
40
40
|
@object.getHeight
|
41
41
|
end
|
42
|
-
|
43
|
-
def disabled?
|
44
|
-
assert_exists
|
45
|
-
raise NotImplementedError
|
46
|
-
end
|
47
|
-
alias_method :disabled, :disabled?
|
48
|
-
|
42
|
+
|
49
43
|
def loaded?
|
50
44
|
assert_exists
|
51
45
|
begin
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Celerity
|
2
|
+
class Option < Element
|
3
|
+
include ClickableElement
|
4
|
+
include DisabledElement
|
5
|
+
|
6
|
+
TAGS = [ Identifier.new('option')]
|
7
|
+
ATTRIBUTES = BASE_ATTRIBUTES | [:selected, :disabled, :label, :value]
|
8
|
+
|
9
|
+
alias_method :select, :click
|
10
|
+
|
11
|
+
def selected?
|
12
|
+
assert_exists
|
13
|
+
@object.isSelected
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -6,14 +6,17 @@ module Celerity
|
|
6
6
|
# most of the methods available to this element are inherited from the Element class
|
7
7
|
#
|
8
8
|
class RadioCheckCommon < InputElement
|
9
|
-
def
|
10
|
-
@object = @container.locate_input_element(self, @how, @what, @value)
|
11
|
-
end
|
12
|
-
|
13
|
-
def initialize(container, how, what, type, value = nil)
|
9
|
+
def initialize(container, type, *args)
|
14
10
|
@type = type
|
15
|
-
|
16
|
-
|
11
|
+
|
12
|
+
case args.size
|
13
|
+
when 2
|
14
|
+
super(container, args[0] => args[1])
|
15
|
+
when 3
|
16
|
+
super(container, args[0] => args[1], :value => args[2])
|
17
|
+
else
|
18
|
+
super(container, *args)
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
def set?
|
@@ -35,6 +38,10 @@ module Celerity
|
|
35
38
|
class Radio < RadioCheckCommon
|
36
39
|
TAGS = [Identifier.new('input', :type => %w(radio))]
|
37
40
|
|
41
|
+
def initialize(container, *args)
|
42
|
+
super(container, ['radio'], *args)
|
43
|
+
end
|
44
|
+
|
38
45
|
def set(value = true)
|
39
46
|
assert_exists
|
40
47
|
assert_enabled
|
@@ -47,6 +54,10 @@ module Celerity
|
|
47
54
|
class CheckBox < RadioCheckCommon
|
48
55
|
TAGS = [Identifier.new('input', :type => %w(checkbox))]
|
49
56
|
|
57
|
+
def initialize(container, *args)
|
58
|
+
super(container, ['checkbox'], *args)
|
59
|
+
end
|
60
|
+
|
50
61
|
def set(value = true)
|
51
62
|
assert_exists
|
52
63
|
assert_enabled
|
@@ -43,7 +43,7 @@ module Celerity
|
|
43
43
|
|
44
44
|
def selected?(value)
|
45
45
|
assert_exists
|
46
|
-
# This should probably raise NoValueFoundException
|
46
|
+
# This should probably raise NoValueFoundException?
|
47
47
|
raise UnknownObjectException, "unknown option with value #{value.inspect}" unless include?(value)
|
48
48
|
!!@object.getOptions.find { |e| matches?(e.asText, value) && e.isSelected }
|
49
49
|
end
|
@@ -65,20 +65,4 @@ module Celerity
|
|
65
65
|
Option.new(self, attribute, value)
|
66
66
|
end
|
67
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
68
|
end
|
@@ -2,13 +2,13 @@ module Celerity
|
|
2
2
|
|
3
3
|
class Table < Element
|
4
4
|
include Container
|
5
|
-
TAGS = ['table']
|
5
|
+
TAGS = [ Identifier.new('table') ]
|
6
6
|
ATTRIBUTES = BASE_ATTRIBUTES | [:summary, :width, :border, :frame, :rules, :cellspacing, :cellpadding, :align, :bgcolor]
|
7
7
|
DEFAULT_HOW = :name
|
8
8
|
|
9
9
|
def locate
|
10
|
-
|
11
|
-
if @object # cant call
|
10
|
+
super
|
11
|
+
if @object # cant call assert_exists here, as an exists? method call will fail
|
12
12
|
@rows = @object.getRows
|
13
13
|
@cells = []
|
14
14
|
@rows.each do |row|
|
@@ -73,7 +73,7 @@ module Celerity
|
|
73
73
|
|
74
74
|
def body(how, what)
|
75
75
|
assert_exists
|
76
|
-
return TableBody.new(@container, how, what
|
76
|
+
return TableBody.new(@container, how, what)
|
77
77
|
end
|
78
78
|
|
79
79
|
def bodies
|
@@ -1,15 +1,12 @@
|
|
1
1
|
module Celerity
|
2
2
|
|
3
3
|
class TableBody < Element
|
4
|
-
TAGS = ['tbody']
|
4
|
+
TAGS = [ Identifier.new('tbody') ]
|
5
5
|
|
6
6
|
def locate
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
7
|
+
super
|
8
|
+
# can't call the assert_exists here, as an exists? method call will fail
|
9
|
+
if @object
|
13
10
|
@rows = @object.getRows
|
14
11
|
@cells = []
|
15
12
|
@rows.each do |row|
|
@@ -31,7 +28,8 @@ module Celerity
|
|
31
28
|
end
|
32
29
|
|
33
30
|
def each
|
34
|
-
|
31
|
+
assert_exists
|
32
|
+
@rows.each { |row| yield TableRow.new(self, :object, row) }
|
35
33
|
end
|
36
34
|
|
37
35
|
end
|
@@ -4,27 +4,16 @@ module Celerity
|
|
4
4
|
include Celerity::Exception
|
5
5
|
include Container
|
6
6
|
|
7
|
-
TAGS = ['td']
|
7
|
+
TAGS = [ Identifier.new('td') ]
|
8
8
|
ATTRIBUTES = BASE_ATTRIBUTES | [:abbr, :axis, :headers, :scope, :rowspan, :colspan] | CELLHALIGN_ATTRIBUTES | CELLVALIGN_ATTRIBUTES
|
9
9
|
|
10
|
-
|
11
|
-
if @how == :object
|
12
|
-
@object = @what
|
13
|
-
else
|
14
|
-
@object = @container.locate_tagged_element(self, @how, @what)
|
15
|
-
end
|
16
|
-
end
|
10
|
+
alias_method :to_s, :text
|
17
11
|
|
18
12
|
def colspan
|
19
13
|
assert_exists
|
20
14
|
attribute_value = @object.getAttributeValue('colspan').to_i
|
21
|
-
|
22
|
-
attribute_value
|
23
|
-
else
|
24
|
-
1
|
25
|
-
end
|
15
|
+
attribute_value > 0 ? attribute_value : 1
|
26
16
|
end
|
27
17
|
|
28
|
-
alias_method :to_s, :text
|
29
18
|
end
|
30
19
|
end
|
@@ -1,22 +1,16 @@
|
|
1
1
|
module Celerity
|
2
2
|
|
3
3
|
class TableRow < Element
|
4
|
-
TAGS = ['tr']
|
4
|
+
TAGS = [ Identifier.new('tr') ]
|
5
5
|
|
6
6
|
def locate
|
7
|
-
|
8
|
-
|
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
|
7
|
+
super
|
8
|
+
@cells = @object.getCells if @object
|
15
9
|
end
|
16
10
|
|
17
11
|
def each
|
18
12
|
locate
|
19
|
-
|
13
|
+
@cells.each { |cell| yield TableCell.new(self, :object, cell) }
|
20
14
|
end
|
21
15
|
|
22
16
|
def [](index)
|
@@ -6,7 +6,7 @@ module Celerity
|
|
6
6
|
# Normally a user would not need to create this object as it is returned by the Watir::Container#text_field method
|
7
7
|
class TextField < InputElement
|
8
8
|
TAGS = [ Identifier.new('textarea'),
|
9
|
-
Identifier.new('input', :type =>
|
9
|
+
Identifier.new('input', :type => ["text", "password", /^(?!(file|radio|checkbox|submit|reset|image|button|hidden)$)/]) ]
|
10
10
|
|
11
11
|
def clear
|
12
12
|
assert_exists
|
@@ -22,11 +22,11 @@ module Celerity
|
|
22
22
|
assert_enabled
|
23
23
|
assert_not_readonly
|
24
24
|
clear
|
25
|
-
#
|
25
|
+
# workaround for bug in HtmlPasswordInput - should be fixed soon (Jari - 2008-05-14)
|
26
26
|
if @object.class == com.gargoylesoftware.htmlunit.html.HtmlPasswordInput
|
27
27
|
@object.setValueAttribute(value.to_s)
|
28
28
|
else
|
29
|
-
value.to_s.
|
29
|
+
java.lang.String.new(value.to_s).toCharArray.each do |char|
|
30
30
|
@container.update_page @object.type(char)
|
31
31
|
end
|
32
32
|
end
|
@@ -43,11 +43,23 @@ module Celerity
|
|
43
43
|
@object.setValueAttribute(value.to_s)
|
44
44
|
end
|
45
45
|
end
|
46
|
+
|
47
|
+
def value
|
48
|
+
assert_exists
|
49
|
+
case @object.getTagName
|
50
|
+
when 'textarea'
|
51
|
+
@object.getText
|
52
|
+
when 'input'
|
53
|
+
@object.getValueAttribute
|
54
|
+
end
|
55
|
+
end
|
46
56
|
|
47
57
|
def append(value)
|
48
58
|
assert_enabled
|
49
59
|
assert_not_readonly
|
50
|
-
value.to_s.
|
60
|
+
java.lang.String.new(value.to_s).toCharArray.each do |char|
|
61
|
+
@container.update_page @object.type(char)
|
62
|
+
end
|
51
63
|
end
|
52
64
|
|
53
65
|
# This bascially just moves the text to the other text field using TextField#append
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "uri"
|
3
|
+
require "active_support"
|
4
|
+
|
5
|
+
# http://api.rubyonrails.com/classes/Inflector.html#M001621
|
6
|
+
class String
|
7
|
+
def underscore
|
8
|
+
gsub(/::/, '/').
|
9
|
+
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
|
10
|
+
gsub(/([a-z\d])([A-Z])/,'\1_\2').
|
11
|
+
tr("-", "_").
|
12
|
+
downcase
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module Celerity
|
17
|
+
class MethodGenerator
|
18
|
+
|
19
|
+
ELEMENTS = %w(text_field select_list radio checkbox button).map { |e| e.to_sym }
|
20
|
+
BUGGY_ELEMENTS = %w(radio checkbox).map { |e| e.to_sym }
|
21
|
+
|
22
|
+
def initialize(ie, opts = {})
|
23
|
+
@ie = ie
|
24
|
+
@opts = opts
|
25
|
+
@browser = @opts[:browser] || '@ie'
|
26
|
+
|
27
|
+
@docs = " # Fills in the page at #{@ie.url}\n #\n"
|
28
|
+
@docs << " # Parameters:\n #\n"
|
29
|
+
@doc_elements = []
|
30
|
+
|
31
|
+
@method = " def #{@opts[:method_name] || 'generated_method'}(opts = {})\n\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse
|
35
|
+
ELEMENTS.each do |elem|
|
36
|
+
@method << " # buggy!\n" if BUGGY_ELEMENTS.include?(elem)
|
37
|
+
add_elements(elem)
|
38
|
+
end
|
39
|
+
add_elements(:link) if @opts[:include_links]
|
40
|
+
@method << " end\n\n"
|
41
|
+
|
42
|
+
# fix docs
|
43
|
+
max = @doc_elements.map { |symbol, _| symbol.to_s.size }.max
|
44
|
+
@doc_elements.each do |sym, desc|
|
45
|
+
@docs << " # #{sym.to_s.ljust(max)} => #{desc}\n"
|
46
|
+
end
|
47
|
+
@docs << " #\n"*2
|
48
|
+
@docs + @method
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def add_elements(symbol)
|
54
|
+
symbol = symbol.to_sym
|
55
|
+
symbol_pluralized = symbol.to_s.pluralize.to_sym
|
56
|
+
@ie.send(symbol_pluralized).each_with_index do |elem, idx|
|
57
|
+
self.send("add_#{symbol}".to_sym, elem, idx)
|
58
|
+
end
|
59
|
+
@method << "\n"
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_text_field(elem, idx)
|
63
|
+
how, what = find_identifier(elem) || [:index, (idx + 1).to_s]
|
64
|
+
@method << " #{@browser}.text_field(#{how.inspect}, #{what.inspect}).value = "
|
65
|
+
symbol = (how == :index) ? ":text_field_#{what.underscore}" : ":#{what.underscore}"
|
66
|
+
@method << "opts[#{symbol}]\n"
|
67
|
+
@doc_elements << [symbol, "value for text field #{what.inspect}"]
|
68
|
+
end
|
69
|
+
|
70
|
+
def add_select_list(elem, idx)
|
71
|
+
how, what = find_identifier(elem) || [:index, (idx + 1).to_s]
|
72
|
+
@method << " #{@browser}.select_list(#{how.inspect}, #{what.inspect}).select("
|
73
|
+
symbol = (how == :index) ? ":select_list_#{what.underscore}" : ":#{what.underscore}"
|
74
|
+
@method << "opts[#{symbol}])\n"
|
75
|
+
@doc_elements << [symbol, "option to select for select list #{what.inspect}"]
|
76
|
+
end
|
77
|
+
|
78
|
+
def add_radio(elem, idx)
|
79
|
+
how, what = find_identifier(elem) || [:index, (idx + 1).to_s]
|
80
|
+
@method << " #{@browser}.radio(#{how.inspect}, #{what.inspect}, "
|
81
|
+
if (value = elem.value).empty?
|
82
|
+
symbol = (how == :index) ? ":radio_#{what.underscore}" : ":#{what.underscore}"
|
83
|
+
else
|
84
|
+
symbol = ":#{what.underscore}_#{value.underscore}"
|
85
|
+
@method << "#{value.inspect}).set if opts[#{symbol}]\n"
|
86
|
+
end
|
87
|
+
@doc_elements << [symbol, "set the radio with id/value #{what.inspect}"]
|
88
|
+
end
|
89
|
+
|
90
|
+
def add_checkbox(elem, idx)
|
91
|
+
how, what = find_identifier(elem) || [:index, (idx + 1).to_s]
|
92
|
+
@method << " #{@browser}.checkbox(#{how.inspect}, #{what.inspect}, "
|
93
|
+
symbol = (how == :index) ? ":checkbox_#{what.underscore}" : ":#{what.underscore}"
|
94
|
+
@method << "#{elem.value.inspect}).set if opts[#{symbol}]\n"
|
95
|
+
@doc_elements << [symbol, "set the checkbox with id/value #{what.inspect}"]
|
96
|
+
end
|
97
|
+
|
98
|
+
def add_button(elem, idx)
|
99
|
+
how, what = find_identifier(elem) || [:index, (idx + 1).to_s]
|
100
|
+
@method << " #{@browser}.button(#{how.inspect}, #{what.inspect}).click\n"
|
101
|
+
end
|
102
|
+
|
103
|
+
def add_link(elem, idx)
|
104
|
+
if (href = elem.href) =~ /javascript/
|
105
|
+
how, what = :index, (idx + 1).to_s
|
106
|
+
else
|
107
|
+
how = :url
|
108
|
+
uri = URI.parse(href)
|
109
|
+
what = Regexp.new(Regexp.escape(uri.to_s.sub(/.*#{uri.host}\//, '')))
|
110
|
+
end
|
111
|
+
@method << " #{@browser}.link(#{how.inspect}, #{what.inspect}).click\n"
|
112
|
+
end
|
113
|
+
|
114
|
+
def find_identifier(element)
|
115
|
+
# could use these if they were 'weighted' ?
|
116
|
+
attrs = element.class::ATTRIBUTES
|
117
|
+
[:id, :name].each do |attribute|
|
118
|
+
return [attribute, element.send(attribute)] if attrs.include?(attribute) && !element.send(attribute).empty?
|
119
|
+
end
|
120
|
+
nil
|
121
|
+
end
|
122
|
+
|
123
|
+
end # MethodGenerator
|
124
|
+
|
125
|
+
class IE
|
126
|
+
def generate_method
|
127
|
+
MethodGenerator.new(self).parse
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end # Celerity
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
# if __FILE__ == $0
|
136
|
+
# require File.dirname(__FILE__) + "/../spec/spec_helper"
|
137
|
+
# $stdout.sync = true
|
138
|
+
# @ie = IE.new
|
139
|
+
# @ie.goto(TEST_HOST + "/forms_with_input_elements.html")
|
140
|
+
#
|
141
|
+
# puts MethodGenerator.new(@ie).parse
|
142
|
+
# @ie.goto(TEST_HOST + "/forms3.html")
|
143
|
+
# puts MethodGenerator.new(@ie).parse
|
144
|
+
# end
|