如何使用webdriver处理模态窗口

来源:互联网 发布:儿童网络教学 编辑:程序博客网 时间:2024/04/29 02:31

乙醇大师,由于在某公司有网络限制,自己总结的资料全部取不出来。关于WebDriver定位模态窗口的问题,在这简单写一下我的心得吧。

首先说定位常规窗口,官网给出了一个方法:

for (String handle : driver.getWindowHandles()) {        driver.switchTo().window(handle);}

这个方法大多数数情况下是没问题的,但其实不太安全,有一定隐患,因为getWindowHandles()这个方法返回值是Set集合,而Set集合里的元素是无序的,假设这样一种情况:WebDriver运行,初始化了第一个浏览器窗口,然后在这个窗口中点击了某个超链接或按钮,弹出一个新窗口,此时用getWindowHandles()获取这两个窗口的Handler,并存放在Set集合里,则Set集合里的可能的情况是:[asdf,jkml],其中,asdf是第一个窗口的Hander,而jkml是第二个窗口的Handler。然后在第二个窗口中处理完了相关业务后,第二个窗口被关闭,然后再回到第一个窗口,再点击另外的超链接或按钮,则再弹出一个新窗口,此时再用getWindowHandles()获取所有窗口的Handler,存放在Set集合中,此时Set集合里的元素有可能是:[qwer,asdf],其中,asdf仍然是第一个窗口的Handler,这个时候,再用官网提供的for循环方法来切换到第二个窗口,必须定位不到!因为此时在Set集合中第2个位置存放的是第一个窗口的Handler。反正就是说Set集合里的元素是无序的,多次执行了getWindowHandles()之后,并不能保证Set集合里的末位置的元素一定是最新打开的那个窗口的Handler,所以有时候就不稳定不安全。

我自己捣鼓出来的笨方法:

public void switchToNewWindow(WebDriver driver,String firstHandler){                    /*获取所有窗口的Handler,并存放在Set集合里*/                 Set<String> handlers = driver.getWindowHandlers();                 /*删掉第一个窗口的Handler*/                    if(handlers.remove(firstHandler)){                                System.out.println("已删掉第一个窗口的Handler);                 }                /*把Set集合转换成Iterator*/                 Iterator<String> it = handlers.iterator();                try{                         if(it.hasNext()){                             driver.switchTo.window(it.next());                        }             }                 catch(Exception e){                         System.out.println("没有可用的窗口Handler");                }}

思路就是所有窗口的Handler存放到Set集合中之后,把第一个窗口的Handler删掉,这样就能百分百保证Set集合里只剩下第二个窗口的Handler,所以就能安全稳定地定位到第二个窗口。

关于定位模态窗口,刚好我们项目中就有用到模态窗口,我用这个笨方法试过了,确实可行!而且非常稳定。这里有两种情况:

  • 一、WebDriver运行,初始化了一个浏览器窗口,然后在这个窗口点击某超链接或按钮,直接弹出模态窗口,则用这个笨方法可以正常定位。
  • 二、WebDriver运行,初始化了一个浏览器窗口,然后在这个窗口点击某超链接或按钮,先弹出一个常规窗口,然后在这个窗口再点击超链接或按钮,才弹出模态窗口,此时要先把第一个窗口关掉,再定位到模态窗口,否则定位不到,我也不知道为什么,反正实践过程中就发现是这样。

暂时就这些了。Java版的WebDriver,我基本会用,框架嘛,暂时能用testng吧,我还是比较好奇在框架这方面能有什么更好的办法,所以很期待你的WebDriver Java版的教程。

非常感谢远方的分享,由于其无法连接站点所以由我整理发布,感谢其的积极思考与实践,使用java binding的同学可以亲自一试


http://17test.info/?p=712
原创粉丝点击