问题的解决:
在解决模式对话框问题时,我主要参考了文章:
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在打开时,无法按照原来的大小和位置打开。还好该问题不影响功
能测试,大家如果有空,可以帮忙实现一下里面的格式转换的代码。