该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-07-27
最后修改:2009-07-27
Selenium目前没有提供对IE模态对话框(即通过showModalDialog方法打开的弹出对话框)的处理。原因在于,模态对话框会将父页面的JS挂起,直至对话框处理完毕才会继续执行父页面JS。因为Selenium的底层实现是基于JS的,所以模态对话框会同时将selenium挂起,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”); }
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);
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-07-28
高 手 ~~
这都被你解决了,我对你的敬仰~~ 提交给Selenium Core吧 |
|
返回顶楼 | |
发表时间:2009-07-28
⊙﹏⊙b汗一个。
实际参考着这两个: http://clearspace.openqa.org/message/64664#64664 http://seleniumdeal.blogspot.com/2009/01/handling-modal-window-with-selenium.html 下面一个链接打不开需要爬墙。 但是原文中的方法在实际IE7下测试时不能正常工作,所以改了一下。思路是一样的。 |
|
返回顶楼 | |
发表时间:2009-07-29
汗一个。 都一个公司的,不是站起来就能沟通?
|
|
返回顶楼 | |
发表时间:2009-07-30
zdonking 写道 汗一个。 都一个公司的,不是站起来就能沟通?
荣高手在客户现场onsite呢 |
|
返回顶楼 | |
发表时间:2009-07-31
好作业。
最近忙晕了,找时间把那个gef文档发给你。 |
|
返回顶楼 | |
发表时间: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键去搞定。 不过显然没有这个解决方案好。 |
|
返回顶楼 | |
发表时间:2009-08-13
楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗? |
|
返回顶楼 | |
发表时间:2009-08-13
blueberry1228 写道 楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗? window.open是不需要这套玩意滴~~直接selectWindow就可以了~~记得用multi-frame模式~~ |
|
返回顶楼 | |
发表时间:2009-08-14
gigix 写道 blueberry1228 写道 楼主你好,想问一下,我若是用window.open来模拟window.showdialog,那新窗口怎么得到dialogArgments呢?
因为我尝试了你的方法,但是好像打开的窗口由于得不到dialogArgments,很多页面元素没有解析出来。请问你遇到过这种情况吗? window.open是不需要这套玩意滴~~直接selectWindow就可以了~~记得用multi-frame模式~~ 额,,我不太懂这个意思,selectWindow是说选中被打开的新窗口嘛?这个我倒是做了,主要是打开的新窗口没有从父窗口读到该有的参数,好象新窗口的代码里,像title这种属性都是父窗口传给它的。 我的问题在于新窗口没有得到父窗口的对象。。。 |
|
返回顶楼 | |