使用selenium测试showModalDialog模态对话框

Selenium目前没有提供对IE模态对话框(即通过 showModalDialog方法打开的弹出对话框)的处理。原因在于,模态对话框会将父页面的JS挂起,直至对话框处理完毕才会继续执行父页面JS。因为Selenium的底层实现是基于JS的,所以模态对话框会同时将selenium挂起,selenium无法选中模态对话框,直至超时。

但是很多系统往往有大量的模态对话框应用。这些应用分为两类:一类是选人、选业务类型等操作,这些操作的目的是填充父页面相应的字段,不会触发其他操作;另外一类比较特殊,例如工作流的派发,这类操作在模态对话框选人返回值后还会继续执行一系列的操作(即showModalDialog方法的调用被夹在一堆 JS操作中间)。

对于第一种情况,可以在测试代码里建立相应的数据常量,通过直接赋值的方式避免调用showModalDialog方法;对于第二种情况,则只能hack。

在当前的测试用例里,采用以下的hack方法:

典型的模态对话框会在点击一个页面元素后打开(例如button),在第一次点击该页面元素时,我们对showModalDialog方法进行覆盖,改打开模态对话框为window.open打开网页,并将selenium选中该弹出网页:

Java代码

public void clickAndSelectModalDialog(String locator){
   clickForModalDialog(locator);
    selenium.selectWindow(“name=modal”);
}

private void clickForModalDialog(String locator){
   String overrideShowModalDialogJs=="if(selenium.browserbot.getCurrentWindow().showModalDialog){";

overrideShowModalDialogJs += "selenium.browserbot.getCurrentWindow().showModalDialog = function( sURL, vArguments, sFeatures)";

overrideShowModalDialogJs +="selenium.browserbot.getCurrentWindow().open(sURL, 'modal', sFeatures);";

overrideShowModalDialogJs += "};}";
//showModalDialog方法进行覆盖
selenium.getEval(overrideShowModalDialogJs);
selenium.click(locator);
selenium.openWindow(“”,”modal”);
selenium.waitForPopUp(“modal”,”15000”);

}

接下来就可以在弹出网页里进行操作,获取需要返回给父页面的值,这些值一般是一个数组。获取值后关闭弹出网页并返回父页面。在父页面里再次点击打开模态对话框的元素,对showModalDialog方法进行第二次覆盖,将上面获取的值直接返回。

时间: 2024-12-31 11:36:11

使用selenium测试showModalDialog模态对话框的相关文章

Chrome不支持showModalDialog模态对话框和无法返回returnValue问题的解决方法_javascript技巧

What?模态对话框失效了? 上个礼拜修改测试一个后台管理项目,在测试与各个浏览器兼容性的时候,发现在chrome浏览器下showModalDialog方法显示的并不是模态对话框,就像新打开一个页面一样,父窗口仍然可以随意获取焦点,并可以打开多个窗体,而且返回值returnValue也无法返回,一直是undefined.这么多问题很令人头疼,下面就各个主流最新版的浏览器进行了一下测试. 浏览器 是否支持 状态 IE9 ○ Firefox13.0 ○ safari5.1 ○ chrome19.0

谷歌浏览器不支持showModalDialog模态对话框的解决方法_javascript技巧

忽然发现Chrome浏览器版本 37.0.2062.103 m 不支持showModalDialog模态对话框和无法返回returnValue 项目原先用到的都不能正常执行 找了个折中方案利用window.open代替showModalDialog利用 window.opener.document来操作父页面的元素 复制代码 代码如下: window.open("xsp/exesp?todo=13","","height=500,width=280,sta

showModalDialog模态对话框的使用详解以及浏览器兼容

showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面.区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了) 1.ModalDialog是什么? showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面. 区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了). 可以在子窗口中通过设置window.re

showModalDialog模态对话框的使用详解以及浏览器兼容_javascript技巧

1.ModalDialog是什么?showModalDialog是jswindow对象的一个方法,和window.open一样都是打开一个新的页面.区别是:showModalDialog打开子窗口后,父窗口就不能获取焦点了(也就是无法操作了).可以在子窗口中通过设置window.returnValue的值,让父窗口可以获取这个returnvalue. 2.一个例子1)主窗口main.html,2)在主窗口中通过showModalDialog的方式打开子窗口sub.html3)在子窗口中设置ret

javascript showModalDialog模态对话框使用说明_javascript技巧

1. 标准的方法 复制代码 代码如下: <script type="text/javascript"> function openWin(src, width, height, showScroll){ window.showModalDialog (src,"","location:No;status:No;help:No;dialogWidth:"+width+";dialogHeight:"+height+&

JS模态对话框showModalDialog用法

 本篇文章主要是对JS对话框_JS模态对话框showModalDialog的用法进行了总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助 父窗口:   代码如下: <html> <head> <title>无标题页</title> <script language="javascript" type="text/javascript"> function opendialog1()  {  var so

JS对话框_JS模态对话框showModalDialog用法总结_javascript技巧

父窗口: 复制代码 代码如下: <html><head><title>无标题页</title><script language="javascript" type="text/javascript">function opendialog1() { var someValue=window.showModalDialog("b.html","","dialo

JS 模态对话框和非模态对话框操作技巧汇总_基础知识

模态窗口 javascript 技巧汇总(传值.打开.刷新) 1.要弹出的页面中,一定要保证<head></head>标签间有<base target="_self">,否则会弹出的模态窗口上,点击按钮时,会再次弹出一个新页面. 2.被弹出页面的按钮的事件处理中,应该有Response.Write(new Function().ClosePage());语句,用以关闭当前的模态窗口. 3.因为幽默的缓存原因,如果你在模态窗口中修改了数据,你会发现,父

asp.net中的模态对话框

asp.net|对话框 终于开始写B/S的程序.今天遇到了一个问题, 如何处理模态对话框.具体的要求是:在选择页面上的"添加"按钮,弹出模态对话框,在对话框中添加记录后,选择"确定"按钮,关闭对话框,更新主页面表格的数据. 网上关于模态对话框的讨论有很多,试了一天,发现一个比较好的解决方法: 1.显示对话框: 在javascript脚本文件中加入: function OpenEditWin(frmWin,width,height) { var me; // 把父页面