`
ronghao
  • 浏览: 460090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
E9473dd5-1985-3883-ac98-962354ca10b3
张小庆,在路上
浏览量:8922
社区版块
存档分类
最新评论

使用selenium测试showModalDialog模态对话框

阅读更多

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

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

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

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

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方法进行第二次覆盖,将上面获取的值直接返回。

public void  acceptModalValue(String locator,String[] values){
    String overrideShowModalDialogJs=="if(selenium.browserbot.getCurrentWindow().showModalDialog){";

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

overrideShowModalDialogJs +="{ "+generateModalDialogReturnObject(values)+”return temp”;

overrideShowModalDialogJs += "};}";
//showModalDialog方法进行覆盖
selenium.getEval(overrideShowModalDialogJs);
selenium.click(locator);
}

private void  generateModalDialogReturnObject (String[] values){
    StringBuffer returnObject=new StringBuffer();
    returnObject.append(“var temp=new Array();”);
    for(int i=0;i<values.length;i++){
        returnObject.append(“temp[”+i+”]=’”+values[i]+”’;”);
    }
    return returnObject.toString();
}
 



这样就完成了整个过程。看一个示例,该示例打开一个选部门的模态对话框,从部门树里选择部门,然后返回:

//点击后弹出部门选择框的图片
String depChooseLocator=”…/img”;
//点击并选中该弹出网页
clickAndSelectModalDialog(depChooseLocator);
//执行部门树的操作
….
//获取该对话框要返回给父页面的值
String name=selenium.getEval(“window.seltree.GetAllCheckText();”);
String id=selenium.getEval(“window.seltree.GetAllNodeId();”);
//关闭部门选择对话框
closeModalDialog();
//返回父页面
Selenium.selectWindow(“name=main95598”);
//组装返回值
String returnValues=new String[2];
returnValues[0]=name;
returnValues[1]=id;
//父页面获取对话框返回值
acceptModalValue(depChooseLocator, returnValues);
 



可以进一步抽象为模板回调方法,略。

分享到:
评论
15 楼 cxr1217 2010-07-22  
返回值获取到了,getEval 写js得到的,还是不明白楼主写的那个方法的意思
14 楼 cxr1217 2010-07-21  
楼主啊楼主,看到消息麻烦给回复一个
非常非常感谢!!
13 楼 cxr1217 2010-07-21  
hi 楼主,请教个问题:

private void  generateModalDialogReturnObject (String[] values){
    StringBuffer returnObject=new StringBuffer();
    returnObject.append(“var temp=new Array();”);
    for(int i=0;i<values.length;i++){
        returnObject.append(“temp[”+i+”]=’”+values[i]+”’;”);
    }
    return returnObject.toString();
}

这个方法的具体用途是什么?
我想把子窗口的数组返回,在父窗口中获取到,上面这个方法是怎么使用的啊??我的理解是将返回的信息放到数组里面,return ,可是感觉你的实现和我理解的是反的呢?
麻烦指点一下,非常感谢。
12 楼 ronghao 2009-08-15  
blueberry1228 写道
不知道是不是我的问题表达得不太清楚。。。
请问一下,如果采用window.open的方法绕过window.showmodaldialog,那当打开的页面代码不改变,仍然使用dialogArguments来获取父窗口的参数,它能获得吗?因为我打开来的子窗口会提示这个obj是null。

这个我想你看看我的代码就知道了,这个参数是通过vArguments向子窗口传递的,但是我hack的代码里没有传递这个参数,因为window.open方法没有这个参数,所以在子窗口里通过window.dialogArguments是获取不到的,即你这种情况现在的方法无法处理。

我想,一种比较好的方式是将vArguments拼装到url的后面传递参数,即你需要对我的方法继续扩充:)
11 楼 blueberry1228 2009-08-14  
不知道是不是我的问题表达得不太清楚。。。
请问一下,如果采用window.open的方法绕过window.showmodaldialog,那当打开的页面代码不改变,仍然使用dialogArguments来获取父窗口的参数,它能获得吗?因为我打开来的子窗口会提示这个obj是null。
10 楼 gigix 2009-08-14  
blueberry1228 写道
gigix 写道
blueberry1228 写道
楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗?

window.open是不需要这套玩意滴~~直接selectWindow就可以了~~记得用multi-frame模式~~

额,,我不太懂这个意思,selectWindow是说选中被打开的新窗口嘛?这个我倒是做了,主要是打开的新窗口没有从父窗口读到该有的参数,好象新窗口的代码里,像title这种属性都是父窗口传给它的。
我的问题在于新窗口没有得到父窗口的对象。。。

介个,和selenium木有关系~
9 楼 blueberry1228 2009-08-14  
gigix 写道
blueberry1228 写道
楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗?

window.open是不需要这套玩意滴~~直接selectWindow就可以了~~记得用multi-frame模式~~

额,,我不太懂这个意思,selectWindow是说选中被打开的新窗口嘛?这个我倒是做了,主要是打开的新窗口没有从父窗口读到该有的参数,好象新窗口的代码里,像title这种属性都是父窗口传给它的。
我的问题在于新窗口没有得到父窗口的对象。。。
8 楼 gigix 2009-08-13  
blueberry1228 写道
楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗?

window.open是不需要这套玩意滴~~直接selectWindow就可以了~~记得用multi-frame模式~~
7 楼 blueberry1228 2009-08-13  
楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗?
6 楼 red008 2009-07-31  
真不错。我现在也是用那篇文章的方法去处理的。

以前对于upload download 和showModalDialog都比较头疼。

一阵时间内,都是采用类似下面的做法去做的

		selenium.keyDownNative(Integer.toString(KeyEvent.VK_CONTROL));
		selenium.keyPressNative((new Integer (KeyEvent.VK_V)).toString());
		selenium.keyUpNative(Integer.toString(KeyEvent.VK_CONTROL));


首先将需要画面输入的数据保存在系统粘贴板里面,然后采用selenium的native key机制,将需要的数据给粘贴到符合的目标项目中(当然直接敲也可以),需要取得的数据也是同理炮制。
至于如何让光标停在需要的按钮上,以及如何找到需要的控件,则是依靠TAB键去搞定。

不过显然没有这个解决方案好。



5 楼 edi 2009-07-31  
好作业。
最近忙晕了,找时间把那个gef文档发给你。
4 楼 gigix 2009-07-30  
zdonking 写道
汗一个。 都一个公司的,不是站起来就能沟通?

荣高手在客户现场onsite呢
3 楼 zdonking 2009-07-29  
汗一个。 都一个公司的,不是站起来就能沟通?
2 楼 ronghao 2009-07-28  
⊙﹏⊙b汗一个。
实际参考着这两个:
http://clearspace.openqa.org/message/64664#64664
http://seleniumdeal.blogspot.com/2009/01/handling-modal-window-with-selenium.html
下面一个链接打不开需要爬墙。
但是原文中的方法在实际IE7下测试时不能正常工作,所以改了一下。思路是一样的。
1 楼 gigix 2009-07-28  
高 手 ~~
这都被你解决了,我对你的敬仰~~
提交给Selenium Core吧

相关推荐

    JS中showModalDialog 详细使用.txt

    - **`showModalDialog()`**:此方法创建的是一个模态对话框,用户必须关闭或与该对话框互动才能继续操作主页面。 - **`showModelessDialog()`**:此方法创建的是一个非模态对话框,即用户可以在对话框打开的同时继续...

    rxtxParallel.dll rxtxSerial.dll 32位

    rxtxParallel.dll rxtxSerial.dll 32位

    华捷艾米摄像头开发SDK-V1.8.8

    华捷艾米摄像头开发SDK-V1.8.8

    【毕业设计】基于Python的Django-html深度学习的web端多格式纠错系统源码(完整前后端+mysql+说明文档+LW+PPT).zip

    【毕业设计】基于Python的Django-html深度学习的web端多格式纠错系统源码(完整前后端+mysql+说明文档+LW+PPT).zip

    基于OpenGL和Qt的跨平台3D地形显示Demo软件源代码展示,支持RTK-GPS数据插值与纹理添加功能,OpenGL与Qt联手打造的3D地形显示Demo软件源代码,跨平台支持Ubuntu与Wind

    基于OpenGL和Qt的跨平台3D地形显示Demo软件源代码展示,支持RTK-GPS数据插值与纹理添加功能,OpenGL与Qt联手打造的3D地形显示Demo软件源代码,跨平台支持Ubuntu与Windows,精准插值RTK-GPS地形数据,可视化色彩高度与纹理调整,基于OpenGL和Qt的3D地形显示demo软件源代码,2019年编写的,当时可分别在ubuntu和Windows系统下编译成功,两个平台下的版本头文件和工程文件略有不一样,均可提供源代码,详见图片。 软件对安装RTK-GPS的往复直线作业的拖拉机采集的地形数据进行插值后构建3D地形,具有颜色区分高度,插值和添加纹理等功能。 地形可用鼠标拖动,旋转和缩放。 ,OpenGL; Qt; 3D地形显示; 源代码; 跨平台编译; 安装RTK-GPS拖拉机数据; 插值构建3D地形; 颜色区分高度; 鼠标交互操作,**基于OpenGL与Qt的跨平台3D地形显示Demo源代码**

    基于MATLAB的综合能源系统优化调度:结合需求响应与碳交易机制研究,综合能源系统优化调度:Matlab程序制定与碳交易机制下的综合需求响应应用,matlab程序制定,综合能源系统优化调度,综合需求响

    基于MATLAB的综合能源系统优化调度:结合需求响应与碳交易机制研究,综合能源系统优化调度:Matlab程序制定与碳交易机制下的综合需求响应应用,matlab程序制定,综合能源系统优化调度,综合需求响应的应用,碳交易机制。 ,matlab程序制定; 综合能源系统优化调度; 综合需求响应应用; 碳交易机制,Matlab程序助力综合能源系统优化调度:需求响应与碳交易机制应用

    JAVA毕设项目-基于SSM框架的大美新疆在线论坛交流系统 该这个源码+设计文档.zip

    个人经导师指导并认可通过的设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!提供完整的部署教程和设计文档,方便使用。主要针对计算机相关专业的正在做毕业设计大作业的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 主要用到的技术: java:强制使用面向对象编程(OOP),支持封装、继承、多态和抽象。 Servlet:运行在服务端的Java程序,通过实现javax.servlet.Servlet接口处理HTTP请求和响应,作为JavaWeb的核心控制器,负责动态资源生成和请求逻辑调度 jsp:基于HTML的动态网页技术,允许嵌入Java代码片段(如<% %>),用于简化视图层开发,本质是编译为Servlet的服务器端模板 Mysql:开源关系型数据库管理系统,支持ACID事务和SQL标准,通过JDBC与Java程序连接,适用于Web应用的高并发数据存储与查询

    【毕业设计】Python的Django-html知识图谱的百科知识问答平台源码(完整前后端+mysql+说明文档+LW+PPT).zip

    【毕业设计】Python的Django-html知识图谱的百科知识问答平台源码(完整前后端+mysql+说明文档+LW+PPT).zip

    扑克牌识别数据集,可识别A-K所有的牌字母 1850张原始图,正确识别率可达98.7%,yolo v8格式标注

    扑克牌识别数据集,可识别A-K所有的牌字母 1850张原始图,正确识别率可达98.7%,yolo v8格式标注

    双碳目标下综合能源系统低碳运行优化调度实践-涵盖光伏风电、热电联产等能源设备,借助Matlab与Yalmip求解器的联合应用,实现低成本运行与碳交易策略 ,双碳目标下综合能源系统低碳运行优化调度研究

    双碳目标下综合能源系统低碳运行优化调度实践——涵盖光伏风电、热电联产等能源设备,借助Matlab与Yalmip求解器的联合应用,实现低成本运行与碳交易策略。,双碳目标下综合能源系统低碳运行优化调度研究:光伏风电融合、热电联产与碳捕集设备的协同优化利用Matlab程序,双碳目标下综合能源系统低碳运行优化调度Matlab程序 包含光伏、风电、热电联产、燃气锅炉、电锅炉、电储能、碳捕集设备,考虑碳交易 以系统运行成本最小为目标进行调度 没有具体参考文献,这个只是一个授之以渔的程序,方便入手 采用Yalmip+Cplex求解(需安装求解器) 注释详实,条理清晰,适合初学者学习。 ,双碳目标; 低碳运行优化调度; 能源系统; Matlab程序; 光伏; 风电; 热电联产; 燃气锅炉; 电锅炉; 电储能; 碳捕集; 碳交易; 系统运行成本; Yalmip; Cplex求解; 注释详实; 初学者学习。,基于双碳目标的综合能源系统低碳调度优化Matlab程序:光伏、风电等多源协同与碳交易策略

    虚拟电厂基本概念及关键技术问题思辨.pdf

    虚拟电厂基本概念及关键技术问题思辨

    Python 实现基于BiLSTM双向长短期记忆神经网络的时间序列预测的详细项目实例(含完整的程序,GUI设计和代码详解)

    内容概要:文章详述了基于Python实现的双向长短期记忆神经网络(BiLSTM)时间序列预测项目。从项目背景介绍了为何BiLSTM比传统模型更适合复杂的非线性时间序列预测,并列出项目的各个部分包括数据预处理、特征工程、BiLSTM模型构建(输入层、BiLSTM层、全连接层和输出层)、训练和评估等。项目还包括了一个精美的GUI界面设计使模型更容易使用,以及防止过拟合的方法如正则化、早停技术和超参数调节来优化模型性能。通过案例展示了完整的代码整合封装流程,提供了可视化的预测结果与评估指标如MSE和MAE,并涉及部署与生产环境的实际运用。 适合人群:有一定深度学习、时间序列预测基础知识的研发人员,特别是那些希望了解BiLSTM及其应用场景的开发者和技术爱好者。 使用场景及目标:①适用于处理复杂非线性的、存在长时间依赖关系的时间序列数据,比如金融市场预测、气象预报、电力需求预测等领域;②目标是提高模型预测精度、有效处理长时依赖数据,为各类需要时间序列预测的行业如交通、能源等行业提供更可靠的支持;③项目成果不仅可以直接应用到具体场景,也为学术研究贡献新的见解和技术支持。 阅读建议:鉴于该项目涵盖多个层面的内容,从环境搭建到最后的GUI设计,读者应该分阶段阅读,重点关注自己感兴趣或是专业相关联的部分。比如对于初学者而言,可以从简单的数据导入导出和基本概念学起;而对于进阶者来说,可以直接跳转到模型优化章节深入探讨。整个过程中,最好边看边动手实践,并利用提供的可视化工具检验自己的理解和修改的效果。

    安卓模拟器开发资源包下载10

    安卓模拟器开发资源包下载10

    西门子S7-200 Smart PLC与东元Teco N310变频器通讯实战指南:以太网控制+昆仑通态触摸屏实现设定频率、启停与数据传输,西门子S7-200 Smart PLC与东元Teco N310

    西门子S7-200 Smart PLC与东元Teco N310变频器通讯实战指南:以太网控制+昆仑通态触摸屏实现设定频率、启停与数据传输,西门子S7-200 Smart PLC与东元Teco N310变频器通讯实战指南:以太网控制+485口连接程序详解,西门子200smart与东元Teco N310变频器通讯实战程序 器件:西门子s7 200 smart PLC,东元Teco N310变频器,昆仑通态触摸屏(带以太网),中途可以加路由器 控制方式:触摸屏与plc以太网通讯,PLC与变频器通讯485口相连 功能:触摸屏控制变频器设定频率,启停,读取输出频率,电压 说明:是程序,非硬件。 程序有注释,变频器设置,接线都有,一应俱全 ,西门子200smart PLC; 变频器通讯; 触摸屏控制; 设定频率; 启停控制; 读取输出; 程序注释; 接线说明,西门子S7 200 Smart与东元Teco N310变频器通讯控制程序实战指南

    Java面向对象编程:深入剖析继承与多态的应用及其优势

    内容概要:本文详尽介绍了 Java 中继承与多态两大面向对象编程的核心概念,包括具体的实现方式、相关关键字的使用(extends、override、super、final、abstract)及其背后的逻辑。重点解释了类层次结构建立的方式和方法覆盖的实现,并讨论了抽象类和接口的作用。文章展示了继承与多态在提高代码重用性和扩展性方面的重要贡献,同时也提及了它们带来的潜在风险与挑战。通过两个实际应用案例(图形绘制系统、游戏角色系统),阐述了这两个概念在一个完整的软件项目中的运用。 适用人群:对面向对象编程有所了解但仍希望深入了解其实现机制和优化技巧的程序员或者软件工程师。 使用场景及目标:适用于想要掌握如何更好地利用 OOP 思想设计高效可靠的 Java 应用系统的个人。学习者将理解如何有效地组织代码、最大化组件复用率,并确保系统的灵活性与可维护性。 其他说明:尽管继承和多态为 Java 提供了许多好处,但也存在一些不足之处,如可能导致复杂的继承树,增加理解成本;或是因为在运行时才绑定方法而引入额外开销。因此,在实践中应当审慎选择适当的解决方案。 此外,文中还包括关于向上转型、向下转型

    C#多线程工控源码替代PLC触摸屏:多级页签通信,自由设定串口以太网通信,触摸键盘模拟输入等强大功能,附赠所有控件,C#多线程工控源码替代PLC触摸屏:强大功能,自由通信,触摸键盘模拟输入,含所有控件

    C#多线程工控源码替代PLC触摸屏:多级页签通信,自由设定串口以太网通信,触摸键盘模拟输入等强大功能,附赠所有控件,C#多线程工控源码替代PLC触摸屏:强大功能,自由通信,触摸键盘模拟输入,含所有控件,西门子PLC集成,C#多线程工业源码,可技术咨询 0, 纯源代码。 1, 替代传统plc搭载的触摸屏。 2, 工控屏幕一体机直接和plc通信。 3, 功能强大,多级页签。 4, 可以自由设定串口或以太网通信。 5, 主页。 6, 报警页。 7,触摸键盘模拟输入。 8, 系统设定页。 9, 历史查询页。 10,标定设定页。 11, 赠送所有控件。 12,使用的西门子Plc。 ,C#多线程; 工业源码; 纯源代码; 替代传统plc触摸屏; 通信; 功强大; 多级页签; 自由设定通信方式; 主页; 报警页; 触摸键盘模拟输入; 系统设定页; 历史查询页; 标定设定页; 赠送控件; 西门子Plc。,C#多线程工业源码:PLC通信与触摸屏一体解决方案

    拼鱼鱼CMS,一款垂钓行业的平台系统源码

    拼鱼鱼CMS,一款垂钓行业的平台系统源码

    硬件开发全流程解析:电子电路设计与嵌入式软件开发的关键步骤与技术要点

    内容概要:本文深入探讨了硬件开发的全过程,涵盖了硬件开发所需的软硬件条件、关键技术细节以及常见流程。首先介绍必要的硬件工具,如示波器、万用表、信号发生器等,然后列举常用的原型开发板和测试设备。接着讨论了多种软件条件,涉及电路设计、仿真和嵌入式开发工具。技术细节部分讲解了电路设计中的原理图设计、PCB布局和元件选择等方面的内容,并简述了PCB制造和嵌入式软件开发的基本概念。最后介绍了常见的开发流程、测试与调试环节,并提出了若干重要的开发注意事项。硬件开发是一项涉及电子电路设计、PCB制造、嵌入式编程等多方面的综合性工程任务,合理的工具选取与流程控制对项目的成功至关重要。 适合人群:从事电子产品设计、电路设计、嵌入式系统开发的研究人员、工程师或有志于进入这一领域的高校学生。 使用场景及目标:可用于了解完整的硬件开发流程,作为教材辅助教学或者企业内部培训资料。帮助使用者掌握从需求定义到最终产品的整个链条上的知识点和技术技能。 其他说明:文中还强调了硬件开发过程中的一些最佳实践和建议,比如如何确保良好的信号完整性,合理规划电源管理系统以及有效管理和降低生产成本等问题。同时提到,对于复杂程度较高

    R语言比较型图标-词云图数据集

    R语言比较型图标-词云图数据集

Global site tag (gtag.js) - Google Analytics