fxzeng

ruby && watir

统计

留言簿(2)

阅读排行榜

评论排行榜

watir 处理弹出窗口 [fxzeng 原创]

watir 处理弹出窗口 [fxzeng 原创] (转载请保留此标志)

fxzeng
mail: fxzeng@126.com


处理弹出窗口是进行web测试的必经之路, 对于对于初学者这似乎是一个并不太好解决的问题, watir 自带的unittests里有这样的例子,但是牵扯的文件多, 而且还涉及到块的调用, 往往初学者只能照葫芦画瓢的解决这个问题.

这里介绍一种简便的处理方法, 先看看unittests中是如何处理弹出窗口的:
共牵扯到三个文件
#-----------------unittests/jscript_test.rb-------------------------------
     # check_dialog, to create a new thread to help push the dialog button
     #
    def check_dialog(extra_file, expected_result, &block)
        goto_javascript_page()
       
Thread.new { system("rubyw \"#{$mydir}\\#{extra_file}.rb\"") }
        # system(), call win cmd to run
jscriptExtraAlert.rb

        block.call
        testResult = $ie.text_field(:id, "testResult").value
        assert_match( expected_result, testResult ) 
    end

    # test method
    def test_alert_button()
        check_dialog('jscriptExtraAlert', /Alert OK/){ $ie.button(:id, 'btnAlert').click }
    end
#--------------END--jscript_test.rb-------------------------------

#---------------unittests/jscriptExtraAlert.rb-------------------------------
$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..') if $0 == __FILE__

require 'watir/WindowHelper'

helper = WindowHelper.new
helper.push_alert_button()


#-------------END--jscriptExtraAlert.rb-------------------------------

#-------------watir/WindowHelper.rb------------------------------
require 'win32ole'

class WindowHelper
    def initialize( )
        @autoit = WIN32OLE.new('AutoItX3.Control')
    end

    def push_alert_button()
        @autoit.WinWait "Microsoft Internet Explorer", ""
        @autoit.Send "{ENTER}"
    end
#------------END--WindowHelper.rb--------------------------
文件之间的调用关系真是够复杂的, : ) 涉及到了三个文件, 如果需要按Cancel键的话还得增加一个jscriptExtraConfirmCancel.rb, 需要处理安全警告的话还得增加一个...., 或许你会说, 这些文件都不复杂, 写在主文件里不就行了么, 干吗还得调用文件?? 呵呵, 试试就知道为什么了...
这里介绍的方法用一个文件就可以代替原来的多个文件, 即可以处理确认, 撤消, 安全警告, 选择文件等多种情况的弹出窗口.
#----------main-method-----------------------------
def test_push_button
    ... ...
    thrs = []
    thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb Microsoft delete TAB ENTER")}
    # Microsoft, title of the popup window, delete, text contained in the window, TAB ENTER, push TAB key then ENTER
    thrs << Thread.new{$ie.button(:id, 'btnAlert').click }
    thrs.each{|x| x.join}
    ... ...
end
#---------END--main-method--------------------

#--------myWinHelper.rb-----------------------
require 'win32ole'

autoit = WIN32OLE.new"AutoItX3.Control"

title = ARGV[0]
texts = ARGV[1]
operation = []
for i in 2..(ARGV.lengh - 3)
    operaton << ARGV[i]
end
autoit.WinWait(title,texts)
operatoin.each{|x|
    autoit.Send"{x}"
}
#---------END--myWinHelper.rb------------

这样, 弹出窗口问题就可以轻松解决了, 只需一个myWinHelper.rb就可以处理确定取消等常见问题, 这里的myWinHelper.rb只是一个例子, 如果有兴趣, 可以在里面添加语句, 可以轻松处理更多问题, 比如
安全警告窗口:
    thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb \"TAB 3\" ENTER")}
    # push TAB key three times, and ENTER
选择文件窗口:
    thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb d:\\file\\test.txt !o")}
    # enter the directory of the file, and then push Alt+o

watir 处理弹出窗口 [fxzeng 原创]

fxzeng
mail: fxzeng@126.com

posted on 2006-09-02 19:50 Fxzeng's space 阅读(1975) 评论(3)  编辑 收藏 引用

评论

# re: watir 处理弹出窗口 [fxzeng 原创] 2006-09-28 23:32 appurple

你这样做的话,根本没有封装,对于一个弹出窗口就得有一个方法来处理...

就算你封装了也不好处理...

仔细想想你会发现你的这种方法一点也没比原来的方法好。  回复  更多评论   

# re: watir 处理弹出窗口 [fxzeng 原创] 2006-09-30 16:22 Fxzeng's space

如果真正的进行网页测试, 就算按照原来的方法写也不可能算是封装的很好, 这样写好处是灵活性大, 可以处理多种不同情况, 一种窗口对应一个函数, 而原来的方法却要你多加几个文件!!  回复  更多评论   

# re: watir 处理弹出窗口 [fxzeng 原创] 2008-09-24 23:14 陈强

有点疑问
安全警告窗口:
thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb \"TAB 3\" ENTER")}
# push TAB key three times, and ENTER
选择文件窗口:
thrs << Thread.new{system("rubyw #{mydir}\\myWinHelper.rb d:\\file\\test.txt !o")}
# enter the directory of the file, and then push Alt+o

怎么没有传title过去啊?没有title的话,执行autoit.WinWait(title,texts)会一直挂死的.
另:怎么样在页面上触发出一个选择文件的框来?
  回复  更多评论   

只有注册用户登录后才能发表评论。