[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