operawatir 0.3-jruby → 0.3.2-jruby
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/Gemfile +6 -2
- data/LICENSE +1 -1
- data/Rakefile +7 -8
- data/VERSION +1 -1
- data/bin/desktopwatir +3 -0
- data/bin/operawatir +2 -2
- data/lib/operadriver/webdriver-opera.jar +0 -0
- data/lib/operawatir.rb +14 -8
- data/lib/operawatir/browser.rb +49 -38
- data/lib/operawatir/compat/collection.rb +6 -0
- data/lib/operawatir/compat/element.rb +5 -2
- data/lib/operawatir/compat/element_finders.rb +19 -0
- data/lib/operawatir/desktop-waiter.rb +144 -0
- data/lib/operawatir/desktop_browser.rb +506 -0
- data/lib/operawatir/desktop_common.rb +111 -0
- data/lib/operawatir/desktop_container.rb +252 -0
- data/lib/operawatir/desktop_enums.rb +42 -0
- data/lib/operawatir/desktop_exceptions.rb +16 -0
- data/lib/operawatir/element.rb +6 -6
- data/lib/operawatir/exceptions.rb +3 -0
- data/lib/operawatir/keys.rb +116 -0
- data/lib/operawatir/platform.rb +59 -0
- data/lib/operawatir/quickwidgets.rb +3 -0
- data/lib/operawatir/quickwidgets/quick_addressfield.rb +23 -0
- data/lib/operawatir/quickwidgets/quick_button.rb +151 -0
- data/lib/operawatir/quickwidgets/quick_checkbox.rb +58 -0
- data/lib/operawatir/quickwidgets/quick_dialogtab.rb +23 -0
- data/lib/operawatir/quickwidgets/quick_dropdown.rb +27 -0
- data/lib/operawatir/quickwidgets/quick_editfield.rb +115 -0
- data/lib/operawatir/quickwidgets/quick_label.rb +12 -0
- data/lib/operawatir/quickwidgets/quick_radiobutton.rb +11 -0
- data/lib/operawatir/quickwidgets/quick_searchfield.rb +25 -0
- data/lib/operawatir/quickwidgets/quick_tab.rb +66 -0
- data/lib/operawatir/quickwidgets/quick_thumbnail.rb +26 -0
- data/lib/operawatir/quickwidgets/quick_toolbar.rb +11 -0
- data/lib/operawatir/quickwidgets/quick_treeitem.rb +157 -0
- data/lib/operawatir/quickwidgets/quick_treeview.rb +27 -0
- data/lib/operawatir/quickwidgets/quick_widget.rb +369 -0
- data/lib/operawatir/quickwidgets/quick_window.rb +150 -0
- data/lib/operawatir/selector.rb +1 -1
- data/lib/operawatir/version.rb +0 -1
- data/lib/operawatir/window.rb +9 -0
- data/operawatir.gemspec +382 -0
- data/spec/new_watirspec/browser_spec.rb +279 -0
- data/spec/new_watirspec/clipboard_spec.rb +79 -0
- data/spec/new_watirspec/collection_spec.rb +387 -0
- data/spec/new_watirspec/element_spec.rb +456 -0
- data/spec/new_watirspec/guards.rb +39 -0
- data/spec/new_watirspec/keys_spec.rb +206 -0
- data/spec/new_watirspec/server.rb +91 -0
- data/spec/new_watirspec/watirspec_helper.rb +62 -0
- data/spec/new_watirspec/window_spec.rb +370 -0
- data/utils/launchers/launcher-mac +0 -0
- metadata +191 -28
- data/.gitmodules +0 -3
@@ -0,0 +1,27 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
class QuickDropdown < QuickEditField #QuickWidget
|
3
|
+
|
4
|
+
# @private
|
5
|
+
# Checks the type of the widget is correct
|
6
|
+
def correct_type?
|
7
|
+
@element.getType == WIDGET_ENUM_MAP[:dropdown]
|
8
|
+
end
|
9
|
+
|
10
|
+
######################################################################
|
11
|
+
# Checks if the item selected in the dropdown matches the text loaded
|
12
|
+
# from Opera using the string_id
|
13
|
+
#
|
14
|
+
# @param [String] string_id String ID to use to load the string from the current
|
15
|
+
# language file (e.g. "D_NEW_PREFERENCES_GENERAL")
|
16
|
+
#
|
17
|
+
# @return [Boolean] true if the dropdown has the item with the
|
18
|
+
# string_id selected, otherwise false
|
19
|
+
#
|
20
|
+
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
21
|
+
# using the specified method
|
22
|
+
def selected?(string_id)
|
23
|
+
element.isSelected(string_id)
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
class QuickEditField < QuickWidget
|
3
|
+
|
4
|
+
# @private
|
5
|
+
# Checks the type of the widget is correct
|
6
|
+
def correct_type?
|
7
|
+
@element.getType == WIDGET_ENUM_MAP[:editfield]
|
8
|
+
end
|
9
|
+
|
10
|
+
######################################################################
|
11
|
+
# Set focus to the edit field by clicking on it
|
12
|
+
#
|
13
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the editfield
|
14
|
+
# is not visible
|
15
|
+
#
|
16
|
+
def focus_with_click
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
######################################################################
|
21
|
+
# Types a text string into the edit field
|
22
|
+
#
|
23
|
+
# @note Only chanracters that appear on the keyboard that is currently
|
24
|
+
# selected can be typed, and the edit field must have focus.
|
25
|
+
#
|
26
|
+
# @param [String] text text string to type in
|
27
|
+
#
|
28
|
+
# @return [String] contents of the edit field after typing has completed
|
29
|
+
#
|
30
|
+
def type_text(text)
|
31
|
+
text.each_char { | t | key_press_direct t }
|
32
|
+
|
33
|
+
# No event yet so just cheat and sleep
|
34
|
+
sleep(0.2);
|
35
|
+
|
36
|
+
# Return what is in the field to check
|
37
|
+
element(true).getText
|
38
|
+
end
|
39
|
+
|
40
|
+
######################################################################
|
41
|
+
# Clears the contents of the edit field
|
42
|
+
#
|
43
|
+
# @note The edit field must have focus for this method to work
|
44
|
+
#
|
45
|
+
def clear
|
46
|
+
key_press_direct("a", :ctrl)
|
47
|
+
key_press_direct("backspace")
|
48
|
+
|
49
|
+
# Cheat until we have an event
|
50
|
+
sleep(0.1)
|
51
|
+
end
|
52
|
+
|
53
|
+
######################################################################
|
54
|
+
# Presses a key including modifiers
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
# browser.quick_toolbar(:name, "Document Toolbar").quick_addressfield(:name, "tba_address_field").key_press("a", :ctrl)
|
58
|
+
# browser.quick_toolbar(:name, "Document Toolbar").quick_addressfield(:name, "tba_address_field").key_press("c", :ctrl)
|
59
|
+
#
|
60
|
+
# @param [String] key key to press (e.g. "a" or "backspace")
|
61
|
+
# @param [Symbol] modifiers optional modifier(s) to hold down while pressing the key (e.g. :shift, :ctrl, :alt, :meta)
|
62
|
+
#
|
63
|
+
# @return [String] Text in the field after the keypress
|
64
|
+
#
|
65
|
+
# @note The edit field must have focus for this method to work
|
66
|
+
# @note WARNING: This method will not wait for page load or window
|
67
|
+
# shown events. If you need to wait for these events do not
|
68
|
+
# use this method
|
69
|
+
#
|
70
|
+
def key_press(key, *modifiers)
|
71
|
+
key_press_direct(key, *modifiers)
|
72
|
+
|
73
|
+
# Cheat until we have an event
|
74
|
+
sleep(0.1)
|
75
|
+
|
76
|
+
# Return what is in the field to check
|
77
|
+
element(true).getText
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
# @private
|
82
|
+
# Presses the key, and waits for loading to finish
|
83
|
+
def load_page_with_key_press(key, *modifiers)
|
84
|
+
wait_start
|
85
|
+
key_press_direct(key, *modifiers)
|
86
|
+
wait_for_window_loaded("")
|
87
|
+
end
|
88
|
+
|
89
|
+
# @private
|
90
|
+
# Enter some text and hit enter to do the action for the field
|
91
|
+
def enter_text_and_hit_enter(text)
|
92
|
+
loaded_url = ""
|
93
|
+
|
94
|
+
# Set focus
|
95
|
+
focus_with_click
|
96
|
+
# Clear the field
|
97
|
+
clear()
|
98
|
+
# Type in the text
|
99
|
+
typed_text = type_text(text) #Opens dropdown window
|
100
|
+
# Check that some text was typed, note the text might be changed in the
|
101
|
+
# url field so it might be different
|
102
|
+
if typed_text.length > 0
|
103
|
+
# Hit Enter to load the typed in url
|
104
|
+
win_id = load_page_with_key_press("Enter")
|
105
|
+
# Check that the page actually loaded in a window
|
106
|
+
if win_id > 0
|
107
|
+
# Refresh the control and get the text after the page as loaded
|
108
|
+
loaded_url = element(true).getText
|
109
|
+
end
|
110
|
+
end
|
111
|
+
loaded_url
|
112
|
+
end
|
113
|
+
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
class QuickSearchField < QuickEditField
|
3
|
+
|
4
|
+
# @private
|
5
|
+
# Checks the type of the widget is correct
|
6
|
+
def correct_type?
|
7
|
+
@element.getType == WIDGET_ENUM_MAP[:search]
|
8
|
+
end
|
9
|
+
|
10
|
+
######################################################################
|
11
|
+
# Enters the search text into the search field, and waits for page
|
12
|
+
# loading to finish
|
13
|
+
#
|
14
|
+
# @param [String] url text to search with
|
15
|
+
#
|
16
|
+
# @return [String] text in the address field after the page is loaded
|
17
|
+
# or a blank string
|
18
|
+
#
|
19
|
+
def search_with_text(search_text)
|
20
|
+
# Enters text in a field and then hits enter
|
21
|
+
enter_text_and_hit_enter(search_text)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
class QuickTab < QuickButton
|
3
|
+
|
4
|
+
# @private
|
5
|
+
# Checks the type of the widget is correct
|
6
|
+
def correct_type?
|
7
|
+
@element.getType == WIDGET_ENUM_MAP[:tabbutton]
|
8
|
+
end
|
9
|
+
|
10
|
+
######################################################################
|
11
|
+
# Drag and drop this tab on tab tab_target
|
12
|
+
#
|
13
|
+
# @param [QuickTab] tab button to drop this tab on
|
14
|
+
#
|
15
|
+
#
|
16
|
+
# @raise [DesktopExceptions::UnknownObjectException] if the target is not a tab
|
17
|
+
#
|
18
|
+
def move_with_drag(tab_target)
|
19
|
+
raise(Exceptions::UnknownObjectException) unless tab_target.type == :tabbutton
|
20
|
+
drag_and_drop_on(tab_target, :center)
|
21
|
+
|
22
|
+
sleep(0.1)
|
23
|
+
end
|
24
|
+
|
25
|
+
######################################################################
|
26
|
+
# Drag and drop this tab on another tab to add it to its tab group
|
27
|
+
#
|
28
|
+
# @param [QuickTab] tab (group) button to drop this tab on
|
29
|
+
#
|
30
|
+
# @raise [DesktopExceptions::UnknownObjectException] if the target is not a tab
|
31
|
+
#
|
32
|
+
# @return [int] the number of tabs in this tab group, or 1 if this is not a tab group button,
|
33
|
+
# in which case it represents only 1 tab, itself
|
34
|
+
def group_with_drag(tab_target)
|
35
|
+
raise(Exceptions::UnknownObjectException) unless tab_target.type == :tabbutton
|
36
|
+
|
37
|
+
# Drop on the edge of a tab to make the grouping work
|
38
|
+
drag_and_drop_on(tab_target, :edge)
|
39
|
+
|
40
|
+
sleep(0.1)
|
41
|
+
|
42
|
+
#Get the number of tabs in the group
|
43
|
+
element(true).value
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
######################################################################
|
48
|
+
# Clicks the tab button, and waits for the tab to be shown / switches to the page
|
49
|
+
#
|
50
|
+
# @param [String] win_name name of the window that will be opened (Pass a blank string for any window)
|
51
|
+
#
|
52
|
+
# @return [int] Window ID of the window activated,
|
53
|
+
# 0 if the window is already the active one,
|
54
|
+
# or if no window is active
|
55
|
+
#
|
56
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the tab button
|
57
|
+
# is not visible
|
58
|
+
#
|
59
|
+
def activate_tab_with_click
|
60
|
+
wait_start
|
61
|
+
click
|
62
|
+
wait_for_window_activated("Document Window")
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
class QuickThumbnail < QuickButton
|
3
|
+
|
4
|
+
# @private
|
5
|
+
# Checks the type of the widget is correct
|
6
|
+
def correct_type?
|
7
|
+
@element.getType == WIDGET_ENUM_MAP[:thumbnail]
|
8
|
+
end
|
9
|
+
|
10
|
+
######################################################################
|
11
|
+
# Drag and drop this speeddial
|
12
|
+
#
|
13
|
+
# @param [QuickThumbnail] Thumbnail to drop this thumbnail on
|
14
|
+
#
|
15
|
+
# @raise [DesktopExceptions::UnknownObjectException] if the target is not a thumbnail
|
16
|
+
#
|
17
|
+
#@private
|
18
|
+
def move_with_drag(tab_target)
|
19
|
+
raise(Exceptions::UnknownObjectException) unless tab_target.type == :thumbnail
|
20
|
+
drag_and_drop_on(tab_target, :center)
|
21
|
+
|
22
|
+
sleep(0.1)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
class QuickTreeItem < QuickWidget
|
3
|
+
|
4
|
+
# @private
|
5
|
+
# Checks the type of the widget is correct
|
6
|
+
def correct_type?
|
7
|
+
@element.getType == WIDGET_ENUM_MAP[:treeitem]
|
8
|
+
end
|
9
|
+
|
10
|
+
######################################################################
|
11
|
+
# Set focus to the tree item by clicking on it
|
12
|
+
#
|
13
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeview
|
14
|
+
# the treeitem is in is not visible
|
15
|
+
#
|
16
|
+
def focus_with_click
|
17
|
+
# First scroll the item into view
|
18
|
+
scroll_item_into_view unless visible?
|
19
|
+
super
|
20
|
+
end
|
21
|
+
|
22
|
+
######################################################################
|
23
|
+
# Expands a tree item when it is clicked
|
24
|
+
#
|
25
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
26
|
+
# is not visible
|
27
|
+
#
|
28
|
+
def expand_with_click
|
29
|
+
# For now there is no difference to focusing
|
30
|
+
focus_with_click
|
31
|
+
end
|
32
|
+
|
33
|
+
######################################################################
|
34
|
+
# Expands a tree item when it is double clicked
|
35
|
+
#
|
36
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
37
|
+
# is not visible
|
38
|
+
#
|
39
|
+
def expand_with_double_click
|
40
|
+
scroll_item_into_view unless visible?
|
41
|
+
double_click
|
42
|
+
# No event yet so just cheat and sleep
|
43
|
+
sleep(0.1);
|
44
|
+
end
|
45
|
+
|
46
|
+
alias_method :collapse_with_double_click, :expand_with_double_click
|
47
|
+
|
48
|
+
######################################################################
|
49
|
+
# Presses a key including modifiers
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# browser.quick_treeview(:name, "Bookmarks View").quick_treeitem(:text, "Ask.com").key_press("Down")
|
53
|
+
# browser.quick_treeview(:name, "Bookmarks View").quick_treeitem(:text, "Ask.com").key_press("Del")
|
54
|
+
#
|
55
|
+
# @param [String] key key to press (e.g. "a" or "backspace")
|
56
|
+
# @param [Symbol] modifiers optional modifier(s) to hold down while pressing the key (e.g. :shift, :ctrl, :alt, :meta)
|
57
|
+
#
|
58
|
+
# @return [String] Text in the field after the keypress
|
59
|
+
#
|
60
|
+
# @note The edit field must have focus for this method to work
|
61
|
+
# @note WARNING: This method will not wait for page load or window
|
62
|
+
# shown events. If you need to wait for these events do not
|
63
|
+
# use this method
|
64
|
+
#
|
65
|
+
def key_press(key, *opts)
|
66
|
+
key_press_direct(key, *opts)
|
67
|
+
sleep(0.1)
|
68
|
+
end
|
69
|
+
|
70
|
+
######################################################################
|
71
|
+
# Checks if the treeitem is selected
|
72
|
+
#
|
73
|
+
# @return [Boolean] true if the item is selected
|
74
|
+
#
|
75
|
+
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
76
|
+
# using the specified method
|
77
|
+
def selected?
|
78
|
+
element.isSelected
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
######################################################################
|
83
|
+
# Switch to the tree view tab by clicking on it (e.g. on the
|
84
|
+
# Advanced page of the preferences dialog)
|
85
|
+
#
|
86
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
87
|
+
# is not visible
|
88
|
+
#
|
89
|
+
def activate_tab_with_click
|
90
|
+
click
|
91
|
+
|
92
|
+
# No event yet so just cheat and sleep
|
93
|
+
sleep(0.1);
|
94
|
+
end
|
95
|
+
|
96
|
+
######################################################################
|
97
|
+
# Double clicks the tree item, and waits for the window with
|
98
|
+
# window name win_name to be shown
|
99
|
+
#
|
100
|
+
# @param [String] win_name name of the window that will be opened (Pass a blank string for any window)
|
101
|
+
#
|
102
|
+
# @return [int] Window ID of the window shown or 0 if no window is shown
|
103
|
+
#
|
104
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the treeitem
|
105
|
+
# is not visible
|
106
|
+
#
|
107
|
+
def open_window_with_double_click(win_name)
|
108
|
+
wait_start
|
109
|
+
click(:left, 2)
|
110
|
+
wait_for_window_shown(win_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
alias_method :open_dialog_with_double_click, :open_window_with_double_click
|
114
|
+
|
115
|
+
|
116
|
+
private
|
117
|
+
# @private
|
118
|
+
# Scrolls the item into view if required
|
119
|
+
def scroll_item_into_view
|
120
|
+
|
121
|
+
# Make sure we have a window id
|
122
|
+
win_id = window_id >= 0 ? window_id : driver.getActiveWindowID()
|
123
|
+
|
124
|
+
# Filter only treeitems in parent_treeview
|
125
|
+
treeitems = driver.getQuickWidgetList(win_id).select do |wdg|
|
126
|
+
wdg.getType == QuickWidget::WIDGET_ENUM_MAP[:treeitem] && wdg.getParentName == parent_name
|
127
|
+
end
|
128
|
+
|
129
|
+
# Get the first visible item
|
130
|
+
lowest = treeitems.find { | item| item.visible? } #This will always be a parent item, not a child
|
131
|
+
# Assume list is ordered? => lower row means scroll up, higher row means scroll down
|
132
|
+
key = row < lowest.row ? "PageUp" : "PageDown"
|
133
|
+
|
134
|
+
#Select the first item on visible part of list, and select it
|
135
|
+
qw = QuickTreeItem.new(self,lowest)
|
136
|
+
qw.focus_with_click
|
137
|
+
key_press_direct(key)
|
138
|
+
|
139
|
+
#First scroll
|
140
|
+
key_press_direct(key)
|
141
|
+
|
142
|
+
visible_treeitems = driver.getQuickWidgetList(win_id).select do |wdg|
|
143
|
+
wdg.getType == QuickWidget::WIDGET_ENUM_MAP[:treeitem] && wdg.getParentName == parent_name && wdg.visible?
|
144
|
+
end
|
145
|
+
|
146
|
+
# Stop scrolling if we have run through the whole list, the item is then a child and won't get visible
|
147
|
+
max_times = treeitems.length / visible_treeitems.length + 1
|
148
|
+
until element(true).visible? || max_times < 0
|
149
|
+
key_press_direct(key)
|
150
|
+
max_times-=1
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|