operawatir 0.4.1.pre2-jruby → 0.4.1.pre3-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/CHANGES +233 -0
- data/VERSION +1 -1
- data/bin/desktopwatir +36 -16
- data/bin/operawatir +27 -14
- data/lib/operadriver/webdriver-opera.jar +0 -0
- data/lib/operawatir/compat/browser.rb +0 -5
- data/lib/operawatir/compat/collection.rb +2 -0
- data/lib/operawatir/compat/element.rb +3 -0
- data/lib/operawatir/compat/element_finders.rb +4 -0
- data/lib/operawatir/compat/selector.rb +7 -0
- data/lib/operawatir/compat/window.rb +8 -0
- data/lib/operawatir/compat.rb +3 -2
- data/lib/operawatir/desktop_browser.rb +18 -6
- data/lib/operawatir/desktop_helper.rb +2 -0
- data/lib/operawatir/quickwidgets/quick_addressfield.rb +12 -0
- data/lib/operawatir/quickwidgets/quick_checkbox.rb +1 -1
- data/lib/operawatir/quickwidgets/quick_editfield.rb +7 -4
- data/lib/operawatir/quickwidgets/quick_searchfield.rb +2 -0
- data/lib/operawatir/quickwidgets/quick_widget.rb +1 -1
- data/lib/operawatir/quickwidgets/quick_window.rb +6 -2
- data/lib/operawatir/screenshot.rb +46 -0
- data/lib/operawatir/window.rb +19 -16
- data/lib/operawatir.rb +1 -0
- data/operawatir.gemspec +23 -2
- data/spec/operawatir/core/screenshot_spec.rb +76 -0
- data/spec/operawatir/core/window_spec.rb +1 -12
- data/spec/operawatir/desktop/desktopbrowser_spec.rb +300 -0
- data/spec/operawatir/desktop/quickaddressfield_spec.rb +47 -0
- data/spec/operawatir/desktop/quickbutton_spec.rb +34 -0
- data/spec/operawatir/desktop/quickwidget_spec.rb +60 -0
- data/spec/operawatir/desktop/quickwindow_spec.rb +97 -0
- data/spec/operawatir/desktop/shared/shared.rb +48 -0
- data/spec/operawatir/matchers.rb +68 -0
- data/spec/operawatir/watirspec_desktophelper.rb +14 -0
- data/spec/operawatir/watirspec_helper.rb +1 -1
- data/spec/watir2/element_spec.rb +90 -21
- metadata +24 -3
@@ -1,6 +1,7 @@
|
|
1
1
|
module OperaWatir
|
2
2
|
module Compat
|
3
3
|
module Window
|
4
|
+
include Deprecated
|
4
5
|
|
5
6
|
# Checks whether the body has the given text in it.
|
6
7
|
#
|
@@ -22,6 +23,13 @@ module OperaWatir
|
|
22
23
|
|
23
24
|
alias_method :element_by_xpath, :elements_by_xpath
|
24
25
|
|
26
|
+
# Opera specific
|
27
|
+
def get_hash
|
28
|
+
visual_hash
|
29
|
+
end
|
30
|
+
|
31
|
+
deprecated :get_hash, 'browser.visual_hash'
|
32
|
+
|
25
33
|
end
|
26
34
|
end
|
27
35
|
end
|
data/lib/operawatir/compat.rb
CHANGED
@@ -2,7 +2,7 @@ module OperaWatir
|
|
2
2
|
|
3
3
|
module Compat; end
|
4
4
|
|
5
|
-
# Switches on compatibility layer (Watir
|
5
|
+
# Switches on compatibility layer (Watir 2 API).
|
6
6
|
def self.compatibility!
|
7
7
|
require 'operawatir/compat/browser'
|
8
8
|
require 'operawatir/compat/element_finders'
|
@@ -16,7 +16,8 @@ module OperaWatir
|
|
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.
|
19
|
-
|
19
|
+
|
20
|
+
require 'operawatir/compat/selector'
|
20
21
|
require 'operawatir/compat/collection'
|
21
22
|
require 'operawatir/compat/element'
|
22
23
|
end
|
@@ -3,9 +3,9 @@ module OperaWatir
|
|
3
3
|
include DesktopContainer
|
4
4
|
include DesktopCommon
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
"
|
6
|
+
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
|
|
10
10
|
# @private
|
11
11
|
def initialize
|
@@ -238,12 +238,24 @@ module OperaWatir
|
|
238
238
|
# puts quick_widget.to_s
|
239
239
|
# end
|
240
240
|
#
|
241
|
-
# @param
|
241
|
+
# @param window [String] name or [int] id of the window to retrieve the list of widgets from,
|
242
242
|
#
|
243
243
|
# @return [Array] Array of widgets retrieved from the window
|
244
244
|
#
|
245
|
-
def widgets(
|
246
|
-
|
245
|
+
def widgets(window)
|
246
|
+
|
247
|
+
# If window specifies window name, and the active window has this name
|
248
|
+
# use its id to get the widgets,
|
249
|
+
if window.is_a? String
|
250
|
+
active_win_id = driver.getActiveQuickWindowID()
|
251
|
+
active_win_name = driver.getQuickWindowName(active_win_id)
|
252
|
+
|
253
|
+
#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
|
255
|
+
window = active_win_id
|
256
|
+
end
|
257
|
+
end
|
258
|
+
driver.getQuickWidgetList(window).map do |java_widget|
|
247
259
|
case java_widget.getType
|
248
260
|
when QuickWidget::WIDGET_ENUM_MAP[:button]
|
249
261
|
QuickButton.new(self,java_widget)
|
@@ -14,7 +14,11 @@ module OperaWatir
|
|
14
14
|
# @param [String] URL to load
|
15
15
|
# @return [String] text in the address field after the page is loaded
|
16
16
|
# or a blank string
|
17
|
+
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
18
|
+
# using the specified method
|
17
19
|
def load_page_with_url(url)
|
20
|
+
# Must focus field before calling enter_text...
|
21
|
+
focus_with_click
|
18
22
|
# Enters text in a field and then hits enter
|
19
23
|
enter_text_and_hit_enter(url)
|
20
24
|
end
|
@@ -22,6 +26,10 @@ module OperaWatir
|
|
22
26
|
#
|
23
27
|
# Gets the visible text in the address field
|
24
28
|
#
|
29
|
+
# @return [String] visible text in address field
|
30
|
+
#
|
31
|
+
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
32
|
+
# using the specified method
|
25
33
|
def visible_text
|
26
34
|
element.getVisibleText()
|
27
35
|
end
|
@@ -29,6 +37,10 @@ module OperaWatir
|
|
29
37
|
#
|
30
38
|
# Gets the highlighted text in the address field
|
31
39
|
#
|
40
|
+
# @return [String] higlighted text in address field, if any, else empty
|
41
|
+
#
|
42
|
+
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
43
|
+
# using the specified method
|
32
44
|
def highlighted_text
|
33
45
|
element.getAdditionalText()
|
34
46
|
end
|
@@ -21,7 +21,7 @@ module OperaWatir
|
|
21
21
|
######################################################################
|
22
22
|
# Clicks a radio button or checkbox and toggles it state
|
23
23
|
#
|
24
|
-
# @return [
|
24
|
+
# @return [Boolean] the new state of the radio button or checkbox,
|
25
25
|
# false for not checked, or true for checked
|
26
26
|
#
|
27
27
|
# @raise [DesktopExceptions::WidgetNotVisibleException] if the checkbox
|
@@ -45,9 +45,9 @@ module OperaWatir
|
|
45
45
|
######################################################################
|
46
46
|
# Clears the contents of the edit field
|
47
47
|
#
|
48
|
-
# @note The edit field must have focus for this method to work
|
49
|
-
#
|
50
48
|
def clear
|
49
|
+
focus_with_click
|
50
|
+
|
51
51
|
key_press_direct("a", :ctrl)
|
52
52
|
key_press_direct("backspace")
|
53
53
|
|
@@ -96,10 +96,13 @@ module OperaWatir
|
|
96
96
|
def enter_text_and_hit_enter(text)
|
97
97
|
loaded_url = ""
|
98
98
|
|
99
|
+
# OBS: only caller should set focus, if not this will happily type
|
100
|
+
# away in the incorrect field, if for example called from subclass address_field
|
99
101
|
# Set focus
|
100
|
-
focus_with_click
|
102
|
+
# focus_with_click
|
103
|
+
|
101
104
|
# Clear the field
|
102
|
-
clear
|
105
|
+
clear
|
103
106
|
# Type in the text
|
104
107
|
typed_text = type_text(text) #Opens dropdown window
|
105
108
|
# Check that some text was typed, note the text might be changed in the
|
@@ -303,7 +303,7 @@ private
|
|
303
303
|
|
304
304
|
# Click widget
|
305
305
|
def click(button = :left, times = 1, *opts)
|
306
|
-
raise
|
306
|
+
raise DesktopExceptions::WidgetDisabledException, "Element #{@selector} is disabled" unless enabled?
|
307
307
|
|
308
308
|
#Some buttons etc. aren't visible until hovering them
|
309
309
|
if (visible? == false and type != :dialogtab)
|
@@ -32,6 +32,8 @@ module OperaWatir
|
|
32
32
|
#
|
33
33
|
# @return [Symbol] type of the window (e.g. :dropdown, :button)
|
34
34
|
#
|
35
|
+
# @raise [Exceptions::UnknownObjectException] if the widget could not be found
|
36
|
+
# using the specified method
|
35
37
|
def type
|
36
38
|
return WINDOW_ENUM_MAP.invert[@elm.getType] unless @elm == nil
|
37
39
|
return WINDOW_ENUM_MAP.invert[element.getType]
|
@@ -149,8 +151,10 @@ private
|
|
149
151
|
case @method
|
150
152
|
when :name
|
151
153
|
# Use active window when specifying by name "Document Window"
|
152
|
-
# and not the first if there are more than one
|
153
|
-
|
154
|
+
# and not the first if there are more than one
|
155
|
+
active_window_id = driver.getActiveQuickWindowID()
|
156
|
+
name = driver.getQuickWindowName(active_window_id);
|
157
|
+
if (@selector == "Document Window" && name == "Document Window")
|
154
158
|
@element = driver.findWindowById(driver.getActiveQuickWindowID())
|
155
159
|
else
|
156
160
|
@element = driver.findWindowByName(@selector)
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class OperaWatir::Screenshot
|
2
|
+
|
3
|
+
attr_accessor :browser, :reply
|
4
|
+
|
5
|
+
def initialize(parent)
|
6
|
+
self.browser = parent.browser
|
7
|
+
self.reply = driver.saveScreenshot(2, [].to_java(:string))
|
8
|
+
end
|
9
|
+
|
10
|
+
# Saves screenshot to specified location.
|
11
|
+
#
|
12
|
+
# @param [String] Path to where you want the screenshot saved.
|
13
|
+
# @return [String] The full path to the file that was saved.
|
14
|
+
def save(filename)
|
15
|
+
File.open(filename, 'w') { |f| f.write png }
|
16
|
+
File.expand_path filename
|
17
|
+
end
|
18
|
+
|
19
|
+
# Is the screenshot blank?
|
20
|
+
#
|
21
|
+
# @return [Boolean] True/false depending on the screenshot is blank.
|
22
|
+
def blank?
|
23
|
+
reply.isBlank
|
24
|
+
end
|
25
|
+
|
26
|
+
# Returns the raw byte string of the screenshot in PNG format.
|
27
|
+
#
|
28
|
+
# @return [String] A png image in a raw byte string.
|
29
|
+
def png
|
30
|
+
String.from_java_bytes reply.getPng
|
31
|
+
end
|
32
|
+
|
33
|
+
# Lets you get a MD5 sum of the screen.
|
34
|
+
#
|
35
|
+
# @return [String] A hash.
|
36
|
+
def md5
|
37
|
+
reply.getMd5
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def driver
|
43
|
+
browser.driver
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/lib/operawatir/window.rb
CHANGED
@@ -105,26 +105,22 @@ class OperaWatir::Window
|
|
105
105
|
|
106
106
|
# Opera-specific
|
107
107
|
|
108
|
-
#
|
108
|
+
# Creates a Screenshot interface or saves screenshot to specified
|
109
|
+
# location if a file path is given.
|
109
110
|
#
|
110
|
-
# @param [String]
|
111
|
-
#
|
112
|
-
# @param [Hash] hashes A list of hashes to compare. If the hashes
|
113
|
-
# match the hashes of what you are trying to take a screenshot of,
|
114
|
-
# this method will return a boolean value instead of an actual
|
115
|
-
# screenshot.
|
116
|
-
# @param [Integer] time_out Specifies how long we should wait before
|
117
|
-
# timing out.
|
111
|
+
# @param [String] file_name The absolute path to the location where
|
112
|
+
# you want the screenshot saved.
|
118
113
|
#
|
119
|
-
# @return [Object]
|
120
|
-
# @return [
|
121
|
-
|
122
|
-
|
123
|
-
|
114
|
+
# @return [Object] A Screenshot object.
|
115
|
+
# @return [String] Filename to the saved file.
|
116
|
+
def screenshot(filename=nil)
|
117
|
+
# TODO: This should call document.screenshot instead, but that
|
118
|
+
# requires a generic ScreenShotReply interface in OperaDriver.
|
119
|
+
filename.nil? ? OperaWatir::Screenshot.new(self) : OperaWatir::Screenshot.new(self).save(filename)
|
124
120
|
end
|
125
121
|
|
126
|
-
def visual_hash
|
127
|
-
document.visual_hash
|
122
|
+
def visual_hash
|
123
|
+
document.visual_hash
|
128
124
|
end
|
129
125
|
|
130
126
|
# Raw finders
|
@@ -140,6 +136,13 @@ class OperaWatir::Window
|
|
140
136
|
alias_method :find_by_class, :find_by_class_name
|
141
137
|
alias_method :find_by_tag, :find_by_tag_name
|
142
138
|
|
139
|
+
# Finds the document of a page.
|
140
|
+
#
|
141
|
+
# @return [Element] The body/document of a page.
|
142
|
+
def document
|
143
|
+
find_by_tag('body')
|
144
|
+
end
|
145
|
+
|
143
146
|
# Finds all elements in document.
|
144
147
|
#
|
145
148
|
# @return [Collection] A collection of elements.
|
data/lib/operawatir.rb
CHANGED
data/operawatir.gemspec
CHANGED
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{operawatir}
|
8
|
-
s.version = "0.4.1.
|
8
|
+
s.version = "0.4.1.pre3"
|
9
9
|
s.platform = %q{jruby}
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.authors = ["Andreas Tolf Tolfsen", "Chris Lloyd", "Stuart Knightley", "Deniz Turkoglu"]
|
13
|
-
s.date = %q{2011-03-
|
13
|
+
s.date = %q{2011-03-14}
|
14
14
|
s.description = %q{ OperaWatir is a part of the Watir (pronounced water) family of
|
15
15
|
free software Ruby libraries for automating web browsers.
|
16
16
|
OperaWatir provides a querying engine and Ruby bindings for a
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
".gitmodules",
|
28
28
|
".yardopts",
|
29
29
|
"AUTHORS",
|
30
|
+
"CHANGES",
|
30
31
|
"Gemfile",
|
31
32
|
"LICENSE",
|
32
33
|
"README.md",
|
@@ -49,6 +50,7 @@ Gem::Specification.new do |s|
|
|
49
50
|
"lib/operawatir/compat/collection.rb",
|
50
51
|
"lib/operawatir/compat/element.rb",
|
51
52
|
"lib/operawatir/compat/element_finders.rb",
|
53
|
+
"lib/operawatir/compat/selector.rb",
|
52
54
|
"lib/operawatir/compat/window.rb",
|
53
55
|
"lib/operawatir/desktop-waiter.rb",
|
54
56
|
"lib/operawatir/desktop_browser.rb",
|
@@ -80,6 +82,7 @@ Gem::Specification.new do |s|
|
|
80
82
|
"lib/operawatir/quickwidgets/quick_treeview.rb",
|
81
83
|
"lib/operawatir/quickwidgets/quick_widget.rb",
|
82
84
|
"lib/operawatir/quickwidgets/quick_window.rb",
|
85
|
+
"lib/operawatir/screenshot.rb",
|
83
86
|
"lib/operawatir/selector.rb",
|
84
87
|
"lib/operawatir/spatnav.rb",
|
85
88
|
"lib/operawatir/version.rb",
|
@@ -101,8 +104,15 @@ Gem::Specification.new do |s|
|
|
101
104
|
"spec/operawatir/core/browser_spec.rb",
|
102
105
|
"spec/operawatir/core/element_spec.rb",
|
103
106
|
"spec/operawatir/core/preferences_spec.rb",
|
107
|
+
"spec/operawatir/core/screenshot_spec.rb",
|
104
108
|
"spec/operawatir/core/spatnav_spec.rb",
|
105
109
|
"spec/operawatir/core/window_spec.rb",
|
110
|
+
"spec/operawatir/desktop/desktopbrowser_spec.rb",
|
111
|
+
"spec/operawatir/desktop/quickaddressfield_spec.rb",
|
112
|
+
"spec/operawatir/desktop/quickbutton_spec.rb",
|
113
|
+
"spec/operawatir/desktop/quickwidget_spec.rb",
|
114
|
+
"spec/operawatir/desktop/quickwindow_spec.rb",
|
115
|
+
"spec/operawatir/desktop/shared/shared.rb",
|
106
116
|
"spec/operawatir/fixtures/boxes.html",
|
107
117
|
"spec/operawatir/fixtures/grid.html",
|
108
118
|
"spec/operawatir/fixtures/input_fields_value.html",
|
@@ -110,8 +120,10 @@ Gem::Specification.new do |s|
|
|
110
120
|
"spec/operawatir/fixtures/paragraphs.html",
|
111
121
|
"spec/operawatir/fixtures/two_input_fields.html",
|
112
122
|
"spec/operawatir/guards.rb",
|
123
|
+
"spec/operawatir/matchers.rb",
|
113
124
|
"spec/operawatir/server.rb",
|
114
125
|
"spec/operawatir/watirspec.rake",
|
126
|
+
"spec/operawatir/watirspec_desktophelper.rb",
|
115
127
|
"spec/operawatir/watirspec_helper.rb",
|
116
128
|
"spec/watir2/area_spec.rb",
|
117
129
|
"spec/watir2/areas_spec.rb",
|
@@ -249,10 +261,19 @@ Gem::Specification.new do |s|
|
|
249
261
|
"spec/operawatir/core/browser_spec.rb",
|
250
262
|
"spec/operawatir/core/element_spec.rb",
|
251
263
|
"spec/operawatir/core/preferences_spec.rb",
|
264
|
+
"spec/operawatir/core/screenshot_spec.rb",
|
252
265
|
"spec/operawatir/core/spatnav_spec.rb",
|
253
266
|
"spec/operawatir/core/window_spec.rb",
|
267
|
+
"spec/operawatir/desktop/desktopbrowser_spec.rb",
|
268
|
+
"spec/operawatir/desktop/quickaddressfield_spec.rb",
|
269
|
+
"spec/operawatir/desktop/quickbutton_spec.rb",
|
270
|
+
"spec/operawatir/desktop/quickwidget_spec.rb",
|
271
|
+
"spec/operawatir/desktop/quickwindow_spec.rb",
|
272
|
+
"spec/operawatir/desktop/shared/shared.rb",
|
254
273
|
"spec/operawatir/guards.rb",
|
274
|
+
"spec/operawatir/matchers.rb",
|
255
275
|
"spec/operawatir/server.rb",
|
276
|
+
"spec/operawatir/watirspec_desktophelper.rb",
|
256
277
|
"spec/operawatir/watirspec_helper.rb",
|
257
278
|
"spec/watir2/area_spec.rb",
|
258
279
|
"spec/watir2/areas_spec.rb",
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require File.expand_path('../../watirspec_helper', __FILE__)
|
2
|
+
require 'tmpdir'
|
3
|
+
|
4
|
+
RSpec::Matchers.define :save_file do
|
5
|
+
match { |filename| File.exists? filename }
|
6
|
+
end
|
7
|
+
|
8
|
+
RSpec::Matchers.define :be_boolean do
|
9
|
+
match { |variable| !!variable == variable }
|
10
|
+
end
|
11
|
+
|
12
|
+
describe 'Screenshot' do
|
13
|
+
|
14
|
+
before :all do
|
15
|
+
browser.url = fixture('boxes.html')
|
16
|
+
@screenshot = window.screenshot
|
17
|
+
@filename = "#{Dir.tmpdir}/screenshot.png"
|
18
|
+
end
|
19
|
+
|
20
|
+
describe '#new' do
|
21
|
+
context 'given no argument' do
|
22
|
+
it 'creates a new Screenshot object' do
|
23
|
+
@screenshot.should be_kind_of OperaWatir::Screenshot
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'given an argument' do
|
28
|
+
it 'saves a screenshot' do
|
29
|
+
window.screenshot(@filename).should save_file
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe '#save' do
|
35
|
+
it 'saves screenshot to disk' do
|
36
|
+
@screenshot.save(@filename).should save_file
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe '#blank?' do
|
41
|
+
it 'returns a valid type' do
|
42
|
+
@screenshot.blank?.should be_boolean
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'is not blank' do
|
46
|
+
@screenshot.blank?.should be_false
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe '#png' do
|
51
|
+
before(:all) { @png = @screenshot.png }
|
52
|
+
|
53
|
+
it 'returns a valid type' do
|
54
|
+
@png.should be_kind_of String
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'is a real type PNG image' do
|
58
|
+
@png.should match /PNG/
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe '#md5' do
|
63
|
+
before(:all) { @md5 = @screenshot.md5 }
|
64
|
+
|
65
|
+
it 'returns a valid type' do
|
66
|
+
@md5.should be_kind_of String
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'returns a hash' do
|
70
|
+
@md5.should match /^(0x)[a-f0-9]{32}$/
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
after(:all) { File.delete @filename if File.exists? @filename }
|
75
|
+
|
76
|
+
end
|