Selenium2学习-016-WebUI自动化实战实例-014-Selenium 窗口选择

在日常的 WebUI 自动化测试脚本编写过程中,经常需要打开新的页面,或者在多个打开的页面之间进行切换,以对页面元素进行相应的操作,以模拟用户的行为,实现 UI 的自动化测试。在过往的时间中,经常有初学 Selenium(webdriver) 的朋友问及如何选择窗口的问题,其实 Selenium 已经给我们提供的了相应的方法去解决这个问题。解决思路如下:

1、通过 webdriver.getWindowHandles() 获取所有已打开窗口的信息 Set<String>

2、遍历上述信息,并切换至对应的窗口

3、通常通过 URL 或者 title 判断是否为期望的窗口,若是,则进行相应的后续操作;否,则舍弃,继续遍历(若还有未遍历的)

4、若未找到对应的窗口,则对应的自动化测试用例脚本失败,通过 TestNG 的 Assert.fail 方法报告失败原因(也可以自己定义)

通过上面的解决思路可以看出,选择窗口最常用的有两种方法(1、URL;2、title)。此文以易迅网的使用向导(购物流程、在线支付)为实例进行现实说法。

闲话少述,话归正传,小二上码。。。敬请各位小主参阅,希望能对您在日常的 WebUI 自动化脚本编写有一定的启发和帮助。若有不足或错误之处,敬请大神指正,不胜感激!

  1 /**
  2  * Aaron.ffp Inc.
  3  * Copyright (c) 2004-2015 All Rights Reserved.
  4  */
  5 package main.aaron.demo.window;
  6 
  7 import main.aaron.sele.core.TestCase;
  8 
  9 import org.openqa.selenium.By;
 10 import org.testng.Assert;
 11 import org.testng.annotations.Test;
 12 import org.testng.annotations.AfterClass;
 13 
 14 /**
 15  * 
 16  * @author Aaron.ffp
 17  * @version V1.0.0: autoSeleniumDemo main.aaron.demo.window SwitchWindow.java, 2015年6月19日 下午11:20:12 Exp $
 18  */
 19 public class SwitchWindow extends TestCase{
 20     private final String baseUrl = "http://www.yixun.com/";
 21     
 22     /**
 23      * switch window demo 1 : by page URL
 24      * 
 25      * @author Aaron.ffp
 26      * @version V1.0.0: autoSeleniumDemo main.aaron.demo.window SwitchWindow.java testSwitchWindow_01, 2015年6月22日 下午12:58:32 Exp $
 27      *
 28      */
 29     @Test
 30     public void testSwitchWindow_01(){
 31         String url = "http://st.yixun.com/help/index.htm";
 32         
 33         try {
 34             this.webdriver.get(this.baseUrl);
 35             
 36             // click link text of how to shopping
 37             this.webdriver.findElement(By.linkText("怎样购物")).click();
 38             
 39             // refresh the page. you can annotation this, because it's not necessary when network is good
 40 //            this.webdriver.navigate().refresh();
 41             
 42             // switch to the correct page, and return webdriver
 43             this.webdriver = this.switchPageByUrl(url);
 44             
 45             // get actual assertion text
 46             String shop = this.webdriver.findElement(By.cssSelector(".mod_hd")).getText();
 47             
 48             // assert
 49             Assert.assertEquals(shop, "购物流程");
 50             
 51             // close window if current URL is not expected, and get expected URL
 52             this.getUrl(url);
 53         } catch (Exception e) {
 54             Assert.fail(e.getMessage());
 55             e.printStackTrace();
 56         }
 57     }
 58     
 59     /**
 60      * switch window demo 1 : by page title
 61      * 
 62      * @author Aaron.ffp
 63      * @version V1.0.0: autoSeleniumDemo main.aaron.demo.window SwitchWindow.java testSwtichWindow_02, 2015-6-22 12:59:27 Exp $
 64      *
 65      */
 66     @Test
 67     public void testSwtichWindow_02(){
 68         String title = "在线支付 - 易迅网";
 69         
 70         try {
 71             this.webdriver.get(this.baseUrl);
 72             
 73             // click link text of how to shopping
 74             this.webdriver.findElement(By.linkText("在线支付")).click();
 75             
 76             // refresh the page. you can annotation this, because it's not necessary when network is good
 77 //            this.webdriver.navigate().refresh();
 78             
 79             // switch to the correct page, and return webdriver
 80             this.webdriver = this.switchPageByUrl(title);
 81             
 82             // get actual assertion text
 83             String webpay = this.webdriver.findElement(By.cssSelector(".mod_hd")).getText();
 84             
 85             // assert
 86             Assert.assertEquals(webpay, "在线支付");
 87             
 88             // close window if current URL is not expected, and get expected URL
 89             this.getUrl(this.webdriver.getCurrentUrl().toString());
 90         } catch (Exception e) {
 91             Assert.fail(e.getMessage());
 92             e.printStackTrace();
 93         }
 94     }
 95     
 96     @AfterClass
 97     public void afterClass(){
 98         this.webdriver.close();
 99         this.webdriver.quit();
100     }
101 }
WebDrvier 选择窗口实例脚本演示源码(基于易迅网用户向导)

脚本运行结果如下所示:

通过页面 URL 选择窗口的方法,若当前已开窗口的数量小于 2 或无匹配的窗口,则均返回最后一个窗口

 1     /**
 2      * Switch window by page URL. Return the last if number of windows lower than 2 or not window's URL can matched.
 3      * 
 4      * @author Aaron.ffp
 5      * @version V1.0.0: autoSeleniumDemo main.aaron.sele.core SeleniumCore.java switchPageByUrl, 2015-6-19 23:15:15 Exp $
 6      * 
 7      * @param url : page URL
 8      * @return WebDriver
 9      */
10     public WebDriver switchPageByUrl(String url){
11         // define variable to store current page title
12         String currentUrl = "";
13         
14         url = "".equals(url)||(url == null) ? "":url;
15         
16         // get all windows
17         Set<String> windows = this.webdriver.getWindowHandles();
18         
19         if (windows.size() < 2) {
20             return this.webdriver;
21         }
22         
23         try {
24             for (String window : windows) {
25                 // change window
26                 this.webdriver.switchTo().window(window);
27                 
28                 // refresh the page. you can annotation this, because it's not necessary when network is good
29 //                this.webdriver.navigate().refresh();
30                 
31                 Thread.sleep(3000);
32                 
33                 // get page url
34                 currentUrl = this.webdriver.getCurrentUrl().toString();
35                 
36                 // verify the current page is expect or not, return this if correct
37                 if (currentUrl.startsWith(url)) {
38                     return this.webdriver;
39                 }
40             }
41         } catch (Exception e) {
42             e.printStackTrace();
43         }
44 
45         return this.webdriver;
46     }
通过页面 URL 选择窗口

通过页面 title 选择窗口的方法,若当前已开窗口的数量小于 2 或无匹配的窗口,则均返回最后一个窗口

 1     /**
 2      * Switch window by page title. Return the last if number of windows lower than 2 or not window's title can matched.
 3      * 
 4      * @author Aaron.ffp
 5      * @version V1.0.0: autoSeleniumDemo main.aaron.sele.core SeleniumCore.java switchPageByTitle, 2015-6-19 23:10:34 Exp $
 6      * 
 7      * @param title : page title
 8      * 
 9      * @return WebDriver
10      */
11     public WebDriver switchPageByTitle(String title){
12         // define variable to store current page title
13         String currentTitle = "";
14         
15         title = "".equals(title)||(title == null) ? "":title;
16         
17         // get all windows
18         Set<String> windows = this.webdriver.getWindowHandles();
19         
20         if (windows.size() < 2) {
21             return this.webdriver;
22         }
23         
24         try {
25             for (String window : windows) {
26                 // change window
27                 this.webdriver.switchTo().window(window);
28                 
29                 Thread.sleep(3000);
30                 
31                 // get page title
32                 currentTitle = this.webdriver.getTitle().toString();
33                 
34                 // verify the current page is expect or not, return this if correct
35                 if (currentTitle.equals(title)) {
36                     return this.webdriver;
37                 }
38             }
39         } catch (Exception e) {
40             e.printStackTrace();
41         }
42 
43         return this.webdriver;
44     }
通过页面 title 选择窗口

PS:上述用例代码中有调用 getUrl(String url) 方法,此方法的主要用途是关闭无效的网页窗口,释放系统资源,具体的方法源码敬请参阅: Selenium2学习-015-WebUI自动化实战实例-013-通过 URL 关闭多余的已开浏览器窗口

 

至此,WebUI 自动化功能测试脚本第 014-Selenium 窗口选择 顺利完结,希望此文能够给初学 Selenium 的您一份参考。

最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^

 

 

posted @ 2015-06-22 13:25  范丰平  Views(466)  Comments(0Edit  收藏  举报