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
data/lib/operawatir/browser.rb
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
class OperaWatir::Browser
|
3
3
|
include Deprecated
|
4
4
|
|
5
|
-
attr_accessor :driver, :active_window, :preferences, :keys, :spatnav
|
5
|
+
attr_accessor :driver, :active_window, :preferences, :keys, :spatnav, :utils
|
6
6
|
|
7
7
|
def self.settings=(settings={})
|
8
|
-
@
|
8
|
+
@desired_capabilities = nil # Bust cache
|
9
9
|
@settings = settings
|
10
10
|
end
|
11
11
|
|
@@ -22,11 +22,12 @@ class OperaWatir::Browser
|
|
22
22
|
def initialize
|
23
23
|
OperaWatir.compatibility! unless OperaWatir.api >= 3
|
24
24
|
|
25
|
-
self.driver = OperaDriver.new(self.class.
|
25
|
+
self.driver = OperaDriver.new(self.class.desired_capabilities)
|
26
26
|
self.active_window = OperaWatir::Window.new(self)
|
27
27
|
self.preferences = OperaWatir::Preferences.new(self)
|
28
28
|
self.keys = OperaWatir::Keys.new(self)
|
29
29
|
self.spatnav = OperaWatir::Spatnav.new(self)
|
30
|
+
self.utils = OperaWatir::Utils.new(self)
|
30
31
|
end
|
31
32
|
|
32
33
|
alias_method :window, :active_window
|
@@ -48,14 +49,7 @@ class OperaWatir::Browser
|
|
48
49
|
|
49
50
|
# Instruct the browser instance to quit and shut down.
|
50
51
|
def quit
|
51
|
-
driver.
|
52
|
-
end
|
53
|
-
|
54
|
-
# Closes all windows.
|
55
|
-
#
|
56
|
-
# TODO This should be on Windows
|
57
|
-
def close_all
|
58
|
-
driver.closeAll
|
52
|
+
driver.quit
|
59
53
|
end
|
60
54
|
|
61
55
|
# Get the version number of the driver. This _is not_ the same as
|
@@ -106,6 +100,7 @@ class OperaWatir::Browser
|
|
106
100
|
def opera_action(name, *args)
|
107
101
|
driver.operaAction(name, args.to_java(:string))
|
108
102
|
end
|
103
|
+
|
109
104
|
deprecated :opera_action
|
110
105
|
|
111
106
|
# Full list of available Opera actions in the Opera build you're
|
@@ -116,8 +111,9 @@ class OperaWatir::Browser
|
|
116
111
|
#
|
117
112
|
# @return [String] List of available Opera actions.
|
118
113
|
def opera_action_list
|
119
|
-
driver.getOperaActionList.
|
114
|
+
driver.getOperaActionList.to_a
|
120
115
|
end
|
116
|
+
|
121
117
|
deprecated :opera_action_list
|
122
118
|
|
123
119
|
# Selects all content in the currently focused element. Equivalent
|
@@ -195,16 +191,24 @@ class OperaWatir::Browser
|
|
195
191
|
|
196
192
|
deprecated :key, 'browser.keys.send'
|
197
193
|
|
194
|
+
# actions
|
195
|
+
|
196
|
+
def actions
|
197
|
+
OperaWatir::Actions.new(browser)
|
198
|
+
end
|
199
|
+
|
198
200
|
private
|
199
201
|
|
200
|
-
def self.
|
201
|
-
@
|
202
|
-
s.
|
203
|
-
s.
|
204
|
-
s.
|
205
|
-
s.
|
206
|
-
s.
|
207
|
-
s.
|
202
|
+
def self.desired_capabilities
|
203
|
+
@desired_capabilities ||= DesiredCapabilities.new.tap { |s|
|
204
|
+
s.setCapability('opera.logging.level', self.settings[:logging_level]) if self.settings[:logging_level]
|
205
|
+
s.setCapability('opera.logging.file', self.settings[:logging_file]) if self.settings[:logging_file]
|
206
|
+
s.setCapability('opera.autostart', false) if self.settings[:manual]
|
207
|
+
s.setCapability('opera.launcher', self.settings[:launcher]) if self.settings[:launcher]
|
208
|
+
s.setCapability('opera.binary', self.settings[:path]) if self.settings[:path]
|
209
|
+
s.setCapability('opera.arguments', self.settings[:args].to_s) if self.settings[:args]
|
210
|
+
s.setCapability('opera.no_quit', true) if self.settings[:no_quit]
|
211
|
+
s.setCapability('opera.idle', true) if self.settings[:opera_idle] or ENV['OPERA_IDLE'].truthy?
|
208
212
|
}
|
209
213
|
end
|
210
214
|
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module OperaWatir
|
2
|
+
module ClickableItem
|
3
|
+
|
4
|
+
######################################################################
|
5
|
+
# Clicks the button, and waits for loading to finish
|
6
|
+
#
|
7
|
+
# @return [int] Window ID of the window shown or 0 if no window is shown
|
8
|
+
#
|
9
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the button
|
10
|
+
# is not visible
|
11
|
+
#
|
12
|
+
def load_page_with_click
|
13
|
+
wait_start
|
14
|
+
click
|
15
|
+
# Just wait for the load
|
16
|
+
wait_for_window_loaded("")
|
17
|
+
end
|
18
|
+
|
19
|
+
######################################################################
|
20
|
+
# Clicks the button, and waits for the window with window name
|
21
|
+
# win_name to be shown
|
22
|
+
#
|
23
|
+
# @param [String] win_name name of the window that will be opened (Pass a blank string for any window)
|
24
|
+
#
|
25
|
+
# @return [int] Window ID of the window shown or 0 if no window is shown
|
26
|
+
#
|
27
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the button
|
28
|
+
# is not visible
|
29
|
+
#
|
30
|
+
def open_window_with_click(win_name)
|
31
|
+
wait_start
|
32
|
+
click
|
33
|
+
wait_for_window_shown(win_name)
|
34
|
+
end
|
35
|
+
alias_method :open_dialog_with_click, :open_window_with_click
|
36
|
+
|
37
|
+
######################################################################
|
38
|
+
# Clicks item and waits for the menu to close
|
39
|
+
#
|
40
|
+
# @return name of menu closed
|
41
|
+
#
|
42
|
+
def close_menu_with_click(menu_name)
|
43
|
+
wait_start
|
44
|
+
click
|
45
|
+
wait_for_menu_closed(menu_name)
|
46
|
+
end
|
47
|
+
|
48
|
+
######################################################################
|
49
|
+
# Clicks the item, and waits for the menu with menu with name
|
50
|
+
# menu_name to be shown
|
51
|
+
#
|
52
|
+
# @param [String] name of menu that should open
|
53
|
+
#
|
54
|
+
# @raise [DesktopExceptions::WidgetNotVisibleException] if the button
|
55
|
+
# is not visible
|
56
|
+
#
|
57
|
+
# @return name of menu opened if it matches the parameter menu_name,
|
58
|
+
# otherwise returns empty string
|
59
|
+
#
|
60
|
+
def open_menu_with_click(menu_name)
|
61
|
+
wait_start
|
62
|
+
click
|
63
|
+
wait_for_menu_shown(menu_name)
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
data/lib/operawatir/compat.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module OperaWatir
|
2
|
-
|
2
|
+
|
3
3
|
module Compat; end
|
4
4
|
|
5
5
|
# Switches on compatibility layer (Watir 2 API).
|
@@ -7,12 +7,12 @@ module OperaWatir
|
|
7
7
|
require 'operawatir/compat/browser'
|
8
8
|
require 'operawatir/compat/element_finders'
|
9
9
|
require 'operawatir/compat/window'
|
10
|
-
|
10
|
+
|
11
11
|
Browser.send :include, Compat::Browser
|
12
12
|
Window.send :include, Compat::ElementFinders
|
13
13
|
Window.send :include, Compat::Window
|
14
14
|
Collection.send :include, Compat::ElementFinders
|
15
|
-
|
15
|
+
|
16
16
|
# TODO Ruby Modules can't override methods defined in their included klass
|
17
17
|
# Requiring the files is OK, but there needs to be some way of detecting
|
18
18
|
# that we are in compatibility mode.
|
@@ -21,5 +21,5 @@ module OperaWatir
|
|
21
21
|
require 'operawatir/compat/collection'
|
22
22
|
require 'operawatir/compat/element'
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
end
|
@@ -26,7 +26,7 @@ class OperaWatir::Collection
|
|
26
26
|
elsif args.first == :index
|
27
27
|
type, value = :index, args[1].to_i - 1
|
28
28
|
|
29
|
-
|
29
|
+
# Handle a hash of selectors
|
30
30
|
elsif args.length == 1 and args.first.is_a? Hash
|
31
31
|
args.first.each_pair do |k, v|
|
32
32
|
s = add_selector_from_arguments([k, v], default_method)
|
@@ -64,11 +64,12 @@ module OperaWatir
|
|
64
64
|
driver.switch_to.default_content
|
65
65
|
end
|
66
66
|
|
67
|
-
|
67
|
+
|
68
68
|
def show_frames
|
69
69
|
frames = driver.list_frames
|
70
|
-
|
71
|
-
frames.each_with_index { |frame, i|
|
70
|
+
text = "There are #{frames.length.to_s} frames\n"
|
71
|
+
frames.each_with_index { |frame, i| text << "frame index: #{(i.to_i + 1).to_s} name: #{frame.to_s}\n" }
|
72
|
+
text
|
72
73
|
end
|
73
74
|
|
74
75
|
end
|
@@ -2,11 +2,13 @@ module OperaWatir
|
|
2
2
|
class DesktopBrowser < Browser
|
3
3
|
include DesktopContainer
|
4
4
|
include DesktopCommon
|
5
|
-
|
5
|
+
|
6
|
+
ConditionTimeout = 10.0
|
7
|
+
|
6
8
|
LoadActions = ["Open url in new page", "Open url in current page", "Open url in new background page",
|
7
|
-
"Open url in new window", "New private page", "Paste and go", "Paste and go background",
|
8
|
-
"Hotclick search", "Duplicate page", "Reopen page", "Back", "Forward", "Help"]
|
9
|
-
|
9
|
+
"Open url in new window", "New private page", "Paste and go", "Paste and go background",
|
10
|
+
"Hotclick search", "Duplicate page", "Reopen page", "Back", "Forward", "Help", "Autocomplete server name"]
|
11
|
+
|
10
12
|
# @private
|
11
13
|
def initialize
|
12
14
|
OperaWatir.compatibility! unless OperaWatir.api >= 3
|
@@ -18,22 +20,26 @@ module OperaWatir
|
|
18
20
|
self.spatnav = OperaWatir::Spatnav.new(self)
|
19
21
|
end
|
20
22
|
|
23
|
+
#def running?
|
24
|
+
# driver.isOperaRunning()
|
25
|
+
#end
|
26
|
+
|
21
27
|
# @private
|
22
|
-
# Hack overload to allow for timing of the OnLoaded event that can cause
|
23
|
-
# dialogs to autoclose in Dialog.cpp when then OnUrlChanged is fired
|
28
|
+
# Hack overload to allow for timing of the OnLoaded event that can cause
|
29
|
+
# dialogs to autoclose in Dialog.cpp when then OnUrlChanged is fired
|
24
30
|
# after a dialog is opened
|
25
31
|
def goto(url = "")
|
26
32
|
active_window.url = url
|
27
33
|
sleep(1)
|
28
34
|
end
|
29
|
-
|
35
|
+
|
30
36
|
######################################################################
|
31
37
|
# Quits Opera
|
32
38
|
#
|
33
39
|
def quit_opera
|
34
40
|
driver.quitOpera
|
35
41
|
end
|
36
|
-
|
42
|
+
|
37
43
|
######################################################################
|
38
44
|
# Restarts Opera
|
39
45
|
#
|
@@ -41,14 +47,22 @@ module OperaWatir
|
|
41
47
|
driver.quitOpera
|
42
48
|
driver.startOpera
|
43
49
|
end
|
44
|
-
|
50
|
+
|
45
51
|
######################################################################
|
46
52
|
# Quits the driver without exiting Opera
|
47
53
|
#
|
48
54
|
def quit_driver
|
49
55
|
driver.quitDriver
|
50
56
|
end
|
51
|
-
|
57
|
+
|
58
|
+
######################################################################
|
59
|
+
#
|
60
|
+
# Get ID of active Desktop UI window
|
61
|
+
#
|
62
|
+
def active_quick_window_id
|
63
|
+
driver.getActiveQuickWindowID()
|
64
|
+
end
|
65
|
+
|
52
66
|
######################################################################
|
53
67
|
# Executes the action given by action_name, and waits for
|
54
68
|
# the window with window name win_name to be shown
|
@@ -67,14 +81,14 @@ module OperaWatir
|
|
67
81
|
if LoadActions.include?(action_name) then
|
68
82
|
raise(DesktopExceptions::UnsupportedActionException, "Action #{action_name} not supported")
|
69
83
|
end
|
70
|
-
|
84
|
+
|
71
85
|
wait_start
|
72
86
|
opera_desktop_action(action_name, *params)
|
73
87
|
wait_for_window_shown(win_name)
|
74
88
|
end
|
75
|
-
|
89
|
+
|
76
90
|
alias_method :open_dialog_with_action, :open_window_with_action
|
77
|
-
|
91
|
+
|
78
92
|
######################################################################
|
79
93
|
# Executes the action given by action_name, and waits for
|
80
94
|
# the window with window name win_name to be loaded
|
@@ -89,7 +103,7 @@ module OperaWatir
|
|
89
103
|
#
|
90
104
|
# @return [int] Window ID of the window shown or 0 if no window is shown
|
91
105
|
def load_window_with_action(win_name, action_name, *params)
|
92
|
-
if LoadActions.include?(action_name)
|
106
|
+
if LoadActions.include?(action_name)
|
93
107
|
wait_start
|
94
108
|
opera_desktop_action(action_name, *params)
|
95
109
|
wait_for_window_loaded(win_name)
|
@@ -117,14 +131,17 @@ module OperaWatir
|
|
117
131
|
key_press_direct(key, *modifiers)
|
118
132
|
wait_for_window_shown(win_name)
|
119
133
|
end
|
120
|
-
|
134
|
+
|
121
135
|
alias_method :open_dialog_with_key_press, :open_window_with_key_press
|
122
|
-
|
136
|
+
|
123
137
|
######################################################################
|
124
138
|
# Clicks the key and modifiers and waits for a new tab to be activated
|
125
139
|
#
|
140
|
+
# @example
|
141
|
+
# browser.activate_tab_with_key_press("F6", :ctrl)
|
142
|
+
#
|
126
143
|
# @param [String] key key to press (e.g. "a" or "backspace")
|
127
|
-
# @param [Symbol] modifiers optional modifier(s) to hold down while pressing
|
144
|
+
# @param [Symbol] modifiers optional modifier(s) to hold down while pressing
|
128
145
|
# the key (e.g. :shift, :ctrl, :alt, :meta)
|
129
146
|
#
|
130
147
|
# @return [int] Window ID of the document window (tab) that is activated, or 0 if no tab
|
@@ -133,22 +150,26 @@ module OperaWatir
|
|
133
150
|
def activate_tab_with_key_press(key, *modifiers)
|
134
151
|
wait_start
|
135
152
|
# TODO: FIXME. key_down and up are not yet implemented on mac and windows
|
136
|
-
if linux?
|
137
|
-
|
138
|
-
|
153
|
+
if linux?
|
154
|
+
key_down_direct(key,*modifiers)
|
155
|
+
key_up_direct(key, *modifiers)
|
139
156
|
else
|
140
157
|
key_press_direct(key, *modifiers)
|
141
158
|
end
|
142
159
|
wait_for_window_activated("Document Window")
|
143
160
|
end
|
144
|
-
|
161
|
+
|
145
162
|
######################################################################
|
146
163
|
# Opens a new tab and loads the url entered, then waits for
|
147
164
|
# a dialog to be shown based on the url entered
|
148
165
|
#
|
149
|
-
# @
|
166
|
+
# @example
|
167
|
+
# browser.open_dialog_with_url("Setup Apply Dialog Confirm Dialog", \
|
168
|
+
# "http://t/platforms/desktop/bts/DSK-316777/001-1.ini")
|
169
|
+
#
|
170
|
+
# @param [String] dialog_name name of the dialog that will be opened
|
150
171
|
# (Pass a blank string for any window)
|
151
|
-
# @param [String] url to load
|
172
|
+
# @param [String] url to load
|
152
173
|
#
|
153
174
|
# @return [int] Window ID of the dialog opened or 0 if no window is opened
|
154
175
|
#
|
@@ -158,7 +179,7 @@ module OperaWatir
|
|
158
179
|
# The loading of the page will happen first then the dialog will be shown
|
159
180
|
wait_for_window_shown(dialog_name)
|
160
181
|
end
|
161
|
-
|
182
|
+
|
162
183
|
######################################################################
|
163
184
|
# Executes the action given by action_name, and waits for
|
164
185
|
# the window with window name win_name to close
|
@@ -175,12 +196,12 @@ module OperaWatir
|
|
175
196
|
#
|
176
197
|
def close_window_with_action(win_name, action_name, *params)
|
177
198
|
wait_start
|
178
|
-
opera_desktop_action(action_name, *params)
|
199
|
+
opera_desktop_action(action_name, *params)
|
179
200
|
wait_for_window_close(win_name)
|
180
201
|
end
|
181
|
-
|
202
|
+
|
182
203
|
alias_method :close_dialog_with_action, :close_window_with_action
|
183
|
-
|
204
|
+
|
184
205
|
######################################################################
|
185
206
|
# Presses the key, with optional modifiers, and waits for
|
186
207
|
# the window with window name win_name to close
|
@@ -200,13 +221,16 @@ module OperaWatir
|
|
200
221
|
key_press_direct(key, *opts)
|
201
222
|
wait_for_window_close(win_name)
|
202
223
|
end
|
203
|
-
|
224
|
+
|
204
225
|
alias_method :close_dialog_with_key_press, :close_window_with_key_press
|
205
|
-
|
226
|
+
|
206
227
|
######################################################################
|
207
228
|
# Close the dialog with name dialog_name, using the "Cancel" action
|
208
229
|
#
|
209
|
-
# @
|
230
|
+
# @example
|
231
|
+
# browser.close_dialog("New Preferences Dialog")
|
232
|
+
#
|
233
|
+
# @param [String] dialog_name name of the dialog that will be closed
|
210
234
|
# (Pass a blank string for any window)
|
211
235
|
#
|
212
236
|
# @return [int] Window ID of the dialog closed or 0 if no window is closed
|
@@ -216,7 +240,7 @@ module OperaWatir
|
|
216
240
|
opera_desktop_action("Cancel")
|
217
241
|
wait_for_window_close(dialog_name)
|
218
242
|
end
|
219
|
-
|
243
|
+
|
220
244
|
######################################################################
|
221
245
|
# Sets the alignment of a toolbar or panel
|
222
246
|
#
|
@@ -226,11 +250,11 @@ module OperaWatir
|
|
226
250
|
#
|
227
251
|
def set_alignment_with_action(toolbar_name, alignment)
|
228
252
|
opera_desktop_action("Set alignment", toolbar_name, alignment)
|
229
|
-
sleep(0.1)
|
253
|
+
sleep(0.1)
|
230
254
|
end
|
231
255
|
|
232
256
|
######################################################################
|
233
|
-
# Retrieves an array of all widgets in the window with window
|
257
|
+
# Retrieves an array of all widgets in the window with window
|
234
258
|
# name win_name
|
235
259
|
#
|
236
260
|
# @example
|
@@ -243,15 +267,15 @@ module OperaWatir
|
|
243
267
|
# @return [Array] Array of widgets retrieved from the window
|
244
268
|
#
|
245
269
|
def widgets(window)
|
246
|
-
|
270
|
+
|
247
271
|
# If window specifies window name, and the active window has this name
|
248
272
|
# use its id to get the widgets,
|
249
273
|
if window.is_a? String
|
250
274
|
active_win_id = driver.getActiveQuickWindowID()
|
251
275
|
active_win_name = driver.getQuickWindowName(active_win_id)
|
252
|
-
|
276
|
+
|
253
277
|
#If the active window is of same type, then grab that one, not first
|
254
|
-
if active_win_name == window #e.g. Both Document Window
|
278
|
+
if active_win_name == window #e.g. Both Document Window
|
255
279
|
window = active_win_id
|
256
280
|
end
|
257
281
|
end
|
@@ -282,11 +306,14 @@ module OperaWatir
|
|
282
306
|
end
|
283
307
|
end.to_a
|
284
308
|
end
|
285
|
-
|
309
|
+
|
286
310
|
alias_method :quick_widgets, :widgets
|
287
|
-
|
311
|
+
|
288
312
|
####################################################
|
289
|
-
# Retrieves an array of all windows
|
313
|
+
# Retrieves an array of all windows
|
314
|
+
#
|
315
|
+
# @example
|
316
|
+
# browser.quick_windows.each { |win| puts win.to_s }
|
290
317
|
#
|
291
318
|
# @return [Array] Array of windows
|
292
319
|
#
|
@@ -295,28 +322,31 @@ module OperaWatir
|
|
295
322
|
QuickWindow.new(self,java_window)
|
296
323
|
end.to_a
|
297
324
|
end
|
298
|
-
|
325
|
+
|
299
326
|
####################################################
|
300
327
|
# Retrieves an array of all tabs (Document Windows)
|
301
328
|
#
|
329
|
+
# @example
|
330
|
+
# browser.open_pages.length.should == 2
|
331
|
+
#
|
302
332
|
# @return [Array] Array of windows
|
303
333
|
#
|
304
334
|
def open_pages
|
305
335
|
quick_windows.select { |win| win.name == "Document Window" }
|
306
336
|
end
|
307
|
-
|
337
|
+
|
308
338
|
#@private
|
309
339
|
# Not needed as quick_tabs is def. below
|
310
340
|
#def tab_buttons
|
311
341
|
# widgets("Browser Window").select { | w | w.type == :tabbutton }
|
312
342
|
#end
|
313
|
-
|
343
|
+
|
314
344
|
#=begin
|
315
345
|
# Return collection for each widget type
|
316
346
|
# example browser.quick_buttons
|
317
347
|
# browser.quick_treeitems
|
318
348
|
# ....
|
319
|
-
#
|
349
|
+
#
|
320
350
|
WIDGET_ENUM_MAP.keys.each do |widget_type|
|
321
351
|
my_type = "quick_" << widget_type.to_s
|
322
352
|
type = my_type
|
@@ -330,7 +360,63 @@ module OperaWatir
|
|
330
360
|
end
|
331
361
|
end
|
332
362
|
#=end
|
333
|
-
|
363
|
+
|
364
|
+
#TODO
|
365
|
+
def quick_menus
|
366
|
+
driver.getQuickMenuList().map do |java_menu|
|
367
|
+
QuickMenu.new(self, java_menu)
|
368
|
+
end.to_a
|
369
|
+
end
|
370
|
+
|
371
|
+
#TODO
|
372
|
+
def quick_menuitems
|
373
|
+
driver.getQuickMenuItemList().map do |java_item|
|
374
|
+
QuickMenuItem.new(self, java_item)
|
375
|
+
end.to_a
|
376
|
+
end
|
377
|
+
|
378
|
+
#####################################################################
|
379
|
+
#
|
380
|
+
# Closes the active menu
|
381
|
+
#
|
382
|
+
def close_active_menu
|
383
|
+
wait_start
|
384
|
+
|
385
|
+
menus = quick_menus
|
386
|
+
main = menus.select {|menu| menu.name == "Main Menu"}
|
387
|
+
main_open = main.length > 0
|
388
|
+
real_submenu = main_open ? (menus.length > 2) : menus.length > 1
|
389
|
+
|
390
|
+
if real_submenu
|
391
|
+
key_press_direct("Left")
|
392
|
+
else
|
393
|
+
close_menu
|
394
|
+
end
|
395
|
+
|
396
|
+
wait_for_menu_closed("")
|
397
|
+
end
|
398
|
+
|
399
|
+
#####################################################################
|
400
|
+
#
|
401
|
+
# Closes all open menus
|
402
|
+
# (Note: On mac one esc closes all menus)
|
403
|
+
def close_all_menus
|
404
|
+
i = 6 #Just some number
|
405
|
+
while quick_menus.delete_if { |menu| menu.name == "Main Menu" }.length > 0
|
406
|
+
close_menu
|
407
|
+
i-=1
|
408
|
+
break if i == 0
|
409
|
+
end
|
410
|
+
end
|
411
|
+
|
412
|
+
######################################################################
|
413
|
+
#
|
414
|
+
# @return [Array] with all tabs (quick_tab)
|
415
|
+
#
|
416
|
+
def quick_tabs
|
417
|
+
quick_tabbuttons
|
418
|
+
end
|
419
|
+
|
334
420
|
######################################################################
|
335
421
|
# Retrieves the name of a window based on it's id
|
336
422
|
#
|
@@ -341,7 +427,7 @@ module OperaWatir
|
|
341
427
|
def window_name(win_id)
|
342
428
|
driver.getQuickWindowName(win_id)
|
343
429
|
end
|
344
|
-
|
430
|
+
|
345
431
|
######################################################################
|
346
432
|
# Presses the key, with optional modifiers, and waits for loaded event
|
347
433
|
#
|
@@ -360,9 +446,57 @@ module OperaWatir
|
|
360
446
|
key_press_direct(key, *modifiers)
|
361
447
|
wait_for_window_loaded("")
|
362
448
|
end
|
363
|
-
|
449
|
+
|
450
|
+
######################################################################
|
451
|
+
# Clicks the element and waits for the menu with menu_name as given
|
452
|
+
# opens
|
453
|
+
#
|
454
|
+
# @param [String] element Web page element to click (a link, an image ..)
|
455
|
+
# @param [Symbol] menu_name Name of menu that should open when clicking the element
|
456
|
+
#
|
457
|
+
# @return [String] name of menu opened if it matches menu_name given as
|
458
|
+
# parameter, otherwise empty string
|
459
|
+
#
|
460
|
+
def open_menu_with_rightclick(element, menu_name)
|
461
|
+
wait_start
|
462
|
+
element.right_click
|
463
|
+
wait_for_menu_shown(menu_name)
|
464
|
+
end
|
465
|
+
|
466
|
+
#####################################################################
|
467
|
+
#
|
468
|
+
# Presses key and waits for the menu to show
|
469
|
+
#
|
470
|
+
# @param [String] menu_name Name of the menu that should be opened
|
471
|
+
# @param [String] key Key to press
|
472
|
+
#
|
473
|
+
# @return [String] name of menu that was opened, or empty
|
474
|
+
#
|
475
|
+
def open_menu_with_key_press(menu_name, key, *modifiers)
|
476
|
+
wait_start
|
477
|
+
key_press_direct(key, *modifiers)
|
478
|
+
wait_for_menu_shown(menu_name)
|
479
|
+
end
|
480
|
+
|
481
|
+
#####################################################################
|
482
|
+
#
|
483
|
+
# Presses key and waits for the menu to close
|
484
|
+
#
|
485
|
+
# @param [String] menu_name Name of the menu that should be opened
|
486
|
+
# @param [String] key Key to press
|
487
|
+
#
|
488
|
+
# @return [String] name of menu that was closed, or empty string
|
489
|
+
#
|
490
|
+
def close_menu_with_key_press(menu_name, key, *modifiers)
|
491
|
+
wait_start
|
492
|
+
key_press_direct(key, *modifiers)
|
493
|
+
wait_for_menu_closed(menu_name)
|
494
|
+
end
|
495
|
+
|
496
|
+
|
497
|
+
=begin
|
364
498
|
##############################################################################
|
365
|
-
# Clicks the element specified by method and selector,
|
499
|
+
# Clicks the element specified by method and selector,
|
366
500
|
# and waits for the window with name win_name to be shown
|
367
501
|
#
|
368
502
|
# @param [WebElement] element element to click
|
@@ -370,53 +504,53 @@ module OperaWatir
|
|
370
504
|
#
|
371
505
|
# @return [int] Window ID of the window shown or 0 if no window is shown
|
372
506
|
#
|
373
|
-
|
507
|
+
#=begin
|
374
508
|
# or open_dialog_with_click(type, method, selector, win_name)
|
375
509
|
# open_dialog_with_click(:button, :id, "text", win_name)
|
376
|
-
|
510
|
+
#=end
|
377
511
|
def open_dialog_with_click(method, selector, win_name)
|
378
512
|
wait_start
|
379
513
|
OperaWatir::WebElement.new(self, method, selector).click
|
380
514
|
wait_for_window_shown(win_name)
|
381
515
|
end
|
382
|
-
|
516
|
+
=end
|
383
517
|
|
384
518
|
######################################################################
|
385
|
-
# Returns the full path to the Opera executable
|
519
|
+
# Returns the full path to the Opera executable
|
386
520
|
#
|
387
|
-
# @return [String] Full path to the opera executable
|
521
|
+
# @return [String] Full path to the opera executable
|
388
522
|
#
|
389
523
|
def path
|
390
524
|
driver.getOperaPath()
|
391
525
|
end
|
392
526
|
|
393
527
|
######################################################################
|
394
|
-
# Returns the full path to the Opera large preferences folder
|
528
|
+
# Returns the full path to the Opera large preferences folder
|
395
529
|
#
|
396
530
|
# @return [String] Full path to the large preferences folder
|
397
531
|
#
|
398
532
|
def large_preferences_path
|
399
533
|
driver.getLargePreferencesPath()
|
400
534
|
end
|
401
|
-
|
535
|
+
|
402
536
|
######################################################################
|
403
|
-
# Returns the full path to the Opera small preferences folder
|
537
|
+
# Returns the full path to the Opera small preferences folder
|
404
538
|
#
|
405
539
|
# @return [String] Full path to the small preferences folder
|
406
540
|
#
|
407
541
|
def small_preferences_path
|
408
542
|
driver.getSmallPreferencesPath()
|
409
543
|
end
|
410
|
-
|
544
|
+
|
411
545
|
######################################################################
|
412
|
-
# Returns the full path to the Opera cache preferences folder
|
546
|
+
# Returns the full path to the Opera cache preferences folder
|
413
547
|
#
|
414
548
|
# @return [String] Full path to the cache preferences folder
|
415
549
|
#
|
416
550
|
def cache_preferences_path
|
417
551
|
driver.getCachePreferencesPath()
|
418
552
|
end
|
419
|
-
|
553
|
+
|
420
554
|
######################################################################
|
421
555
|
# Returns the language string corresponding to the string_id provided
|
422
556
|
#
|
@@ -436,56 +570,56 @@ module OperaWatir
|
|
436
570
|
end
|
437
571
|
|
438
572
|
######################################################################
|
439
|
-
# Returns true if the test is running on Mac
|
573
|
+
# Returns true if the test is running on Mac
|
440
574
|
#
|
441
|
-
# @return [Boolean] true we the operating system is Mac, otherwise false
|
575
|
+
# @return [Boolean] true we the operating system is Mac, otherwise false
|
442
576
|
#
|
443
577
|
def mac?
|
444
|
-
|
578
|
+
mac_internal?
|
445
579
|
end
|
446
|
-
|
580
|
+
|
447
581
|
######################################################################
|
448
|
-
# Returns true if the test is running on Linux
|
582
|
+
# Returns true if the test is running on Linux
|
449
583
|
#
|
450
|
-
# @return [Boolean] true we the operating system is Linux, otherwise false
|
584
|
+
# @return [Boolean] true we the operating system is Linux, otherwise false
|
451
585
|
#
|
452
586
|
def linux?
|
453
|
-
|
587
|
+
linux_internal?
|
454
588
|
end
|
455
|
-
|
589
|
+
|
456
590
|
# @private
|
457
591
|
# Special method to access the driver
|
458
592
|
attr_reader :driver
|
459
|
-
|
593
|
+
|
460
594
|
######################################################################
|
461
|
-
# Clear all private data (as in Delete Private Data Dialog)
|
595
|
+
# Clear all private data (as in Delete Private Data Dialog)
|
462
596
|
#
|
463
|
-
# @return [int] 0 if operation failed, else > 0
|
597
|
+
# @return [int] 0 if operation failed, else > 0
|
464
598
|
#
|
465
599
|
def clear_all_private_data
|
466
|
-
|
600
|
+
|
467
601
|
#FIXME: Set CheckFlags to uncheck to prevent storing the settings used here
|
468
|
-
|
602
|
+
|
469
603
|
win_id = open_dialog_with_action("Clear Private Data Dialog", "Delete private data")
|
470
604
|
return 0 if win_id == 0
|
471
|
-
|
605
|
+
|
472
606
|
#Ensure is Expanded
|
473
607
|
if quick_button(:name, "Destails_expand").value == 0
|
474
608
|
quick_button(:name, "Destails_expand").toggle_with_click
|
475
609
|
end
|
476
|
-
|
610
|
+
|
477
611
|
quick_checkboxes("Clear Private Data Dialog").each do |box|
|
478
612
|
box.toggle_with_click unless box.checked?
|
479
613
|
end
|
480
|
-
|
614
|
+
|
481
615
|
#Delete all
|
482
616
|
win_id = quick_button(:name, "button_OK").close_dialog_with_click("Clear Private Data Dialog")
|
483
|
-
|
617
|
+
|
484
618
|
#FIXME: Reset CheckFlags
|
485
|
-
|
619
|
+
|
486
620
|
win_id
|
487
621
|
end
|
488
|
-
|
622
|
+
|
489
623
|
######################################################################
|
490
624
|
# Clear typed and visited history
|
491
625
|
#
|
@@ -494,35 +628,35 @@ module OperaWatir
|
|
494
628
|
opera_desktop_action("Clear visited history")
|
495
629
|
opera_desktop_action("Clear typed in history")
|
496
630
|
end
|
497
|
-
|
631
|
+
|
498
632
|
######################################################################
|
499
|
-
#
|
633
|
+
#
|
500
634
|
# Clear disk cache
|
501
635
|
#
|
502
636
|
def clear_cache
|
503
637
|
#TODO: Use Delete Private Data Dialog?
|
504
638
|
opera_desktop_action("Clear disk cache")
|
505
639
|
end
|
506
|
-
|
640
|
+
|
507
641
|
######################################################################
|
508
|
-
#
|
642
|
+
#
|
509
643
|
# Close all open tabs (except last one)
|
510
644
|
#
|
511
645
|
def close_all_tabs
|
512
646
|
#The collection has the activate tab first and then the rest sorted on number, so resort to get on descending position
|
513
647
|
quick_tabbuttons("Browser Window").sort {|t1, t2| (t2.position <=> t1.position) }.each do |btn|
|
514
648
|
#Tab button is in Browser window which is prob not the active window,
|
515
|
-
#so we cannot do this the easy way
|
649
|
+
#so we cannot do this the easy way
|
516
650
|
#btn.quick_button(:name, "pb_CloseButton").close_window_with_click("Document Window") unless btn.position == 0
|
517
651
|
#puts "Current tab = #{btn}"
|
518
652
|
if btn.position != 0 or btn.value > 1 then
|
519
653
|
quick_window(:name, "Browser Window").quick_tab(:pos, btn.position).quick_button(:name, "pb_CloseButton").close_window_with_click("Document Window")
|
520
|
-
end
|
654
|
+
end
|
521
655
|
end
|
522
656
|
end
|
523
|
-
|
657
|
+
|
524
658
|
#####################################################################
|
525
|
-
#
|
659
|
+
#
|
526
660
|
# Close all open dialogs
|
527
661
|
#
|
528
662
|
def close_all_dialogs
|
@@ -539,7 +673,61 @@ module OperaWatir
|
|
539
673
|
end
|
540
674
|
end
|
541
675
|
end
|
542
|
-
|
676
|
+
|
677
|
+
###############################################################
|
678
|
+
#
|
679
|
+
# key_press_with_condition(key, modifiers) { block } → res
|
680
|
+
#
|
681
|
+
#
|
682
|
+
# Performs the keypress specified and waits until block evaluates to true or timeout is hit
|
683
|
+
#
|
684
|
+
# @param [String] key - key to press
|
685
|
+
# @param *modifiers - modifier(s) to hold while pressing key
|
686
|
+
#
|
687
|
+
# @return value of block, or false if no block provided
|
688
|
+
#
|
689
|
+
def key_press_with_condition(key, *modifiers)
|
690
|
+
return false unless block_given?
|
691
|
+
|
692
|
+
key_press_direct(key, *modifiers)
|
693
|
+
|
694
|
+
start = Time.now
|
695
|
+
until res = yield rescue false do
|
696
|
+
if Time.now - start > ConditionTimeout
|
697
|
+
return false
|
698
|
+
end
|
699
|
+
sleep 0.1
|
700
|
+
end
|
701
|
+
res
|
702
|
+
end
|
703
|
+
|
704
|
+
###############################################################
|
705
|
+
#
|
706
|
+
# action_with_condition { block } → res
|
707
|
+
#
|
708
|
+
#
|
709
|
+
# Executes action and waits until block evaluates to true or timeout is hit.
|
710
|
+
#
|
711
|
+
# @param [String] action_name - name of action to execute
|
712
|
+
# @param *params - parameters to the action
|
713
|
+
#
|
714
|
+
# @return value of block, or false if no block provided
|
715
|
+
#
|
716
|
+
def action_with_condition(action_name, *params)
|
717
|
+
return false unless block_given?
|
718
|
+
|
719
|
+
opera_desktop_action(action_name, *params)
|
720
|
+
|
721
|
+
start = Time.now
|
722
|
+
until res = yield rescue false do
|
723
|
+
if Time.now - start > ConditionTimeout
|
724
|
+
return false
|
725
|
+
end
|
726
|
+
sleep 0.1
|
727
|
+
end
|
728
|
+
res
|
729
|
+
end
|
730
|
+
|
543
731
|
############################################################################
|
544
732
|
#
|
545
733
|
# Reset prefs
|
@@ -550,7 +738,7 @@ module OperaWatir
|
|
550
738
|
def reset_prefs(new_prefs)
|
551
739
|
driver.resetOperaPrefs(new_prefs)
|
552
740
|
end
|
553
|
-
|
741
|
+
|
554
742
|
##############################################################################
|
555
743
|
#
|
556
744
|
# Deletes profile for the connected Opera instance.
|
@@ -560,7 +748,7 @@ module OperaWatir
|
|
560
748
|
def delete_profile
|
561
749
|
driver.deleteOperaPrefs
|
562
750
|
end
|
563
|
-
|
751
|
+
|
564
752
|
# Set preference pref in prefs section prefs_section to value
|
565
753
|
# specified.
|
566
754
|
#
|
@@ -580,7 +768,7 @@ module OperaWatir
|
|
580
768
|
def get_preference(prefs_section, pref)
|
581
769
|
driver.getPref(prefs_section, pref)
|
582
770
|
end
|
583
|
-
|
771
|
+
|
584
772
|
# Get default value of preference pref in prefs section
|
585
773
|
# prefs_section.
|
586
774
|
#
|
@@ -591,37 +779,53 @@ module OperaWatir
|
|
591
779
|
def get_default_preference(prefs_section, pref)
|
592
780
|
driver.getDefaultPref(prefs_section, pref)
|
593
781
|
end
|
594
|
-
|
782
|
+
|
595
783
|
# @private
|
596
784
|
def start_opera
|
597
785
|
driver.startOpera
|
598
786
|
end
|
599
787
|
|
788
|
+
# Is attached browser instance of type internal build or public
|
789
|
+
# desktop?
|
790
|
+
#
|
791
|
+
# @return [Boolean] True if browser attached is of type desktop,
|
792
|
+
# false otherwise.
|
793
|
+
def desktop?
|
794
|
+
true # Not nice, but if you're running desktopbrowser, assume running desktop
|
795
|
+
end
|
796
|
+
|
600
797
|
private
|
601
798
|
|
799
|
+
def close_menu
|
800
|
+
wait_start
|
801
|
+
key_press_direct("Esc")
|
802
|
+
wait_for_menu_closed("")
|
803
|
+
end
|
804
|
+
|
805
|
+
|
602
806
|
def self.opera_driver_settings
|
603
807
|
@opera_driver_settings ||= OperaDriverSettings.new.tap {|s|
|
604
|
-
s.setRunOperaLauncherFromOperaDriver true
|
808
|
+
#s.setRunOperaLauncherFromOperaDriver true
|
605
809
|
s.setAutostart false if self.settings[:manual]
|
606
810
|
s.setOperaLauncherBinary self.settings[:launcher]
|
607
811
|
s.setOperaBinaryLocation self.settings[:path]
|
608
|
-
s.setOperaBinaryArguments self.settings[:args].to_s + ' -autotestmode'
|
812
|
+
# s.setOperaBinaryArguments self.settings[:args].to_s + ' -autotestmode'
|
609
813
|
s.setNoQuit self.settings[:no_quit]
|
610
814
|
s.setNoRestart self.settings[:no_restart]
|
611
815
|
s.setGuessOperaPath false
|
612
816
|
s.setUseOperaIdle false if !self.settings[:opera_idle]
|
613
817
|
}
|
614
818
|
end
|
615
|
-
|
819
|
+
|
616
820
|
# Gets the parent widget name of which there is none here
|
617
821
|
def parent_widget
|
618
822
|
nil
|
619
823
|
end
|
620
|
-
|
824
|
+
|
621
825
|
# Gets the window id to use for the search
|
622
826
|
def window_id
|
623
827
|
-1
|
624
828
|
end
|
625
829
|
end
|
626
|
-
|
830
|
+
|
627
831
|
end
|