使用Selenium测试模式对话框

28 views
Skip to first unread message

Bear Wu

unread,
Jul 29, 2011, 3:37:49 AM7/29/11
to WATF Forum
问题的由来:
模式对话框是一类特殊形式的对话框,在网页和桌面程序中都有应用。模式对话框的特点是:该对话框在打开状态时,将一直保持在最前端显示,无法自
由切换回父窗口。典型的模式对话框有打开文件的对话框,等等。
在JavaScript中,模式对话框是通过函数window.showModalDialog()实现的。其基本的工作原理是:父网页通过该
函数打开子对话框并传入必要的参数,同时将自身挂起(即处于等待状态),直至子对话框关闭。子对话框在关闭前生成需要返回的数据,将其保存在
window.returnValue变量中,该变量将作为showModalDialog的返回值返回给父窗口。
大家知道Selenium是基于JavaScript的,所以showModalDialog在挂起父网页的同时,也会将Selenium回话
挂起,于是测试就无法继续进行了。

问题的解决:
在解决模式对话框问题时,我主要参考了文章:
http://code.google.com/p/selenium/issues/detail?id=284
以及GlobalSight项目中已有的代码,谢谢他们已有的工作。
基本的解决思路:用JS代码重写showModalDialog方法,将需要打开的模式对话框作为普通的网页打开,这样就不会产生挂起
Selenium的问题了。但是在这样做之后,也打断了原有的子窗口向父窗口返回数据的机制,使得子窗口在关闭时,父窗口不再响应……。所以这一步只适
用于那些不需要返回数据的模式对话框,对于返回数据的情况,我们必须实现某种返回数据的机制。还好终于找到了或者说理解了下述过程,该过程的特点是:两
次调用showModalDialog,第一次打开子窗口,第二次得到返回值!为实现上述目的,对showModalDialog和
window.close()方法都进行了重写。
详细说明:
Step 1: 父窗口第一次调用showModalDialog,打开子对话框,传递必要的参数;父窗口定义一个变量_modalRetVal,该变
量用于等会儿接收子窗口的返回数据;定义回调方法_getRetVal,该方法由子窗口在关闭前调用,作用是将需要返回的数据
(window.returnValue)写入_modalRetVal。
Step 2: 在子窗口中执行各种操作,生成数据;重写子窗口的window.close()方法,使子窗口在关闭前,调用父窗口的
_getRetVal方法;点击按钮或链接等关闭子窗口。
Step 3: 回到父窗口,第二次调用showModalDialog,将_modalRetVal作为该方法的返回值返回。
以上步骤的JS代码实现,请参考WATF\Tools下的showModalDialog.js和closeModalDialog.js。

编程指南:
嗯,刚刚更新了WATF,在core.BasicFuncs接口中增加了两个方法,并且在core.DefaultBasicFuncs中加以
实现,以后遇到模式对话框时,可直接调用这两个方法:
clickAndOpenModalDialog( Selenium selenium, String locator):点击locator,打
开模式对话框,并将selenium的焦点转移至该对话框。
clickAndCloseModalDialog( Selenium selenium, String locator, String
invoker):点击locator,关闭模式对话框;点击父网页上的invoker,获得返回值。注意invoker参数,是指父网页上引发该模式
对话框的那个按钮或链接。
在运行这两个方法时,请检查configData.properties中Base_Path的设置是否正确,Base_Path应该设置成
WATF根目录的路径,例如:
Base_Path = E:\\WATF\\

答疑:关于以上workaround是否影响功能测试。
答案是:没有影响。因为该workaround相当于重新实现了showModalDialog方法和window.close()方法,而这两个方法
都是浏览器提供的,不是应用程序实现的。所以修改它们,不会改变应用程序本身的逻辑和数据。

改进建议:
目前的showModalDialog.js中仍有不完善的地方。比如由于showModalDialog()方法的sFeatures参数和
open()方法的sFeatures参数的格式不一致,所以导致modalDialog在打开时,无法按照原来的大小和位置打开。还好该问题不影响功
能测试,大家如果有空,可以帮忙实现一下里面的格式转换的代码。

Bear Wu

unread,
Aug 19, 2011, 2:12:37 AM8/19/11
to WATF Forum
通过昨天和今天的努力,在showModalDialog.js中增加了对sFeatrues进行格式转换的代码,经过对GS项目中的几个格式对话框的
测试,可以正常工作。
如果遇到什么问题,可以再在这儿讨论。

Jester Xu

unread,
Aug 21, 2011, 9:50:37 PM8/21/11
to watf-...@googlegroups.com
Well done. Bear! :)
Reply all
Reply to author
Forward
0 new messages