此文主要讲述用 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 }
至此,WebUI 自动化功能测试脚本第 006 篇-易迅登录之 frame 处理 顺利完结,希望此文能够给初学 Selenium 的您一份参考。
最后,非常感谢亲的驻足,希望此文能对亲有所帮助。热烈欢迎亲一起探讨,共同进步。非常感谢! ^_^