operawatir 0.4.3.pre1-jruby → 0.5-jruby
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitmodules +1 -1
- data/CHANGES +230 -0
- data/Gemfile +4 -0
- data/Rakefile +3 -2
- data/VERSION +1 -1
- data/bin/desktopwatir +1 -1
- data/bin/operawatir +16 -4
- data/lib/operadriver/guava-r09.jar +0 -0
- data/lib/operadriver/operadriver-v0.7.2.jar +0 -0
- data/lib/operadriver/selenium-nodeps-20100909.jar +0 -0
- data/lib/operawatir.rb +10 -3
- data/lib/operawatir/actions.rb +111 -0
- data/lib/operawatir/browser.rb +24 -20
- data/lib/operawatir/clickable_item.rb +68 -0
- data/lib/operawatir/compat.rb +4 -4
- data/lib/operawatir/compat/collection.rb +1 -1
- data/lib/operawatir/compat/element.rb +1 -1
- data/lib/operawatir/compat/window.rb +4 -3
- data/lib/operawatir/desktop_browser.rb +299 -95
- data/lib/operawatir/desktop_common.rb +88 -23
- data/lib/operawatir/desktop_container.rb +103 -34
- data/lib/operawatir/desktop_enums.rb +4 -4
- data/lib/operawatir/desktop_exceptions.rb +2 -2
- data/lib/operawatir/desktop_helper.rb +31 -8
- data/lib/operawatir/element.rb +6 -2
- data/lib/operawatir/exceptions.rb +4 -4
- data/lib/operawatir/helper.rb +6 -6
- data/lib/operawatir/keys.rb +4 -4
- data/lib/operawatir/preferences.rb +126 -155
- data/lib/operawatir/quickwidgets.rb +3 -3
- data/lib/operawatir/quickwidgets/quick_addressfield.rb +12 -5
- data/lib/operawatir/quickwidgets/quick_button.rb +39 -53
- data/lib/operawatir/quickwidgets/quick_checkbox.rb +6 -6
- data/lib/operawatir/quickwidgets/quick_dialogtab.rb +5 -5
- data/lib/operawatir/quickwidgets/quick_dropdown.rb +28 -4
- data/lib/operawatir/quickwidgets/quick_dropdownitem.rb +46 -0
- data/lib/operawatir/quickwidgets/quick_editfield.rb +16 -13
- data/lib/operawatir/quickwidgets/quick_label.rb +1 -1
- data/lib/operawatir/quickwidgets/quick_menu.rb +155 -0
- data/lib/operawatir/quickwidgets/quick_menuitem.rb +387 -0
- data/lib/operawatir/quickwidgets/quick_searchfield.rb +7 -4
- data/lib/operawatir/quickwidgets/quick_tab.rb +23 -12
- data/lib/operawatir/quickwidgets/quick_thumbnail.rb +4 -4
- data/lib/operawatir/quickwidgets/quick_toolbar.rb +1 -1
- data/lib/operawatir/quickwidgets/quick_treeitem.rb +45 -29
- data/lib/operawatir/quickwidgets/quick_treeview.rb +2 -2
- data/lib/operawatir/quickwidgets/quick_widget.rb +267 -77
- data/lib/operawatir/quickwidgets/quick_window.rb +64 -38
- data/lib/operawatir/screenshot.rb +1 -1
- data/lib/operawatir/utils.rb +31 -0
- data/lib/operawatir/window.rb +1 -1
- data/operawatir.gemspec +38 -132
- data/spec/operawatir/core/actions_spec.rb +202 -0
- data/spec/operawatir/core/browser_spec.rb +8 -8
- data/spec/operawatir/core/element_spec.rb +11 -2
- data/spec/operawatir/core/keys_spec.rb +50 -2
- data/spec/operawatir/core/preferences_spec.rb +44 -128
- data/spec/operawatir/core/spatnav_spec.rb +16 -16
- data/spec/operawatir/core/utils_spec.rb +47 -0
- data/spec/operawatir/core/window_spec.rb +1 -1
- data/spec/operawatir/desktop/desktopbrowser_spec.rb +191 -22
- data/spec/operawatir/desktop/quickbutton_spec.rb +197 -164
- data/spec/operawatir/desktop/quickcheckbox_spec.rb +12 -12
- data/spec/operawatir/desktop/quickdialogtab_spec.rb +11 -11
- data/spec/operawatir/desktop/quickdropdown_spec.rb +25 -25
- data/spec/operawatir/desktop/quickeditfield_spec.rb +31 -31
- data/spec/operawatir/desktop/quickmenu_spec.rb +57 -0
- data/spec/operawatir/desktop/quickmenuitem_spec.rb +168 -0
- data/spec/operawatir/desktop/quicktab_spec.rb +26 -15
- data/spec/operawatir/desktop/quickthumbnail_spec.rb +18 -4
- data/spec/operawatir/desktop/quicktreeitem_spec.rb +72 -72
- data/spec/operawatir/desktop/quicktreeview_spec.rb +13 -13
- data/spec/operawatir/desktop/quickwidget_spec.rb +51 -13
- data/spec/operawatir/desktop/quickwindow_spec.rb +4 -0
- data/spec/operawatir/desktop/shared/shared.rb +25 -9
- data/spec/operawatir/fixtures/draggableLists.html +67 -0
- data/spec/operawatir/fixtures/formSelectionPage.html +46 -0
- data/spec/operawatir/fixtures/js/jquery-1.4.4.min.js +167 -0
- data/spec/operawatir/fixtures/js/jquery-ui-1.8.10.custom.min.js +782 -0
- data/spec/operawatir/fixtures/keys.html +40 -0
- data/spec/operawatir/fixtures/label_submit.html +5 -0
- data/spec/operawatir/fixtures/mouse.html +59 -0
- data/spec/operawatir/fixtures/simple.html +10 -0
- data/spec/operawatir/matchers.rb +20 -19
- data/spec/operawatir/watirspec_desktophelper.rb +51 -3
- data/spec/operawatir/watirspec_helper.rb +0 -2
- metadata +91 -220
- data/lib/operadriver/client-combined-nodeps.jar +0 -0
- data/lib/operadriver/webdriver-opera.jar +0 -0
- data/spec/watir3/browser_spec.rb +0 -190
- data/spec/watir3/clipboard_spec.rb +0 -64
- data/spec/watir3/collection_spec.rb +0 -387
- data/spec/watir3/element_spec.rb +0 -474
- data/spec/watir3/guards.rb +0 -39
- data/spec/watir3/keys_spec.rb +0 -204
- data/spec/watir3/server.rb +0 -91
- data/spec/watir3/watirspec_helper.rb +0 -62
- data/spec/watir3/window_spec.rb +0 -295
@@ -8,9 +8,12 @@ module OperaWatir
|
|
8
8
|
end
|
9
9
|
|
10
10
|
######################################################################
|
11
|
-
# Enters the search text into the search field, and waits for page
|
11
|
+
# Enters the search text into the search field, and waits for page
|
12
12
|
# loading to finish
|
13
13
|
#
|
14
|
+
# @example (RSpec)
|
15
|
+
# browser.quick_searchfield(:name, "tbs_MainSearch").search_with_text("old cars").should include "http://www.google"
|
16
|
+
#
|
14
17
|
# @param [String] url text to search with
|
15
18
|
#
|
16
19
|
# @return [String] text in the address field after the page is loaded
|
@@ -19,13 +22,13 @@ module OperaWatir
|
|
19
22
|
def search_with_text(search_text)
|
20
23
|
# Must focus field before calling enter_text...
|
21
24
|
focus_with_click
|
22
|
-
|
25
|
+
|
23
26
|
# Enters text in a field and then hits enter
|
24
27
|
t = enter_text_and_hit_enter(search_text)
|
25
28
|
|
26
|
-
# return text in addressfield (in same window as search field)
|
29
|
+
# return text in addressfield (in same window as search field)
|
27
30
|
driver.findWidgetByName(WIDGET_ENUM_MAP[:addressfield], @window_id, "tba_address_field", "Document Toolbar").getText
|
28
31
|
end
|
29
|
-
|
32
|
+
|
30
33
|
end
|
31
34
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module OperaWatir
|
2
2
|
class QuickTab < QuickButton
|
3
|
-
|
3
|
+
|
4
4
|
# @private
|
5
5
|
# Checks the type of the widget is correct
|
6
6
|
def correct_type?
|
7
7
|
@element.getType == WIDGET_ENUM_MAP[:tabbutton]
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
######################################################################
|
11
11
|
# Drag and drop this tab on tab tab_target
|
12
12
|
#
|
@@ -17,10 +17,10 @@ module OperaWatir
|
|
17
17
|
def move_with_drag(tab_target)
|
18
18
|
raise(Exceptions::UnknownObjectException) unless tab_target.type == :tabbutton
|
19
19
|
drag_and_drop_on(tab_target, :center)
|
20
|
-
|
20
|
+
|
21
21
|
sleep(0.1)
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
######################################################################
|
25
25
|
# Drag and drop this tab on another tab to add it to its tab group
|
26
26
|
#
|
@@ -32,34 +32,45 @@ module OperaWatir
|
|
32
32
|
# in which case it represents only 1 tab, itself
|
33
33
|
def group_with_drag(tab_target)
|
34
34
|
raise(Exceptions::UnknownObjectException) unless tab_target.type == :tabbutton
|
35
|
-
|
35
|
+
|
36
36
|
# Drop on the edge of a tab to make the grouping work
|
37
37
|
drag_and_drop_on(tab_target, :edge)
|
38
|
-
|
38
|
+
|
39
39
|
sleep(0.1)
|
40
|
-
|
40
|
+
|
41
41
|
#Get the number of tabs in the group
|
42
42
|
element(true).value
|
43
43
|
end
|
44
|
-
|
45
|
-
|
44
|
+
|
45
|
+
|
46
46
|
######################################################################
|
47
47
|
# Clicks the tab button, and waits for the tab to be shown / switches to the page
|
48
48
|
#
|
49
49
|
# @param [String] win_name name of the window that will be opened (Pass a blank string for any window)
|
50
50
|
#
|
51
|
-
# @return [int] Window ID of the window activated,
|
51
|
+
# @return [int] Window ID of the window activated,
|
52
52
|
# 0 if the window is already the active one,
|
53
|
-
# or if no window is active
|
53
|
+
# or if no window is active
|
54
54
|
#
|
55
55
|
# @raise [DesktopExceptions::WidgetNotVisibleException] if the tab button
|
56
56
|
# is not visible
|
57
57
|
#
|
58
58
|
def activate_tab_with_click
|
59
59
|
wait_start
|
60
|
-
click
|
60
|
+
click
|
61
61
|
wait_for_window_activated("Document Window")
|
62
62
|
end
|
63
63
|
|
64
|
+
###########################################################################
|
65
|
+
# Double clicks the tab and waits for it to be closed
|
66
|
+
#
|
67
|
+
# @return [int] Window ID of the window that was closed
|
68
|
+
#
|
69
|
+
def close_window_with_doubleclick
|
70
|
+
wait_start
|
71
|
+
click(:left, 2)
|
72
|
+
wait_for_window_close("Document Window")
|
73
|
+
end
|
74
|
+
|
64
75
|
end
|
65
76
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
module OperaWatir
|
2
2
|
class QuickThumbnail < QuickButton
|
3
|
-
|
3
|
+
|
4
4
|
# @private
|
5
5
|
# Checks the type of the widget is correct
|
6
6
|
def correct_type?
|
7
7
|
@element.getType == WIDGET_ENUM_MAP[:thumbnail]
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
######################################################################
|
11
11
|
# Drag and drop this speeddial onto the speed dial tab_target
|
12
12
|
#
|
@@ -18,9 +18,9 @@ module OperaWatir
|
|
18
18
|
def move_with_drag(tab_target)
|
19
19
|
raise(Exceptions::UnknownObjectException) unless tab_target.type == :thumbnail
|
20
20
|
drag_and_drop_on(tab_target, :center)
|
21
|
-
|
21
|
+
|
22
22
|
sleep(0.1)
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
end
|
26
26
|
end
|
@@ -10,7 +10,7 @@ module OperaWatir
|
|
10
10
|
######################################################################
|
11
11
|
# Set focus to the tree item by clicking on it
|
12
12
|
#
|
13
|
-
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeview
|
13
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeview
|
14
14
|
# the treeitem is in is not visible
|
15
15
|
# @raise [DesktopExceptions::WidgetDisabledException] if the treeitem
|
16
16
|
# is disabled
|
@@ -20,24 +20,24 @@ module OperaWatir
|
|
20
20
|
scroll_item_into_view unless visible?
|
21
21
|
super
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
######################################################################
|
25
25
|
# Expands a tree item when it is clicked
|
26
26
|
#
|
27
|
-
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
27
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
28
28
|
# is not visible
|
29
29
|
#
|
30
30
|
def expand_with_click
|
31
31
|
# For now there is no difference to focusing
|
32
32
|
focus_with_click
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
alias_method :collapse_with_click, :expand_with_click
|
36
36
|
|
37
37
|
######################################################################
|
38
38
|
# Expands a tree item when it is double clicked
|
39
39
|
#
|
40
|
-
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
40
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
41
41
|
# is not visible
|
42
42
|
#
|
43
43
|
def expand_with_double_click
|
@@ -46,9 +46,9 @@ module OperaWatir
|
|
46
46
|
# No event yet so just cheat and sleep
|
47
47
|
sleep(0.1);
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
alias_method :collapse_with_double_click, :expand_with_double_click
|
51
|
-
|
51
|
+
|
52
52
|
######################################################################
|
53
53
|
# Presses a key including modifiers
|
54
54
|
#
|
@@ -70,7 +70,7 @@ module OperaWatir
|
|
70
70
|
key_press_direct(key, *opts)
|
71
71
|
sleep(0.1)
|
72
72
|
end
|
73
|
-
|
73
|
+
|
74
74
|
######################################################################
|
75
75
|
# Checks if the treeitem is selected
|
76
76
|
#
|
@@ -81,24 +81,24 @@ module OperaWatir
|
|
81
81
|
def selected?
|
82
82
|
element.isSelected
|
83
83
|
end
|
84
|
-
|
85
|
-
|
84
|
+
|
85
|
+
|
86
86
|
######################################################################
|
87
|
-
# Switches to the tree view tab by clicking on it (e.g. on the
|
88
|
-
# Advanced page of the preferences dialog)
|
87
|
+
# Switches to the tree view tab by clicking on it (e.g. on the
|
88
|
+
# Advanced page of the preferences dialog)
|
89
89
|
#
|
90
90
|
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
91
91
|
# is not visible
|
92
92
|
#
|
93
93
|
def activate_tab_with_click
|
94
94
|
click
|
95
|
-
|
95
|
+
|
96
96
|
# No event yet so just cheat and sleep
|
97
97
|
sleep(0.1);
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
######################################################################
|
101
|
-
# Double clicks the tree item, and waits for the window with
|
101
|
+
# Double clicks the tree item, and waits for the window with
|
102
102
|
# window name win_name to be shown
|
103
103
|
#
|
104
104
|
# @param [String] win_name name of the window that will be opened (Pass a blank string for any window)
|
@@ -109,15 +109,31 @@ module OperaWatir
|
|
109
109
|
# is not visible
|
110
110
|
#
|
111
111
|
def open_window_with_double_click(win_name)
|
112
|
-
|
113
|
-
click(:left, 2)
|
114
|
-
wait_for_window_shown(win_name)
|
112
|
+
open_window_with_click_internal(win_name, 2)
|
115
113
|
end
|
116
|
-
|
114
|
+
|
117
115
|
alias_method :open_dialog_with_double_click, :open_window_with_double_click
|
118
116
|
|
117
|
+
|
118
|
+
######################################################################
|
119
|
+
# Clicks the tree item, and waits for the window with
|
120
|
+
# window name win_name to be shown
|
121
|
+
#
|
122
|
+
# @param [String] win_name name of the window that will be opened (Pass a blank string for any window)
|
123
|
+
#
|
124
|
+
# @return [int] Window ID of the window shown or 0 if no window is shown
|
125
|
+
#
|
126
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
127
|
+
# is not visible
|
128
|
+
#
|
129
|
+
def open_window_with_click(win_name)
|
130
|
+
open_window_with_click_internal(win_name, 1)
|
131
|
+
end
|
132
|
+
|
133
|
+
alias_method :open_dialog_with_click, :open_window_with_click
|
134
|
+
|
119
135
|
######################################################################
|
120
|
-
# Double clicks the tree item, and waits for the window with
|
136
|
+
# Double clicks the tree item, and waits for the window with
|
121
137
|
# window name win_name to be loaded with the url of the treeitem
|
122
138
|
#
|
123
139
|
# @param [String] win_name name of the window that will be loaded (Pass a blank string for any window)
|
@@ -132,21 +148,21 @@ module OperaWatir
|
|
132
148
|
click(:left, 2)
|
133
149
|
wait_for_window_loaded(win_name)
|
134
150
|
end
|
135
|
-
|
151
|
+
|
136
152
|
|
137
153
|
private
|
138
154
|
# @private
|
139
155
|
# Scrolls the item into view if required
|
140
156
|
def scroll_item_into_view
|
141
|
-
|
157
|
+
|
142
158
|
# Make sure we have a window id
|
143
159
|
win_id = window_id >= 0 ? window_id : driver.getActiveQuickWindowID()
|
144
|
-
|
160
|
+
|
145
161
|
# Filter only treeitems in parent_treeview
|
146
162
|
treeitems = driver.getQuickWidgetList(win_id).select do |wdg|
|
147
163
|
wdg.getType == QuickWidget::WIDGET_ENUM_MAP[:treeitem] && wdg.getParentName == parent_name
|
148
164
|
end
|
149
|
-
|
165
|
+
|
150
166
|
# Get the first visible item
|
151
167
|
lowest = treeitems.find { | item| item.visible? } #This will always be a parent item, not a child
|
152
168
|
# Assume list is ordered? => lower row means scroll up, higher row means scroll down
|
@@ -156,10 +172,10 @@ private
|
|
156
172
|
qw = QuickTreeItem.new(self,lowest)
|
157
173
|
qw.focus_with_click
|
158
174
|
key_press_direct(key)
|
159
|
-
|
175
|
+
|
160
176
|
#First scroll
|
161
177
|
key_press_direct(key)
|
162
|
-
|
178
|
+
|
163
179
|
visible_treeitems = driver.getQuickWidgetList(win_id).select do |wdg|
|
164
180
|
wdg.getType == QuickWidget::WIDGET_ENUM_MAP[:treeitem] && wdg.getParentName == parent_name && wdg.visible?
|
165
181
|
end
|
@@ -167,12 +183,12 @@ private
|
|
167
183
|
# Stop scrolling if we have run through the whole list, the item is then a child and won't get visible
|
168
184
|
max_times = treeitems.length / visible_treeitems.length + 1
|
169
185
|
until element(true).visible? || max_times < 0
|
170
|
-
key_press_direct(key)
|
186
|
+
key_press_direct(key)
|
171
187
|
max_times-=1
|
172
188
|
end
|
173
|
-
|
189
|
+
|
174
190
|
end
|
175
191
|
end
|
176
|
-
|
192
|
+
|
177
193
|
end
|
178
194
|
|
@@ -3,13 +3,16 @@ module OperaWatir
|
|
3
3
|
include DesktopCommon
|
4
4
|
include DesktopContainer
|
5
5
|
include Deprecated
|
6
|
-
|
6
|
+
|
7
|
+
ConditionTimeout = 10.0
|
8
|
+
|
7
9
|
# @private
|
8
10
|
# window_id is set if constructor is called on a (parent) window
|
9
11
|
# location is set is this is called on a (parent) widget
|
10
12
|
def initialize(container, method, selector=nil, location=nil, window_id=-1, type=nil)
|
13
|
+
|
11
14
|
@container = container
|
12
|
-
|
15
|
+
|
13
16
|
if method.is_a? Java::ComOperaCoreSystems::QuickWidget
|
14
17
|
@elm = method
|
15
18
|
@type = WIDGET_ENUM_MAP.invert[method.getType]
|
@@ -21,9 +24,9 @@ module OperaWatir
|
|
21
24
|
@window_id = window_id
|
22
25
|
end
|
23
26
|
end
|
24
|
-
|
27
|
+
|
25
28
|
#######################################################################
|
26
|
-
#
|
29
|
+
#
|
27
30
|
# Hovers widget and waits for window to be shown
|
28
31
|
#
|
29
32
|
#
|
@@ -32,7 +35,25 @@ module OperaWatir
|
|
32
35
|
element.hover
|
33
36
|
wait_for_window_shown(win_name)
|
34
37
|
end
|
35
|
-
|
38
|
+
|
39
|
+
######################################################################
|
40
|
+
# Rightclicks the widget, and waits for the menu with name
|
41
|
+
# menu_name to be shown
|
42
|
+
#
|
43
|
+
# @param [String] menu name (from standard_menu.ini)
|
44
|
+
#
|
45
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the button
|
46
|
+
# is not visible
|
47
|
+
#
|
48
|
+
# @return [String] name of menu opened if it matches parameter menu_name
|
49
|
+
# otherwise empty string
|
50
|
+
#
|
51
|
+
def open_menu_with_rightclick(menu_name)
|
52
|
+
wait_start
|
53
|
+
click(:right)
|
54
|
+
wait_for_menu_shown(menu_name)
|
55
|
+
end
|
56
|
+
|
36
57
|
######################################################################
|
37
58
|
# Checks whether a widget exists or not
|
38
59
|
#
|
@@ -44,26 +65,26 @@ module OperaWatir
|
|
44
65
|
false
|
45
66
|
end
|
46
67
|
alias_method :exists?, :exist?
|
47
|
-
|
68
|
+
|
48
69
|
######################################################################
|
49
70
|
# Checks if a widget is enabled or not
|
50
71
|
#
|
51
72
|
# @return [Boolean] true if enabled otherwise false
|
52
73
|
#
|
53
74
|
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
54
|
-
# using the specified method
|
75
|
+
# using the specified method
|
55
76
|
#
|
56
77
|
def enabled?
|
57
78
|
element.isEnabled
|
58
79
|
end
|
59
|
-
|
80
|
+
|
60
81
|
######################################################################
|
61
82
|
# Checks if a widget is visible or not
|
62
83
|
#
|
63
84
|
# @return [Boolean] true if visible otherwise false
|
64
85
|
#
|
65
86
|
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
66
|
-
# using the specified method
|
87
|
+
# using the specified method
|
67
88
|
#
|
68
89
|
def visible?
|
69
90
|
element.isVisible
|
@@ -78,24 +99,24 @@ module OperaWatir
|
|
78
99
|
# @return [String] text of the widget
|
79
100
|
#
|
80
101
|
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
81
|
-
# using the specified method
|
102
|
+
# using the specified method
|
82
103
|
#
|
83
104
|
def text
|
84
105
|
element.getText
|
85
106
|
end
|
86
|
-
|
107
|
+
|
87
108
|
######################################################################
|
88
109
|
# Gets the type of a widget
|
89
110
|
#
|
90
111
|
# @return [Symbol] type of the widget (e.g. :dropdown, :button)
|
91
112
|
#
|
92
|
-
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
113
|
+
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
93
114
|
# using the specified method
|
94
|
-
#
|
115
|
+
#
|
95
116
|
def type
|
96
117
|
WIDGET_ENUM_MAP.invert[element.getType]
|
97
118
|
end
|
98
|
-
|
119
|
+
|
99
120
|
######################################################################
|
100
121
|
# Gets the name of the widget (as it appears in dialog.ini or code)
|
101
122
|
#
|
@@ -107,7 +128,7 @@ module OperaWatir
|
|
107
128
|
def name
|
108
129
|
element.getName
|
109
130
|
end
|
110
|
-
|
131
|
+
|
111
132
|
######################################################################
|
112
133
|
# Gets a string representation of the widget
|
113
134
|
#
|
@@ -127,7 +148,7 @@ module OperaWatir
|
|
127
148
|
#
|
128
149
|
# @param [String] string_id String ID to use to load the string from the current
|
129
150
|
# language file (e.g. "D_NEW_PREFERENCES_GENERAL")
|
130
|
-
#
|
151
|
+
#
|
131
152
|
# @return [Boolean] true if the text matches, otherwise false
|
132
153
|
#
|
133
154
|
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
@@ -140,19 +161,38 @@ module OperaWatir
|
|
140
161
|
res = /#{text}/ =~ element.getText()
|
141
162
|
res == nil ? false: true
|
142
163
|
else
|
143
|
-
element.verifyText(string_id)
|
164
|
+
element.verifyText(string_id)
|
144
165
|
end
|
145
166
|
end
|
146
|
-
|
167
|
+
|
147
168
|
alias_method :has_ui_string?, :verify_text
|
148
|
-
|
169
|
+
|
170
|
+
######################################################################
|
171
|
+
# Checks that the text in the widget matches the text as loaded
|
172
|
+
# from the current language file in Opera using the string_id
|
173
|
+
# (Strips &'s from the string before comparing)
|
174
|
+
#
|
175
|
+
# @param [String] string_id String ID to use to load the string from the current
|
176
|
+
# language file (e.g. "D_NEW_PREFERENCES_GENERAL")
|
177
|
+
#
|
178
|
+
# @return [Boolean] true if the text matches, otherwise false
|
179
|
+
#
|
180
|
+
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
181
|
+
# using the specified method
|
182
|
+
#
|
183
|
+
def verify_text(string_id, *params)
|
184
|
+
text = driver.getString(string_id, true)
|
185
|
+
verify_realtext(text, *params)
|
186
|
+
end
|
187
|
+
|
188
|
+
|
149
189
|
######################################################################
|
150
190
|
# Checks that the text in the widget includes the text as loaded
|
151
191
|
# from the current language file in Opera using the string_id
|
152
192
|
#
|
153
193
|
# @param [String] string_id String ID to use to load the string from the current
|
154
194
|
# language file (e.g. "D_NEW_PREFERENCES_GENERAL")
|
155
|
-
#
|
195
|
+
#
|
156
196
|
# @return [Boolean] true if the text is included, otherwise false
|
157
197
|
#
|
158
198
|
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
@@ -161,7 +201,7 @@ module OperaWatir
|
|
161
201
|
def verify_includes_text(string_id)
|
162
202
|
element.verifyContainsText(string_id)
|
163
203
|
end
|
164
|
-
|
204
|
+
|
165
205
|
alias_method :includes_text?, :verify_includes_text
|
166
206
|
deprecated :verify_includes_text
|
167
207
|
deprecated :includes_text?
|
@@ -197,10 +237,15 @@ module OperaWatir
|
|
197
237
|
# @return position for elements that have a position, else false
|
198
238
|
#
|
199
239
|
def position
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
240
|
+
case type
|
241
|
+
when :treeitem then [row, col]
|
242
|
+
when :tabbutton, :button then col
|
243
|
+
else false
|
244
|
+
end
|
245
|
+
#return [row, col] if type == :treeitem
|
246
|
+
#return col if type == :tabbutton
|
247
|
+
#return col if type == :button
|
248
|
+
#false
|
204
249
|
end
|
205
250
|
|
206
251
|
########################################################################
|
@@ -228,13 +273,13 @@ module OperaWatir
|
|
228
273
|
def y
|
229
274
|
element.getRect().y
|
230
275
|
end
|
231
|
-
|
276
|
+
|
232
277
|
######################################################################
|
233
278
|
# Prints out all of the internal information about the widget. Used
|
234
279
|
# to discover the names of widgets and windows to use in the tests
|
235
280
|
#
|
236
281
|
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
237
|
-
# using the specified method
|
282
|
+
# using the specified method
|
238
283
|
#@private
|
239
284
|
def print_widget_info
|
240
285
|
puts widget_info_string
|
@@ -245,10 +290,10 @@ module OperaWatir
|
|
245
290
|
# to discover the names of widgets and windows to use in the tests
|
246
291
|
#
|
247
292
|
# @raise [Exceptions::UnknownObjectException] if the widget cannot be found
|
248
|
-
# using the specified method
|
293
|
+
# using the specified method
|
249
294
|
#
|
250
295
|
def widget_info_string
|
251
|
-
" Name: " + name +
|
296
|
+
" Name: " + name +
|
252
297
|
"\n Text: " + text +
|
253
298
|
"\n Type: " + type.to_s +
|
254
299
|
"\n Parent: " + element.getParentName() +
|
@@ -259,31 +304,132 @@ module OperaWatir
|
|
259
304
|
"\n Ref: row=" + element.getRow().to_s + ", col=" + element.getColumn().to_s +
|
260
305
|
"\nselected: " + element.isSelected().to_s + "\n"
|
261
306
|
end
|
262
|
-
|
307
|
+
|
263
308
|
# @private
|
264
309
|
def driver
|
265
310
|
@container.driver
|
266
311
|
end
|
267
|
-
|
312
|
+
|
268
313
|
# Gets parent widget name
|
269
314
|
def parent_name
|
270
315
|
element.getParentName()
|
271
316
|
end
|
272
|
-
|
317
|
+
|
273
318
|
#################################################################
|
274
319
|
# Focus a widget with a click
|
275
320
|
#
|
276
321
|
def focus_with_click
|
277
322
|
click
|
278
323
|
# No event yet so just cheat and sleep
|
279
|
-
sleep(0.1)
|
324
|
+
sleep(0.1)
|
280
325
|
end
|
281
|
-
|
282
|
-
|
326
|
+
|
327
|
+
#################################################################
|
328
|
+
# Focus a widget by moving the mouse over it
|
329
|
+
#
|
330
|
+
def focus_with_hover
|
331
|
+
element.hover
|
332
|
+
#No event yet so just cheat and sleep
|
333
|
+
sleep(0.1)
|
334
|
+
end
|
335
|
+
|
336
|
+
###############################################################
|
337
|
+
#
|
338
|
+
# double_click_with_condition { block } → res
|
339
|
+
#
|
340
|
+
# Doubleclicks widget and waits until block evaluates to true or timeout is hit
|
341
|
+
#
|
342
|
+
# @return value of block, or false if no block provided
|
343
|
+
#
|
344
|
+
def double_click_with_condition(&condition)
|
345
|
+
click_with_condition_internal(:left, 2, &condition)
|
346
|
+
end
|
347
|
+
|
348
|
+
###############################################################
|
349
|
+
#
|
350
|
+
# right_click_with_condition { block } → res
|
351
|
+
#
|
352
|
+
# Rightclicks widget and waits until block evaluates to true or timeout is hit
|
353
|
+
#
|
354
|
+
# @return value of block, or false if no block provided
|
355
|
+
#
|
356
|
+
def right_click_with_condition(&condition)
|
357
|
+
click_with_condition_internal(:right, 1, &condition)
|
358
|
+
end
|
359
|
+
|
360
|
+
##############################################################
|
361
|
+
#
|
362
|
+
# middle_click_with_condition { block } → res
|
363
|
+
#
|
364
|
+
# Middleclicks widget and waits until block evaluates to true or timeout is hit
|
365
|
+
#
|
366
|
+
# @return value of block, or false if no block provided
|
367
|
+
#
|
368
|
+
def middle_click_with_condition(&condition)
|
369
|
+
click_with_condition_internal(:middle, 1, &condition)
|
370
|
+
end
|
371
|
+
|
372
|
+
###############################################################
|
373
|
+
#
|
374
|
+
# click_with_condition { block } → res
|
375
|
+
#
|
376
|
+
# @example
|
377
|
+
# browser.quick_button(:name, "[buttonname]").click_with_condition {
|
378
|
+
# browser.quick_treeview(:name, "[name]").quick_treeitems.length == 4 }.should be_true
|
379
|
+
#
|
380
|
+
# Clicks widget and waits until block evaluates to true or timeout is hit
|
381
|
+
#
|
382
|
+
# @return value of block, or false if no block provided
|
383
|
+
#
|
384
|
+
def click_with_condition(&condition)
|
385
|
+
click_with_condition_internal(:left, 1, &condition)
|
386
|
+
end
|
387
|
+
|
388
|
+
|
389
|
+
#######################################################
|
390
|
+
#
|
391
|
+
#
|
392
|
+
#
|
283
393
|
def value
|
284
394
|
return element.getValue
|
285
395
|
end
|
286
|
-
|
396
|
+
|
397
|
+
#########################################################
|
398
|
+
#
|
399
|
+
# @return all widgets inside this widget
|
400
|
+
#
|
401
|
+
# @example
|
402
|
+
# browser.quick_treeview(:name, "Mail View").quick_widgets
|
403
|
+
#
|
404
|
+
# @note
|
405
|
+
# you can also specify the widgets by type to retrieve only
|
406
|
+
# a specific type of widgets
|
407
|
+
#
|
408
|
+
# @example
|
409
|
+
# browser.quick_treeview(:name, "Mail View").quick_treeitems
|
410
|
+
#
|
411
|
+
#
|
412
|
+
def quick_widgets
|
413
|
+
widgets(window_id).select { | w | w.parent_name == name }
|
414
|
+
end
|
415
|
+
|
416
|
+
def quick_tabs
|
417
|
+
quick_tabbuttons
|
418
|
+
end
|
419
|
+
|
420
|
+
WIDGET_ENUM_MAP.keys.each do |widget_type|
|
421
|
+
my_type = "quick_" << widget_type.to_s
|
422
|
+
type = my_type
|
423
|
+
if my_type == "quick_search" || my_type == "quick_checkbox"
|
424
|
+
my_type << "es"
|
425
|
+
else
|
426
|
+
my_type << "s"
|
427
|
+
end
|
428
|
+
define_method(my_type.to_sym) do #|win|
|
429
|
+
quick_widgets.select { |w| w.type == widget_type and w.parent_name == name }
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
287
433
|
protected
|
288
434
|
#@private
|
289
435
|
# Return the element
|
@@ -291,14 +437,83 @@ protected
|
|
291
437
|
if (@elm == nil || refresh == true)
|
292
438
|
@elm = find
|
293
439
|
end
|
294
|
-
|
295
|
-
raise(Exceptions::UnknownObjectException, "Element #{@selector} not found using #{@method}") unless @elm
|
440
|
+
|
441
|
+
raise(Exceptions::UnknownObjectException, "Element #{@selector} not found using #{@method}") unless @elm
|
296
442
|
@elm
|
297
443
|
end
|
298
444
|
|
299
|
-
|
445
|
+
|
300
446
|
private
|
301
|
-
|
447
|
+
|
448
|
+
def open_window_with_click_internal(win_name, num_clicks)
|
449
|
+
wait_start
|
450
|
+
click(:left, num_clicks)
|
451
|
+
wait_for_window_shown(win_name)
|
452
|
+
end
|
453
|
+
|
454
|
+
def click_with_condition_internal(button = :left, times = 1, &blk)
|
455
|
+
return false unless block_given?
|
456
|
+
|
457
|
+
click(button, times)
|
458
|
+
|
459
|
+
start = Time.now
|
460
|
+
until res = yield rescue false do
|
461
|
+
if Time.now - start > ConditionTimeout
|
462
|
+
return false
|
463
|
+
end
|
464
|
+
sleep 0.1
|
465
|
+
|
466
|
+
end
|
467
|
+
res
|
468
|
+
end
|
469
|
+
|
470
|
+
# Right click a widget
|
471
|
+
def right_click
|
472
|
+
click(:right, 1)
|
473
|
+
end
|
474
|
+
|
475
|
+
# Click widget
|
476
|
+
def click(button = :left, times = 1, *opts)
|
477
|
+
|
478
|
+
#raise DesktopExceptions::WidgetDisabledException, "Element #{@selector} is disabled" unless enabled?
|
479
|
+
|
480
|
+
#Some buttons etc. aren't visible until hovering them
|
481
|
+
if (visible? == false and type != :dialogtab)
|
482
|
+
element.hover
|
483
|
+
element(true)
|
484
|
+
end
|
485
|
+
|
486
|
+
# Dialog tabs are always visible even if the page they are connected to isn't
|
487
|
+
if visible? == true or type == :dialogtab
|
488
|
+
button = DesktopEnums::MOUSEBUTTON_ENUM_MAP[button]
|
489
|
+
list = Java::JavaUtil::ArrayList.new
|
490
|
+
opts.each { |mod| list << DesktopEnums::KEYMODIFIER_ENUM_MAP[mod] }
|
491
|
+
element.click(button, times, list)
|
492
|
+
else
|
493
|
+
raise(DesktopExceptions::WidgetNotVisibleException, "Widget #{name.length > 0 ? name : text} not visible")
|
494
|
+
end
|
495
|
+
end
|
496
|
+
|
497
|
+
def verify_realtext(text, *params)
|
498
|
+
if text.include? "%1"
|
499
|
+
result = text.scan(/%\d/)
|
500
|
+
if (params.length == result.length)
|
501
|
+
result.length.times do |time|
|
502
|
+
number = time+1
|
503
|
+
p = params[time]
|
504
|
+
text.gsub!("%#{number}", params[time])
|
505
|
+
end
|
506
|
+
end
|
507
|
+
text == element.getText()
|
508
|
+
else
|
509
|
+
params.each do |param|
|
510
|
+
text.gsub!(/%[csduoxefg0-9]/, param)
|
511
|
+
end
|
512
|
+
text == element.getText()
|
513
|
+
end
|
514
|
+
end
|
515
|
+
|
516
|
+
|
302
517
|
def drag_and_drop_on(other, drop_pos)
|
303
518
|
element.dragAndDropOn(other.element, DROPPOSITION_ENUM_MAP[drop_pos])
|
304
519
|
end
|
@@ -308,7 +523,7 @@ private
|
|
308
523
|
if @selector == nil && @elm != nil
|
309
524
|
set_selector
|
310
525
|
end
|
311
|
-
|
526
|
+
|
312
527
|
#FIXME: Shouldn't this always be name if present, then text if present, else pos?
|
313
528
|
case @method
|
314
529
|
when :name
|
@@ -323,7 +538,7 @@ private
|
|
323
538
|
end
|
324
539
|
end
|
325
540
|
|
326
|
-
# Get row
|
541
|
+
# Get row
|
327
542
|
def row
|
328
543
|
element.getRow()
|
329
544
|
end
|
@@ -332,46 +547,21 @@ private
|
|
332
547
|
def col
|
333
548
|
element.getColumn()
|
334
549
|
end
|
335
|
-
|
550
|
+
|
336
551
|
# Gets the window id to use for the search
|
337
552
|
def window_id
|
338
553
|
# Need to pass on the current setting of @window_id to make
|
339
554
|
# nesting of quick widgets work
|
340
555
|
@window_id
|
341
556
|
end
|
342
|
-
|
343
|
-
# Click widget
|
344
|
-
def click(button = :left, times = 1, *opts)
|
345
|
-
raise DesktopExceptions::WidgetDisabledException, "Element #{@selector} is disabled" unless enabled?
|
346
|
-
|
347
|
-
#Some buttons etc. aren't visible until hovering them
|
348
|
-
if (visible? == false and type != :dialogtab)
|
349
|
-
element.hover
|
350
|
-
element(true)
|
351
|
-
end
|
352
|
-
|
353
|
-
# Dialog tabs are always visible even if the page they are connected to isn't
|
354
|
-
if visible? == true or type == :dialogtab
|
355
|
-
button = DesktopEnums::MOUSEBUTTON_ENUM_MAP[button]
|
356
|
-
list = Java::JavaUtil::ArrayList.new
|
357
|
-
opts.each { |mod| list << DesktopEnums::KEYMODIFIER_ENUM_MAP[mod] }
|
358
|
-
element.click(button, times, list)
|
359
|
-
else
|
360
|
-
raise(DesktopExceptions::WidgetNotVisibleException, "Widget #{name.length > 0 ? name : text} not visible")
|
361
|
-
end
|
362
|
-
end
|
363
557
|
|
364
|
-
|
365
|
-
def right_click
|
366
|
-
click(:right, 1)
|
367
|
-
end
|
368
|
-
|
558
|
+
|
369
559
|
# double click widget
|
370
560
|
def double_click
|
371
|
-
click(:left, 2)
|
561
|
+
click(:left, 2)
|
372
562
|
end
|
373
563
|
|
374
|
-
|
564
|
+
|
375
565
|
def set_selector
|
376
566
|
if @elm.name.length > 0
|
377
567
|
@method = :name
|
@@ -382,18 +572,18 @@ private
|
|
382
572
|
elsif @elm.type == :treeitem
|
383
573
|
@method = :pos
|
384
574
|
@selector = [@elm.row, @elm.col]
|
385
|
-
=begin
|
575
|
+
=begin
|
386
576
|
# tabbuttons now specified by generated name
|
387
577
|
elsif @elm.type == :tabbutton
|
388
578
|
@method = :pos
|
389
579
|
@selector = @elm.col
|
390
|
-
=end
|
580
|
+
=end
|
391
581
|
end
|
392
582
|
@location = element.getParentName()
|
393
583
|
@window_id = -1
|
394
584
|
end
|
395
|
-
|
396
|
-
# Finds the element on the page.
|
585
|
+
|
586
|
+
# Finds the element on the page.
|
397
587
|
def find
|
398
588
|
#If @method set and we do new find because of refresh, we need to get @selector first
|
399
589
|
#Have the java object because the construct was done on it
|
@@ -426,11 +616,11 @@ private
|
|
426
616
|
else
|
427
617
|
@element = driver.findWidgetByPosition(WIDGET_ENUM_MAP[@type], @window_id, @selector[0], @selector[1])
|
428
618
|
end
|
429
|
-
|
619
|
+
end
|
430
620
|
if @window_id < 0 && @element != nil
|
431
621
|
@window_id = @element.getParentWindowId
|
432
622
|
end
|
433
|
-
raise(Exceptions::UnknownObjectException, "Element #{@selector} not found using #{@method}") unless @element
|
623
|
+
raise(Exceptions::UnknownObjectException, "Element #{@selector} not found using #{@method}") unless @element
|
434
624
|
raise(Exceptions::UnknownObjectException, "Element #{@selector} has wrong type #{@element.getType}") unless correct_type?
|
435
625
|
@element
|
436
626
|
end
|