[Wtr-general] Javascript dialogs - reading and closing
Dave Burt
dave at burt.id.au
Wed Aug 31 04:07:26 EDT 2005
Hi List,
I've been using the following script to read and close javascript
alert() and confirm() dialogs in Watir. It could fairly easily be extended to
deal with file choosers, as I saw someone asking for earlier.
To be clear, it will wait a dialog to be shown and close it using the given
button, and it can test for certain text in the dialog itself. It lets you do
this:
require 'js_dialog'
assert_js_dialog do
@ie.button(:value, "Alert test").click
end
assert_js_dialog /sample dialog text/, "Cancel" do
@ie.button(:value, "Confirm test").click
end
Code below.
Cheers,
Dave
----- js_dialog.rb -----
require 'win32ole'
#
# Use AutoIt to read and close Javascript dialog windows
#
module JavascriptDialog
#
# Target javascript dialogs with this window title
#
WINDOW_TITLE = "Microsoft Internet Explorer"
class << self
#
# Return the text contained in a javascript dialog (e.g. an "alert()")
# if such a dialog is present or appears within +wait_seconds+.
#
def text(wait_seconds = 1)
# sleep 0.3
autoit.WinWait(WINDOW_TITLE, nil, wait_seconds) if wait_seconds
s = autoit.WinGetText(WINDOW_TITLE)
s unless s == "1"
end
#
# Close any active javascript dialog
#
def close
autoit.WinClose WINDOW_TITLE
end
#
# Press the "OK" button on a javascript dialog
#
def ok
autoit.ControlClick(WINDOW_TITLE, "", "OK")
end
#
# Press the "Cancel" button on a javascript dialog
#
def cancel
autoit.ControlClick(WINDOW_TITLE, "", "Cancel")
end
#
# Press the "Yes" button on a javascript dialog
#
def yes
autoit.ControlClick(WINDOW_TITLE, "", "Yes")
end
#
# Press the "No" button on a javascript dialog
#
def no
autoit.ControlClick(WINDOW_TITLE, "", "No")
end
private
#
# Return an AutoIt COM object, creating it if it doesn't already
# exist
#
def autoit
unless defined? @@autoit
@@autoit = WIN32OLE.new("AutoItX3.Control")
end
@@autoit
end
end
end
module Test::Unit::Assertions
#
# Passes if a Javascript dialog appears within +wait_seconds+ and its
# text matches the given (optional) pattern.
#
# Use like this:
# assert_js_dialog do
# watir_command_to_make_dialog_appear
# end
# Or like this:
# assert_js_dialog /Text to find in the dialog/, "Cancel" do
# watir_command_to_make_dialog_appear
# end
#
def assert_js_dialog(pattern = //, action = "close", message = nil)
_wrap_assertion do
begin
pipe = IO.popen("ruby js_dialog.rb #{action}")
yield
window_text = pipe.read rescue ""
pipe.close
unless window_text.empty?
assert_block(build_message(message,
"<?> not found in JavaScript dialog.", pattern)) do
window_text.match(pattern)
end
else
raise Test::Unit::AssertionFailedError.new(
build_message(message, "No JavaScript window found."))
end
ensure
pipe.close if pipe && !pipe.closed?
end
end
end
end
# test - will close and print the text of an opened javascript dialog if
# run as "ruby js_dialog.rb"
if $0 == __FILE__
action = ARGV.shift || "close"
print JavascriptDialog.text || ""
JavascriptDialog.send action
end
More information about the Wtr-general
mailing list