watir 3.0.0.rc2 → 3.0.0.rc3
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/CHANGES +19 -0
- data/VERSION +1 -1
- data/lib/watir/close_all.rb +2 -2
- data/lib/watir/container.rb +6 -4
- data/lib/watir/cookies.rb +80 -0
- data/lib/watir/core.rb +7 -3
- data/lib/watir/dialogs/file_field.rb +0 -4
- data/lib/watir/drag_and_drop_helper.rb +68 -0
- data/lib/watir/element.rb +58 -156
- data/lib/watir/element_collection.rb +109 -0
- data/lib/watir/form.rb +7 -14
- data/lib/watir/frame.rb +11 -26
- data/lib/watir/ie-class.rb +17 -307
- data/lib/watir/ie.rb +0 -9
- data/lib/watir/image.rb +8 -25
- data/lib/watir/input_elements.rb +32 -81
- data/lib/watir/link.rb +2 -17
- data/lib/watir/locator.rb +29 -25
- data/lib/watir/modal_dialog.rb +26 -40
- data/lib/watir/non_control_elements.rb +111 -79
- data/lib/watir/page-container.rb +12 -1
- data/lib/watir/supported_elements.rb +172 -0
- data/lib/watir/table.rb +61 -89
- data/lib/watir/win32ole.rb +2 -3
- data/lib/watir/win32ole/1.9.3/win32ole.so +0 -0
- data/lib/watir/xpath_locator.rb +52 -0
- data/rakefile.rb +1 -1
- data/unittests/checkbox_test.rb +22 -32
- data/unittests/css_selector_test.rb +1 -6
- data/unittests/css_test.rb +1 -4
- data/unittests/div_test.rb +3 -21
- data/unittests/document_standards.rb +0 -4
- data/unittests/element_collections_test.rb +2 -2
- data/unittests/element_test.rb +1 -1
- data/unittests/form_test.rb +0 -30
- data/unittests/frame_test.rb +8 -49
- data/unittests/ie_test.rb +5 -9
- data/unittests/images_test.rb +6 -6
- data/unittests/index_specifier_test.rb +0 -1
- data/unittests/js_events_test.rb +1 -1
- data/unittests/links_multi_test.rb +0 -14
- data/unittests/links_test.rb +8 -51
- data/unittests/lists_test.rb +0 -9
- data/unittests/navigate_test.rb +1 -1
- data/unittests/nbsp_xpath_test.rb +1 -1
- data/unittests/no_wait_test.rb +3 -3
- data/unittests/parent_child_test.rb +0 -17
- data/unittests/pre_test.rb +0 -3
- data/unittests/radios_test.rb +31 -42
- data/unittests/selectbox_test.rb +18 -21
- data/unittests/selectbox_xpath_test.rb +11 -26
- data/unittests/table_test.rb +14 -79
- data/unittests/textfields_test.rb +8 -47
- data/unittests/windows/attach_to_new_window_test.rb +0 -8
- data/unittests/windows/frame_links_test.rb +5 -5
- data/unittests/windows/ie-each_test.rb +1 -1
- data/unittests/windows/modal_dialog_test.rb +2 -2
- data/watir.gemspec +3 -3
- metadata +81 -126
- data/lib/watir/camel_case.rb +0 -67
- data/lib/watir/collections.rb +0 -48
- data/lib/watir/cookiemanager.rb +0 -56
- data/lib/watir/element_collections.rb +0 -81
- data/lib/watir/html_element.rb +0 -30
- data/unittests/defer_test.rb +0 -47
- data/unittests/multiple_specifiers_test.rb +0 -29
- data/unittests/table_and_tablerow_to_a_test.rb +0 -117
- data/unittests/windows/iedialog_test.rb +0 -53
data/CHANGES
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
== 3.0.0.rc3 - 2012/03/18
|
|
2
|
+
|
|
3
|
+
* all html elements are now supported (even html5 ones)
|
|
4
|
+
* CookieManager removed
|
|
5
|
+
* cookies API support added (https://github.com/watir/watirspec/blob/master/cookies_spec.rb)
|
|
6
|
+
* drag and drop API support added (https://github.com/watir/watirspec/blob/master/drag_and_drop_spec.rb)
|
|
7
|
+
* Element#(before|after)? removed
|
|
8
|
+
* Element#(before|after)_text removed
|
|
9
|
+
* Browser#cell(s) and Browser#row(s) removed
|
|
10
|
+
* Browser#Element camelCase methods removed, use under_score methods instead
|
|
11
|
+
* Browser#element(s) supports only general attributes like :id, :title, :class_name, :text, :html and such
|
|
12
|
+
* Browser#modal_dialog improved
|
|
13
|
+
* Browser#send_keys and Element#send_keys have now same syntax as specified in WatirSpec
|
|
14
|
+
* Element#style returns internal styles only for IE9, inline style will be returned for IE8
|
|
15
|
+
* Table#each removed - use Table#(trs|rows).each instead
|
|
16
|
+
* Table#row(s) and Table#cell(s) added which ignore inner tables - use #td/#tr for all.
|
|
17
|
+
* raise an Exception if more locators are specified with :xpath/:css
|
|
18
|
+
* searching by :xpath and :css code rewritten
|
|
19
|
+
|
|
1
20
|
== 3.0.0.rc2 - 2012/02/04
|
|
2
21
|
|
|
3
22
|
* Browser#textarea(s) method for searching <textarea> elements
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.0.0.
|
|
1
|
+
3.0.0.rc3
|
data/lib/watir/close_all.rb
CHANGED
|
@@ -23,9 +23,9 @@ module Watir
|
|
|
23
23
|
# to appear and does not raise exception if no window is found.
|
|
24
24
|
# returns true if modal was found and close, otherwise false
|
|
25
25
|
def close_modal
|
|
26
|
-
while self.modal_dialog.exists?
|
|
26
|
+
while self.modal_dialog.exists? do
|
|
27
27
|
self.modal_dialog.close
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
30
|
end
|
|
31
|
-
end
|
|
31
|
+
end
|
data/lib/watir/container.rb
CHANGED
|
@@ -57,6 +57,10 @@ module Watir
|
|
|
57
57
|
|
|
58
58
|
public
|
|
59
59
|
|
|
60
|
+
def modal_dialog
|
|
61
|
+
ModalDialog.new(self)
|
|
62
|
+
end
|
|
63
|
+
|
|
60
64
|
# Searching for Page Elements
|
|
61
65
|
# Not for external consumption
|
|
62
66
|
#
|
|
@@ -98,10 +102,8 @@ module Watir
|
|
|
98
102
|
# Not for external use, but cannot set to private due to usages in Element
|
|
99
103
|
# classes.
|
|
100
104
|
|
|
101
|
-
def locator_for(locator_class,
|
|
102
|
-
|
|
103
|
-
locator.set_specifier how, what
|
|
104
|
-
locator
|
|
105
|
+
def locator_for(locator_class, specifiers, klass)
|
|
106
|
+
locator_class.new self, specifiers, klass
|
|
105
107
|
end
|
|
106
108
|
|
|
107
109
|
end # module
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require "uri"
|
|
2
|
+
|
|
3
|
+
module Watir
|
|
4
|
+
class Cookies
|
|
5
|
+
include Enumerable
|
|
6
|
+
|
|
7
|
+
def initialize(page_container)
|
|
8
|
+
@page_container = page_container
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def each
|
|
12
|
+
@page_container.document.cookie.split(";").each do |cookie|
|
|
13
|
+
name, value = cookie.strip.split("=")
|
|
14
|
+
yield({:name => name, :value => value})
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add name, value, options={}
|
|
19
|
+
options = options.map do |option|
|
|
20
|
+
k, v = option
|
|
21
|
+
if k == :expires
|
|
22
|
+
"#{k}=#{v.gmtime.strftime("%a, %d %b %Y %H:%M:%S UTC")}"
|
|
23
|
+
elsif k == :secure
|
|
24
|
+
"secure" if v
|
|
25
|
+
else
|
|
26
|
+
"#{k}=#{v}"
|
|
27
|
+
end
|
|
28
|
+
end.compact.join("; ")
|
|
29
|
+
|
|
30
|
+
options = "; #{options}" unless options.empty?
|
|
31
|
+
@page_container.document.cookie = "#{name}=#{value}#{options}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def delete name
|
|
35
|
+
options = {:expires => ::Time.now - 60 * 60 * 24}
|
|
36
|
+
delete_with_options name, options
|
|
37
|
+
|
|
38
|
+
# make sure that the cookie gets deleted
|
|
39
|
+
# there's got to be some easier way to do this
|
|
40
|
+
uri = URI.parse(@page_container.url)
|
|
41
|
+
domain = uri.host
|
|
42
|
+
|
|
43
|
+
paths = uri.path.split("/").reduce([]) do |paths, path|
|
|
44
|
+
paths << "#{paths.last}/#{path}".squeeze("/")
|
|
45
|
+
end << "/"
|
|
46
|
+
|
|
47
|
+
subdomains = domain.split(".").reverse.reduce([]) do |subdomains, part|
|
|
48
|
+
subdomain = "#{part}#{subdomains.last}"
|
|
49
|
+
subdomain = "." + subdomain unless subdomain == domain
|
|
50
|
+
subdomains << subdomain
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
subdomains.each do |subdomain|
|
|
54
|
+
domain_options = options.merge :domain => subdomain
|
|
55
|
+
delete_with_options name, domain_options
|
|
56
|
+
delete_with_options name, domain_options.merge(:secure => true)
|
|
57
|
+
|
|
58
|
+
paths.each do |path|
|
|
59
|
+
path_options = options.merge :path => path
|
|
60
|
+
delete_with_options name, path_options
|
|
61
|
+
delete_with_options name, path_options.merge(:secure => true)
|
|
62
|
+
|
|
63
|
+
path_domain_options = domain_options.merge :path => path
|
|
64
|
+
delete_with_options name, path_domain_options
|
|
65
|
+
delete_with_options name, path_domain_options.merge(:secure => true)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def clear
|
|
71
|
+
each {|cookie| delete cookie[:name]}
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def delete_with_options name, options={}
|
|
75
|
+
add name, nil, options
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private :delete_with_options
|
|
79
|
+
end
|
|
80
|
+
end
|
data/lib/watir/core.rb
CHANGED
|
@@ -14,20 +14,22 @@ require 'watir/element_extensions'
|
|
|
14
14
|
require 'logger'
|
|
15
15
|
require 'watir/logger'
|
|
16
16
|
require 'watir/container'
|
|
17
|
+
require 'watir/xpath_locator'
|
|
17
18
|
require 'watir/locator'
|
|
18
19
|
require 'watir/page-container'
|
|
19
20
|
require 'watir/ie-class'
|
|
21
|
+
require 'watir/drag_and_drop_helper'
|
|
20
22
|
require 'watir/element'
|
|
21
|
-
require 'watir/
|
|
23
|
+
require 'watir/element_collection'
|
|
22
24
|
require 'watir/form'
|
|
23
25
|
require 'watir/frame'
|
|
24
|
-
require 'watir/non_control_elements'
|
|
25
26
|
require 'watir/input_elements'
|
|
27
|
+
require 'watir/non_control_elements'
|
|
26
28
|
require 'watir/table'
|
|
27
29
|
require 'watir/image'
|
|
28
30
|
require 'watir/link'
|
|
29
|
-
require 'watir/html_element'
|
|
30
31
|
require 'watir/window'
|
|
32
|
+
require 'watir/cookies'
|
|
31
33
|
|
|
32
34
|
require 'watir/win32'
|
|
33
35
|
require 'watir/modal_dialog'
|
|
@@ -37,3 +39,5 @@ require 'watir/module'
|
|
|
37
39
|
require 'rautomation'
|
|
38
40
|
require 'watir/dialogs/file_field'
|
|
39
41
|
require 'watir/dialogs/javascript'
|
|
42
|
+
|
|
43
|
+
require 'watir/supported_elements'
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Watir
|
|
2
|
+
module DragAndDropHelper
|
|
3
|
+
|
|
4
|
+
def drag_and_drop_on(target)
|
|
5
|
+
perform_action do
|
|
6
|
+
assert_target target
|
|
7
|
+
drop_x, drop_y = target.send :source_x_y
|
|
8
|
+
drag_to drop_x, drop_y
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def drag_and_drop_by(distance_x, distance_y)
|
|
13
|
+
perform_action do
|
|
14
|
+
drag_x, drag_y = source_x_y
|
|
15
|
+
drag_to drag_x + distance_x, drag_y + distance_y
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def drag_to(drop_x, drop_y)
|
|
22
|
+
drag_x, drag_y = source_x_y
|
|
23
|
+
mouse = page_container.rautomation.mouse
|
|
24
|
+
mouse.move :x => drag_x , :y => drag_y
|
|
25
|
+
mouse.press
|
|
26
|
+
mouse.move :x => drop_x, :y => drop_y
|
|
27
|
+
mouse.release
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def source_x_y
|
|
31
|
+
center_x_y_absolute left_edge_absolute, top_edge_absolute
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def assert_target(target)
|
|
35
|
+
target.assert_exists
|
|
36
|
+
target.assert_enabled
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def top_edge
|
|
40
|
+
ole_object.getBoundingClientRect.top.to_i
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def top_edge_absolute
|
|
44
|
+
top_edge + page_container.document.parentWindow.screenTop.to_i
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def left_edge
|
|
48
|
+
ole_object.getBoundingClientRect.left.to_i
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def left_edge_absolute
|
|
52
|
+
left_edge + page_container.document.parentWindow.screenLeft.to_i
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def right_edge
|
|
56
|
+
ole_object.getBoundingClientRect.right.to_i
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def bottom_edge
|
|
60
|
+
ole_object.getBoundingClientRect.bottom.to_i
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def center_x_y_absolute x, y
|
|
64
|
+
return (right_edge - left_edge) / 2 + x, (bottom_edge - top_edge) / 2 + y
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
68
|
+
end
|
data/lib/watir/element.rb
CHANGED
|
@@ -2,42 +2,35 @@ module Watir
|
|
|
2
2
|
# Base class for html elements.
|
|
3
3
|
# This is not a class that users would normally access.
|
|
4
4
|
class Element # Wrapper
|
|
5
|
+
include Comparable
|
|
5
6
|
include ElementExtensions
|
|
6
7
|
include Exception
|
|
7
8
|
include Container # presumes @container is defined
|
|
9
|
+
include DragAndDropHelper
|
|
10
|
+
|
|
8
11
|
attr_accessor :container
|
|
9
12
|
|
|
10
13
|
# number of spaces that separate the property from the value in the to_s method
|
|
11
14
|
TO_S_SIZE = 14
|
|
12
15
|
|
|
13
|
-
def
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Watir::Container.module_eval <<-RUBY
|
|
17
|
-
def #{method_name}(how={}, what=nil)
|
|
18
|
-
#{class_name}.new(self, how, what)
|
|
19
|
-
end
|
|
16
|
+
def initialize(container, specifiers)
|
|
17
|
+
set_container container
|
|
18
|
+
raise ArgumentError, "#{specifiers.inspect} has to be Hash" unless specifiers.is_a?(Hash)
|
|
20
19
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
end
|
|
24
|
-
RUBY
|
|
20
|
+
@o = specifiers[:ole_object]
|
|
21
|
+
@specifiers = specifiers
|
|
25
22
|
end
|
|
26
23
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
def <=> other
|
|
25
|
+
assert_exists
|
|
26
|
+
other.assert_exists
|
|
27
|
+
ole_object.sourceindex <=> other.ole_object.sourceindex
|
|
31
28
|
end
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
return if self.class == Element
|
|
30
|
+
alias_method :eql?, :==
|
|
35
31
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
self.class.const_defined?(:TAGS) ? self.class::TAGS :
|
|
39
|
-
[self.class.name.split("::").last.upcase]
|
|
40
|
-
@o = @container.locator_for(TaggedElementLocator, tags, @how, @what, self.class).locate
|
|
32
|
+
def locate
|
|
33
|
+
@o = @container.locator_for(TaggedElementLocator, @specifiers, self.class).locate
|
|
41
34
|
end
|
|
42
35
|
|
|
43
36
|
# Return the ole object, allowing any methods of the DOM that Watir doesn't support to be used.
|
|
@@ -50,94 +43,45 @@ module Watir
|
|
|
50
43
|
end
|
|
51
44
|
|
|
52
45
|
def inspect
|
|
53
|
-
'#<%s:0x%x located=%s
|
|
46
|
+
'#<%s:0x%x located=%s specifiers=%s>' % [self.class, hash*2, !!ole_object, @specifiers.inspect]
|
|
54
47
|
end
|
|
55
48
|
|
|
56
49
|
private
|
|
57
|
-
def self.def_wrap(method_name, ole_method_name=nil)
|
|
58
|
-
class_eval "def #{method_name}
|
|
59
|
-
assert_exists
|
|
60
|
-
ole_object.invoke('#{ole_method_name || method_name}')
|
|
61
|
-
end"
|
|
62
|
-
end
|
|
63
50
|
|
|
64
|
-
def self.
|
|
65
|
-
class_eval
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
ole_object.getAttribute('#{ole_method_name || method_name}') || ''
|
|
72
|
-
rescue
|
|
73
|
-
''
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end"
|
|
51
|
+
def self.attr_ole(method_name, ole_method_name=nil)
|
|
52
|
+
class_eval %Q[
|
|
53
|
+
def #{method_name}
|
|
54
|
+
assert_exists
|
|
55
|
+
ole_method_name = '#{ole_method_name || method_name.to_s.gsub(/\?$/, '')}'
|
|
56
|
+
ole_object.invoke(ole_method_name) rescue attribute_value(ole_method_name) || '' rescue ''
|
|
57
|
+
end]
|
|
77
58
|
end
|
|
78
59
|
|
|
79
|
-
|
|
80
60
|
public
|
|
61
|
+
|
|
81
62
|
def assert_exists
|
|
82
63
|
locate
|
|
83
64
|
unless ole_object
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
else
|
|
87
|
-
raise UnknownObjectException.new(
|
|
88
|
-
Watir::Exception.message_for_unable_to_locate(@how, @what))
|
|
89
|
-
end
|
|
65
|
+
exception_class = self.is_a?(Frame) ? UnknownFrameException : UnknownObjectException
|
|
66
|
+
raise exception_class.new(Watir::Exception.message_for_unable_to_locate(@specifiers))
|
|
90
67
|
end
|
|
91
68
|
end
|
|
92
69
|
|
|
93
70
|
def assert_enabled
|
|
94
|
-
unless enabled?
|
|
95
|
-
raise ObjectDisabledException, "object #{@how} and #{@what} is disabled"
|
|
96
|
-
end
|
|
71
|
+
raise ObjectDisabledException, "object #{@specifiers.inspect} is disabled" unless enabled?
|
|
97
72
|
end
|
|
98
73
|
|
|
99
|
-
# return the name of the element (as defined in html)
|
|
100
|
-
def_wrap_guard :name
|
|
101
74
|
# return the id of the element
|
|
102
|
-
|
|
103
|
-
# return whether the element is disabled
|
|
104
|
-
def_wrap :disabled
|
|
105
|
-
alias disabled? disabled
|
|
106
|
-
# return the value of the element
|
|
107
|
-
def_wrap_guard :value
|
|
75
|
+
attr_ole :id
|
|
108
76
|
# return the title of the element
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
def_wrap_guard :alt
|
|
112
|
-
def_wrap_guard :src
|
|
113
|
-
|
|
114
|
-
# return the type of the element
|
|
115
|
-
def_wrap_guard :type # input elements only
|
|
116
|
-
# return the url the link points to
|
|
117
|
-
def_wrap :href # link only
|
|
77
|
+
attr_ole :title
|
|
118
78
|
# return the class name of the element
|
|
119
79
|
# raise an ObjectNotFound exception if the object cannot be found
|
|
120
|
-
|
|
80
|
+
attr_ole :class_name, :className
|
|
121
81
|
# return the unique COM number for the element
|
|
122
|
-
|
|
82
|
+
attr_ole :unique_number, :uniqueNumber
|
|
123
83
|
# Return the outer html of the object - see http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/outerhtml.asp?frame=true
|
|
124
|
-
|
|
125
|
-
# Return the "for" attribute for label
|
|
126
|
-
def_wrap_guard :for, :htmlFor
|
|
127
|
-
# Return the content attribute for meta tag
|
|
128
|
-
def_wrap_guard :content
|
|
129
|
-
# Return the http-equiv attribute for meta tag
|
|
130
|
-
def_wrap_guard :http_equiv, :httpEquiv
|
|
131
|
-
# Return font tag attributes
|
|
132
|
-
def_wrap_guard :color
|
|
133
|
-
def_wrap_guard :face
|
|
134
|
-
def_wrap_guard :size
|
|
135
|
-
# Return option label attribute
|
|
136
|
-
def_wrap_guard :label
|
|
137
|
-
# Return table rules attribute
|
|
138
|
-
def_wrap_guard :rules
|
|
139
|
-
# Return td headers attribute
|
|
140
|
-
def_wrap_guard :headers
|
|
84
|
+
attr_ole :html, :outerHTML
|
|
141
85
|
|
|
142
86
|
def tag_name
|
|
143
87
|
assert_exists
|
|
@@ -150,50 +94,33 @@ module Watir
|
|
|
150
94
|
|
|
151
95
|
tag = tag_name
|
|
152
96
|
if tag == "html"
|
|
153
|
-
|
|
97
|
+
element(:ole_object => ole_object)
|
|
154
98
|
elsif tag == "input"
|
|
155
|
-
|
|
99
|
+
send(ole_object.invoke('type'), :ole_object => ole_object)
|
|
156
100
|
elsif tag == "select"
|
|
157
|
-
|
|
158
|
-
elsif
|
|
159
|
-
|
|
101
|
+
select_list(:ole_object => ole_object)
|
|
102
|
+
elsif respond_to?(tag.downcase)
|
|
103
|
+
send(tag.downcase, :ole_object => ole_object)
|
|
160
104
|
else
|
|
161
105
|
self
|
|
162
106
|
end
|
|
163
107
|
end
|
|
164
108
|
|
|
165
109
|
# send keys to element
|
|
166
|
-
def send_keys(
|
|
110
|
+
def send_keys(*keys)
|
|
167
111
|
focus
|
|
168
|
-
page_container.send_keys
|
|
112
|
+
page_container.send_keys *keys
|
|
169
113
|
end
|
|
170
114
|
|
|
171
115
|
# return the css style as a string
|
|
172
116
|
def style
|
|
173
117
|
assert_exists
|
|
118
|
+
# this works for IE9
|
|
119
|
+
ole_object.currentStyle.cssText
|
|
120
|
+
rescue WIN32OLERuntimeError
|
|
174
121
|
ole_object.style.cssText
|
|
175
122
|
end
|
|
176
123
|
|
|
177
|
-
# return the text before the element
|
|
178
|
-
def before_text # label only
|
|
179
|
-
assert_exists
|
|
180
|
-
begin
|
|
181
|
-
ole_object.getAdjacentText("afterEnd").strip
|
|
182
|
-
rescue
|
|
183
|
-
''
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
|
|
187
|
-
# return the text after the element
|
|
188
|
-
def after_text # label only
|
|
189
|
-
assert_exists
|
|
190
|
-
begin
|
|
191
|
-
ole_object.getAdjacentText("beforeBegin").strip
|
|
192
|
-
rescue
|
|
193
|
-
''
|
|
194
|
-
end
|
|
195
|
-
end
|
|
196
|
-
|
|
197
124
|
# Return the innerText of the object or an empty string if the object is
|
|
198
125
|
# not visible
|
|
199
126
|
# Raise an ObjectNotFound exception if the object cannot be found
|
|
@@ -202,20 +129,14 @@ module Watir
|
|
|
202
129
|
visible? ? ole_object.innerText.strip : ""
|
|
203
130
|
end
|
|
204
131
|
|
|
205
|
-
# IE9 only returns empty string for ole_object.name for non-input elements
|
|
206
|
-
# so get at it through the attribute which will make the matchers work
|
|
207
|
-
def name
|
|
208
|
-
attribute_value('name') || ''
|
|
209
|
-
end
|
|
210
|
-
|
|
211
132
|
def __ole_inner_elements
|
|
212
133
|
assert_exists
|
|
213
|
-
|
|
134
|
+
ole_object.all
|
|
214
135
|
end
|
|
215
136
|
|
|
216
137
|
def document
|
|
217
138
|
assert_exists
|
|
218
|
-
|
|
139
|
+
ole_object
|
|
219
140
|
end
|
|
220
141
|
|
|
221
142
|
# Return the element immediately containing self.
|
|
@@ -223,33 +144,15 @@ module Watir
|
|
|
223
144
|
assert_exists
|
|
224
145
|
parent_element = ole_object.parentelement
|
|
225
146
|
return unless parent_element
|
|
226
|
-
|
|
227
|
-
result.set_container self
|
|
228
|
-
result
|
|
147
|
+
Element.new(self, :ole_object => parent_element).to_subtype
|
|
229
148
|
end
|
|
230
149
|
|
|
231
|
-
include Comparable
|
|
232
|
-
|
|
233
|
-
def <=> other
|
|
234
|
-
assert_exists
|
|
235
|
-
other.assert_exists
|
|
236
|
-
ole_object.sourceindex <=> other.ole_object.sourceindex
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
alias_method :eql?, :==
|
|
240
|
-
|
|
241
|
-
# Return true if self is contained earlier in the html than other.
|
|
242
|
-
alias :before? :<
|
|
243
|
-
# Return true if self is contained later in the html than other.
|
|
244
|
-
alias :after? :>
|
|
245
|
-
|
|
246
150
|
def typingspeed
|
|
247
151
|
@container.typingspeed
|
|
248
152
|
end
|
|
249
153
|
|
|
250
154
|
def type_keys
|
|
251
|
-
|
|
252
|
-
@type_keys
|
|
155
|
+
@type_keys || @container.type_keys
|
|
253
156
|
end
|
|
254
157
|
|
|
255
158
|
def activeObjectHighLightColor
|
|
@@ -259,11 +162,7 @@ module Watir
|
|
|
259
162
|
# Return an array with many of the properties, in a format to be used by the to_s method
|
|
260
163
|
def string_creator
|
|
261
164
|
n = []
|
|
262
|
-
n << "type:".ljust(TO_S_SIZE) + self.type
|
|
263
165
|
n << "id:".ljust(TO_S_SIZE) + self.id.to_s
|
|
264
|
-
n << "name:".ljust(TO_S_SIZE) + self.name.to_s
|
|
265
|
-
n << "value:".ljust(TO_S_SIZE) + self.value.to_s
|
|
266
|
-
n << "disabled:".ljust(TO_S_SIZE) + self.disabled.to_s
|
|
267
166
|
return n
|
|
268
167
|
end
|
|
269
168
|
|
|
@@ -344,11 +243,13 @@ module Watir
|
|
|
344
243
|
private :build_method
|
|
345
244
|
|
|
346
245
|
def generate_ruby_code(element, method_name, *args)
|
|
347
|
-
|
|
246
|
+
# needs to be done like this to avoid segfault on ruby 1.9.3
|
|
247
|
+
tag_name = @specifiers[:tag_name].join("' << '")
|
|
248
|
+
element = "#{self.class}.new(#{@page_container.attach_command}, :tag_name => Array.new << '#{tag_name}', :unique_number => #{unique_number})"
|
|
348
249
|
method = build_method(method_name, *args)
|
|
349
250
|
ruby_code = "$:.unshift(#{$LOAD_PATH.map {|p| "'#{p}'" }.join(").unshift(")});" <<
|
|
350
251
|
"require '#{File.expand_path(File.dirname(__FILE__))}/core';#{element}.#{method};"
|
|
351
|
-
|
|
252
|
+
ruby_code
|
|
352
253
|
end
|
|
353
254
|
|
|
354
255
|
private :generate_ruby_code
|
|
@@ -400,12 +301,8 @@ module Watir
|
|
|
400
301
|
def dispatch_event(event)
|
|
401
302
|
assert_exists
|
|
402
303
|
|
|
403
|
-
if IE.version_parts.first.to_i >= 9
|
|
404
|
-
|
|
405
|
-
ole_object.dispatchEvent(create_event(event))
|
|
406
|
-
else
|
|
407
|
-
ole_object.fireEvent(event)
|
|
408
|
-
end
|
|
304
|
+
if IE.version_parts.first.to_i >= 9 && container.page_container.document.documentMode.to_i >= 9
|
|
305
|
+
ole_object.dispatchEvent(create_event(event))
|
|
409
306
|
else
|
|
410
307
|
ole_object.fireEvent(event)
|
|
411
308
|
end
|
|
@@ -477,7 +374,12 @@ module Watir
|
|
|
477
374
|
# raises: UnknownObjectException if the object is not found
|
|
478
375
|
def enabled?
|
|
479
376
|
assert_exists
|
|
480
|
-
!disabled
|
|
377
|
+
!disabled?
|
|
378
|
+
end
|
|
379
|
+
|
|
380
|
+
def disabled?
|
|
381
|
+
assert_exists
|
|
382
|
+
false
|
|
481
383
|
end
|
|
482
384
|
|
|
483
385
|
# If any parent element isn't visible then we cannot write to the
|