watirsplash 0.2.7 → 0.2.8
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/History.rdoc +4 -0
- data/VERSION +1 -1
- data/lib/watirsplash/watir.rb +0 -179
- data/lib/watirsplash.rb +2 -0
- metadata +6 -7
- data/lib/watirsplash/watir_core.rb +0 -79
data/History.rdoc
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.8
|
data/lib/watirsplash/watir.rb
CHANGED
@@ -8,113 +8,12 @@ end
|
|
8
8
|
# patches for Watir
|
9
9
|
module Watir
|
10
10
|
class IE #:nodoc:all
|
11
|
-
READYSTATE_INTERACTIVE = 3
|
12
|
-
|
13
11
|
include WaitHelper
|
14
|
-
|
15
|
-
# This is Watir's overriden wait method, which is used in many places for deciding
|
16
|
-
# if browser is ready or not. We have to patch one line in it to work properly
|
17
|
-
# when file save as dialog has been displayed. For some reason READYSTATE (4)
|
18
|
-
# property value will be READYSTATE_INTERACTIVE (3) after file has been downloaded
|
19
|
-
# and not 4, thus wait will stay blocking.
|
20
|
-
# read more about IE READYSTATE property:
|
21
|
-
# http://msdn.microsoft.com/en-us/library/aa768362(VS.85).aspx
|
22
|
-
#
|
23
|
-
# Block execution until the page has loaded.
|
24
|
-
# Raises Timeout::Error if page is not loaded within 5 minutes.
|
25
|
-
# =nodoc
|
26
|
-
# Note: This code needs to be prepared for the ie object to be closed at
|
27
|
-
# any moment!
|
28
|
-
def wait(no_sleep=false)
|
29
|
-
@xml_parser_doc = nil
|
30
|
-
@down_load_time = 0.0
|
31
|
-
a_moment = 0.2 # seconds
|
32
|
-
start_load_time = Time.now
|
33
|
-
timeout = 5*60
|
34
|
-
timeout_error = Timeout::Error.new("Failed to load page within #{timeout} seconds!")
|
35
|
-
begin
|
36
|
-
while @ie.busy
|
37
|
-
sleep a_moment
|
38
|
-
raise timeout_error if Time.now - start_load_time >= timeout
|
39
|
-
end
|
40
|
-
# this is the line which has been changed to accept also state 3
|
41
|
-
until @ie.readyState == READYSTATE_INTERACTIVE ||
|
42
|
-
@ie.readyState == READYSTATE_COMPLETE do
|
43
|
-
sleep a_moment
|
44
|
-
raise timeout_error if Time.now - start_load_time >= timeout
|
45
|
-
end
|
46
|
-
sleep a_moment
|
47
|
-
until @ie.document do
|
48
|
-
sleep a_moment
|
49
|
-
raise timeout_error if Time.now - start_load_time >= timeout
|
50
|
-
end
|
51
|
-
|
52
|
-
documents_to_wait_for = [@ie.document]
|
53
|
-
|
54
|
-
rescue WIN32OLERuntimeError # IE window must have been closed
|
55
|
-
@down_load_time = Time.now - start_load_time
|
56
|
-
sleep @pause_after_wait unless no_sleep
|
57
|
-
return @down_load_time
|
58
|
-
end
|
59
|
-
|
60
|
-
while doc = documents_to_wait_for.shift
|
61
|
-
begin
|
62
|
-
until doc.readyState == "complete" do
|
63
|
-
sleep a_moment
|
64
|
-
raise timeout_error if Time.now - start_load_time >= timeout
|
65
|
-
end
|
66
|
-
@url_list << doc.location.href unless @url_list.include?(doc.location.href)
|
67
|
-
doc.frames.length.times do |n|
|
68
|
-
begin
|
69
|
-
documents_to_wait_for << doc.frames[n.to_s].document
|
70
|
-
rescue WIN32OLERuntimeError, NoMethodError
|
71
|
-
end
|
72
|
-
end
|
73
|
-
rescue WIN32OLERuntimeError
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
@down_load_time = Time.now - start_load_time
|
78
|
-
run_error_checks
|
79
|
-
sleep @pause_after_wait unless no_sleep
|
80
|
-
@down_load_time
|
81
|
-
end
|
82
|
-
|
83
|
-
# Closes the browser even if #wait throws an exception.
|
84
|
-
# It happens mostly when #run_error_checks throws some exception.
|
85
|
-
def close
|
86
|
-
return unless exists?
|
87
|
-
@closing = true
|
88
|
-
@ie.stop
|
89
|
-
wait rescue nil
|
90
|
-
chwnd = @ie.hwnd.to_i
|
91
|
-
@ie.quit
|
92
|
-
while Win32API.new("user32", "IsWindow", 'L', 'L').Call(chwnd) == 1
|
93
|
-
sleep 0.3
|
94
|
-
end
|
95
|
-
end
|
96
12
|
end
|
97
13
|
|
98
14
|
class Element #:nodoc:all
|
99
15
|
include ElementExtensions
|
100
16
|
|
101
|
-
def_wrap_guard :currentstyle
|
102
|
-
|
103
|
-
# returns current style instead of inline style
|
104
|
-
# http://msdn.microsoft.com/en-us/library/ms535231(VS.85).aspx
|
105
|
-
def style
|
106
|
-
currentstyle
|
107
|
-
end
|
108
|
-
|
109
|
-
def click_no_wait
|
110
|
-
assert_enabled
|
111
|
-
|
112
|
-
highlight(:set)
|
113
|
-
element = "#{self.class}.new(#{@page_container.attach_command}, :unique_number, #{self.unique_number})"
|
114
|
-
@page_container.click_no_wait(element)
|
115
|
-
highlight(:clear)
|
116
|
-
end
|
117
|
-
|
118
17
|
# saves a file with the browser
|
119
18
|
#
|
120
19
|
# clicking the button opens a browser's save as dialog and saves the file document.pdf
|
@@ -146,82 +45,4 @@ module Watir
|
|
146
45
|
end
|
147
46
|
end
|
148
47
|
|
149
|
-
module PageContainer #:nodoc:all
|
150
|
-
def click_no_wait(element)
|
151
|
-
ruby_code = "require 'rubygems';" <<
|
152
|
-
"require '#{File.expand_path(File.dirname(__FILE__))}/watir_core';" <<
|
153
|
-
"#{element}.click!"
|
154
|
-
system(spawned_click_no_wait_command(ruby_code))
|
155
|
-
end
|
156
|
-
|
157
|
-
def spawned_click_no_wait_command(command)
|
158
|
-
unless $VERBOSE
|
159
|
-
"start rubyw -e #{command.inspect}"
|
160
|
-
else
|
161
|
-
puts "#click_no_wait command:"
|
162
|
-
command = "ruby -e #{command.inspect}"
|
163
|
-
puts command
|
164
|
-
command
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
private :spawned_click_no_wait_command
|
169
|
-
end
|
170
|
-
|
171
|
-
class Table < Element
|
172
|
-
|
173
|
-
# This method returns multi-dimensional array of the cell texts in table.
|
174
|
-
#
|
175
|
-
# Works with tr, th, td elements, colspan, rowspan and nested tables.
|
176
|
-
# Takes an optional parameter *max_depth*, which is by default 1
|
177
|
-
def to_a(max_depth=1)
|
178
|
-
assert_exists
|
179
|
-
y = []
|
180
|
-
@o.rows.each do |row|
|
181
|
-
y << TableRow.new(@container, :ole_object, row).to_a(max_depth)
|
182
|
-
end
|
183
|
-
y
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
class TableRow < Element
|
188
|
-
|
189
|
-
# This method returns (multi-dimensional) array of the cell texts in table's row.
|
190
|
-
#
|
191
|
-
# Works with th, td elements, colspan, rowspan and nested tables.
|
192
|
-
# Takes an optional parameter *max_depth*, which is by default 1
|
193
|
-
def to_a(max_depth=1)
|
194
|
-
assert_exists
|
195
|
-
y = []
|
196
|
-
@o.cells.each do |cell|
|
197
|
-
inner_tables = cell.getElementsByTagName("TABLE")
|
198
|
-
inner_tables.each do |inner_table|
|
199
|
-
# make sure that the inner table is directly child for this cell
|
200
|
-
if inner_table?(cell, inner_table)
|
201
|
-
max_depth -= 1
|
202
|
-
y << Table.new(@container, :ole_object, inner_table).to_a(max_depth) if max_depth >= 1
|
203
|
-
end
|
204
|
-
end
|
205
|
-
|
206
|
-
if inner_tables.length == 0
|
207
|
-
y << cell.innerText.strip
|
208
|
-
end
|
209
|
-
end
|
210
|
-
y
|
211
|
-
end
|
212
|
-
|
213
|
-
private
|
214
|
-
# returns true if inner_table is direct child
|
215
|
-
# table for cell and there's not any table-s in between
|
216
|
-
def inner_table?(cell, inner_table)
|
217
|
-
parent_element = inner_table.parentElement
|
218
|
-
if parent_element.uniqueID == cell.uniqueID
|
219
|
-
return true
|
220
|
-
elsif parent_element.tagName == "TABLE"
|
221
|
-
return false
|
222
|
-
else
|
223
|
-
return inner_table?(cell, parent_element)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
end
|
227
48
|
end
|
data/lib/watirsplash.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: watirsplash
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 7
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 8
|
10
|
+
version: 0.2.8
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jarmo Pertman
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-10-06 00:00:00 +03:00
|
19
19
|
default_executable: watirsplash
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -164,7 +164,6 @@ files:
|
|
164
164
|
- lib/watirsplash/util.rb
|
165
165
|
- lib/watirsplash/wait_helper.rb
|
166
166
|
- lib/watirsplash/watir.rb
|
167
|
-
- lib/watirsplash/watir_core.rb
|
168
167
|
- spec/spec.opts
|
169
168
|
- spec/spec_helper_spec.rb
|
170
169
|
- spec/spec_match_array_spec.rb
|
@@ -188,7 +187,7 @@ licenses: []
|
|
188
187
|
post_install_message: |-
|
189
188
|
*************************
|
190
189
|
|
191
|
-
Thank you for installing WatirSplash 0.2.
|
190
|
+
Thank you for installing WatirSplash 0.2.8! Don't forget to take a look at README and History files!
|
192
191
|
|
193
192
|
Execute "watirsplash generate" under your project's directory to generate default project structure.
|
194
193
|
|
@@ -227,7 +226,7 @@ rubyforge_project:
|
|
227
226
|
rubygems_version: 1.3.7
|
228
227
|
signing_key:
|
229
228
|
specification_version: 3
|
230
|
-
summary: watirsplash 0.2.
|
229
|
+
summary: watirsplash 0.2.8
|
231
230
|
test_files:
|
232
231
|
- spec/spec_helper_spec.rb
|
233
232
|
- spec/spec_match_array_spec.rb
|
@@ -1,79 +0,0 @@
|
|
1
|
-
# these require statements are needed for Watir
|
2
|
-
# to work with minimum functionality
|
3
|
-
#
|
4
|
-
# this is needed for #click_no_wait to perform faster
|
5
|
-
module Watir
|
6
|
-
# dummy modules for patching
|
7
|
-
module Win32
|
8
|
-
end
|
9
|
-
|
10
|
-
module Utils
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
|
15
|
-
require 'watir/win32ole'
|
16
|
-
require 'logger'
|
17
|
-
require 'watir/exceptions'
|
18
|
-
require 'watir/matches'
|
19
|
-
|
20
|
-
require 'watir/core_ext'
|
21
|
-
require 'watir/logger'
|
22
|
-
require 'watir/container'
|
23
|
-
require 'watir/locator'
|
24
|
-
require 'watir/page-container'
|
25
|
-
require 'watir/ie-class'
|
26
|
-
require 'watir/element'
|
27
|
-
require 'watir/element_collections'
|
28
|
-
require 'watir/form'
|
29
|
-
require 'watir/non_control_elements'
|
30
|
-
require 'watir/input_elements'
|
31
|
-
require 'watir/table'
|
32
|
-
require 'watir/image'
|
33
|
-
require 'watir/link'
|
34
|
-
begin
|
35
|
-
require 'watir/html_element'
|
36
|
-
rescue LoadError
|
37
|
-
# this exists currently only on github
|
38
|
-
end
|
39
|
-
|
40
|
-
require 'watir/waiter'
|
41
|
-
|
42
|
-
# watir/module
|
43
|
-
module Watir
|
44
|
-
include Watir::Exception
|
45
|
-
|
46
|
-
# Directory containing the watir.rb file
|
47
|
-
@@dir = File.expand_path(File.dirname(__FILE__))
|
48
|
-
|
49
|
-
ATTACHER = Waiter.new
|
50
|
-
# Like regular Ruby "until", except that a TimeOutException is raised
|
51
|
-
# if the timeout is exceeded. Timeout is IE.attach_timeout.
|
52
|
-
def self.until_with_timeout # block
|
53
|
-
ATTACHER.timeout = IE.attach_timeout
|
54
|
-
ATTACHER.wait_until { yield }
|
55
|
-
end
|
56
|
-
|
57
|
-
@@autoit = nil
|
58
|
-
|
59
|
-
def self.autoit
|
60
|
-
unless @@autoit
|
61
|
-
begin
|
62
|
-
@@autoit = WIN32OLE.new('AutoItX3.Control')
|
63
|
-
rescue WIN32OLERuntimeError
|
64
|
-
_register('AutoItX3.dll')
|
65
|
-
@@autoit = WIN32OLE.new('AutoItX3.Control')
|
66
|
-
end
|
67
|
-
end
|
68
|
-
@@autoit
|
69
|
-
end
|
70
|
-
|
71
|
-
def self._register(dll)
|
72
|
-
system("regsvr32.exe /s " + "#{@@dir}/#{dll}".gsub('/', '\\'))
|
73
|
-
end
|
74
|
-
|
75
|
-
def self._unregister(dll)
|
76
|
-
system("regsvr32.exe /s /u " + "#{@@dir}/#{dll}".gsub('/', '\\'))
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|