首页 > 技术文章 > Selenium2学习-008-WebUI自动化实战实例-006-易迅登录之 frame 处理

fengpingfan 2015-01-21 14:01 原文

此文主要讲述用 Java 编写 Selenium 自动化测试脚本编写过程中,在因 frame 标签导致页面定位失败,提示 NoSuchElementException 时的,页面元素定位前的 frame 处理,即 WebDriver.swtichTo.frame() 的概要用法。

希望能对初学 Selenium2 WebUI 自动化测试编程的亲们有所帮助。若有不足之处,敬请大神指正,不胜感激!

在我之前的页面元素定位示例文章 (Selenium2 Web 元素定位及 XPath 编写演示示例)中曾提到过易迅登录时有一个坑,不知道大家还是否记得?若是大家仔细看过易迅登录的页面源码,则不难发现登录信息录入框等是嵌入在 frame 中的。那么我们在实际的脚本编写中应该怎么定位此类 frame 中的页面元素呢?页面的 HTML 显示如下所示:

其实,挺简单:先切换至对应的 frame 中,然后再定位元素,执行完相应的操作后,建议返回其默认的 defaultContent。

闲话少述,直接上码,敬请亲阅览 ^_^,源代码如下所示:

  1 /**
  2  * Aaron.ffp Inc.
  3  * Copyright (c) 2004-2015 All Rights Reserved.
  4  */
  5 package main.java.aaron.sele.demo;
  6 
  7 import java.util.Arrays;
  8 import java.util.concurrent.TimeUnit;
  9 
 10 import org.openqa.selenium.By;
 11 import org.openqa.selenium.WebDriver;
 12 import org.openqa.selenium.chrome.ChromeDriver;
 13 import org.openqa.selenium.chrome.ChromeOptions;
 14 import org.openqa.selenium.remote.DesiredCapabilities;
 15 
 16 /**
 17  * UI自动化功能测试脚本:以易迅登录介绍 Frame 处理
 18  * 
 19  * 实现 Chrome 浏览器启动的步骤如下:
 20  *   1.设定 Chrome 的安装路径
 21  *   2.设定 Chrome 的 webdriver
 22  *   3.参数化启动 Chrome
 23  *   4.打开易迅登陆链接
 24  *   5.通过 webdriver.switchTo.frame() 进行 Frame 切换 
 25  *   6.输入账户、密码
 26  *   7.关闭并退出
 27  *   
 28  * @author Aaron.ffp
 29  * @version $Id: Selenium_FrameDemo.java, V0.1 2015-1-21 13:23:54 Aaron.ffp Exp $
 30  */
 31 public class Selenium_FrameDemo {
 32     private static WebDriver cd;
 33     private static String baseUrl;   // 百度首页网址
 34     private static String username;
 35     private static String userpass;
 36 
 37     /**
 38      * Chrome WebDriver 设置, 网址及搜索内容初始化, 打开 Chrome 浏览器
 39      */
 40     public static void chromeStart(){
 41         /* 设定 chrome 启动文件的位置, 若未设定则取默认安装目录的 chrome */
 42         System.setProperty("webdriver.chrome.bin", "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe");
 43         /* 设定 chrome webdirver 的位置 */
 44         System.setProperty("webdriver.chrome.driver", "C:/Windows/System32/chromedriver.exe");
 45         
 46         /* 百度首页网址赋值 */
 47         baseUrl = "https://base.yixun.com/login.html";
 48         
 49         /* 启动 chrome 浏览器 */
 50         cd = new ChromeDriver(chromeOptions());
 51         
 52         /**
 53          * 登录账号及密码赋值,实际应用时需要正确赋值
 54          */
 55         username = "231333574";
 56         userpass = "input userpass";
 57     }
 58 
 59     /**
 60      * 主方法入口
 61      * @param args
 62      * @throws InterruptedException 
 63      */
 64     public static void main(String[] args) throws InterruptedException {
 65         /* 启动 chrome */
 66         chromeStart();
 67         
 68         /* 执行易迅网登录操作 */
 69         IcsonLogin(baseUrl, username, userpass);
 70         
 71         /* 等待加载 */
 72         cd.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
 73         
 74         TimeUnit.SECONDS.sleep(5);
 75         
 76         /* 关闭 chrome */
 77         chromeQuit();
 78     }
 79     
 80     /**
 81      * 易迅登录, 并输入账户和密码
 82      * 
 83      * @param baseUrl  : 登录 URL
 84      * @param username : 账户
 85      * @param userpass : 密码
 86      */
 87     public static void IcsonLogin(String baseUrl, String username, String userpass){
 88         cd.get(baseUrl);
 89         
 90         /* frame 切换 */       
 91         cd.switchTo().frame("id_iframe_login").switchTo().frame("qq_login_iframe");
 92         
 93         /* 输入账号 */
 94         cd.findElement(By.id("u")).sendKeys(username);
 95         
 96         /* 输入密码 */
 97         cd.findElement(By.id("p")).sendKeys(userpass);
 98     }
 99     
100     /**
101      * 设置 Chrome 浏览器的启动参数, 设置启动后浏览器窗口最大化, 忽略认证错误警示
102      * 
103      * @return ChromeOptions Chrome 参数设置
104      */
105     public static ChromeOptions chromeOptions(){
106          ChromeOptions options = new ChromeOptions();
107          DesiredCapabilities capabilities = DesiredCapabilities.chrome();
108          capabilities.setCapability("chrome.switches", Arrays.asList("--start-maximized"));
109          /* 浏览器最大化 */
110          options.addArguments("--test-type", "--start-maximized");
111          /* 忽略 Chrome 浏览器的认证错误 */
112          options.addArguments("--test-type", "--ignore-certificate-errors");
113          
114          return options;
115      }
116     
117     /**
118      * 关闭并退出 Chrome
119      */
120     public static void chromeQuit(){
121         /* 关闭 chrome */
122         cd.close();
123         /* 退出 chrome */
124         cd.quit();
125     }
126 }
Selenium-Java 脚本 Frame 处理:易迅登录实战实例源代码

 

至此,WebUI 自动化功能测试脚本第 006 篇-易迅登录之 frame 处理 顺利完结,希望此文能够给初学 Selenium 的您一份参考。

 

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

 

 

推荐阅读