前面的学习已经让我们可以轻松的运行js、点击节点,下面该学习如何控制 alert、confirm 和 弹出窗口这些了
【1、如何处理 confirm 和 alert】
处理 confirm、alert 其实很简单,只需要利用 WebDriver 的 switchTo().alert() 方法就可以轻松切换到 alert 对象 Alert,进行控制。
我们直接利用 高级增删改查 的Demo 测试 alert 和 confirm,顺便还使用 sendKeys 进行文字录入的操作
- package lesson5;
- import static org.junit.Assert.*;
- import org.junit.AfterClass;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.openqa.selenium.Alert;
- import org.openqa.selenium.JavascriptExecutor;
- import org.openqa.selenium.Keys;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.firefox.FirefoxDriver;
- import org.openqa.selenium.support.ui.ExpectedCondition;
- import org.openqa.selenium.support.ui.WebDriverWait;
- public class ExampleForAlert {
- static WebDriver driver;
- @BeforeClass
- public static void init() {
- System.out.println("init...");
- // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置
- System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
- // 创建一个 FireFox 的浏览器实例
- driver = new FirefoxDriver();
- }
- @Test
- public void test() {
- // 让浏览器访问 zTree Demo
- driver.get("http://www.ztree.me/v3/demo/cn/exedit/edit_super.html");
- // 等待 zTree 初始化完毕,Timeout 设置10秒
- try {
- (new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver d) {
- WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo li').get(0);");
- return element != null;
- }
- });
- } catch(Exception e) {
- e.printStackTrace();
- }
- ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');"
- + "window.zTreeNode = window.zTreeObj.getNodes()[0];"
- + "window.zTreeObj.selectNode(window.zTreeNode);");
- //点击编辑按钮,弹出 confirm
- WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#' + window.zTreeNode.tId + '_edit').get(0);");
- element.click();
- //第一次点击取消
- Alert alert = driver.switchTo().alert();
- System.out.println(alert.getText());
- alert.dismiss();
- element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#' + window.zTreeNode.tId + '_input').get(0);");
- assertNull(element);
- //点击编辑按钮,弹出 confirm
- element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#' + window.zTreeNode.tId + '_edit').get(0);");
- element.click();
- //第二次点击确定
- alert = driver.switchTo().alert();
- alert.accept();
- element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#' + window.zTreeNode.tId + '_input').get(0);");
- assertNotNull(element);
- //修改name
- for (int i=0, j=element.getAttribute("value").length(); i<j; i++) {
- element.sendKeys(Keys.BACK_SPACE);
- }
- element.sendKeys(Keys.RETURN);
- //确定 提示信息
- alert = driver.switchTo().alert();
- alert.accept();
- //修改name
- element.sendKeys("test");
- element.sendKeys(Keys.RETURN);
- String newName = (String) ((JavascriptExecutor)driver).executeScript("return window.zTreeNode.name");
- assertEquals(newName, "test");
- }
- @AfterClass
- public static void destory() {
- System.out.println("destory...");
- //关闭浏览器
- driver.quit();
- }
- }
【2、如何处理 弹出页面】
弹出窗口的捕获,同样需要利用 switchTo 方法,这里面需要注意的是——新弹出窗口后,还是要稍微等待一下;如果不等待一会儿,直接获取新窗口的 url 你会得到 about:blank 这样的结果
- package lesson5;
- import java.util.Iterator;
- import java.util.Set;
- import org.junit.AfterClass;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.openqa.selenium.JavascriptExecutor;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.WebElement;
- import org.openqa.selenium.firefox.FirefoxDriver;
- import org.openqa.selenium.support.ui.ExpectedCondition;
- import org.openqa.selenium.support.ui.WebDriverWait;
- public class ExampleForNewWindow {
- static WebDriver driver;
- @BeforeClass
- public static void init() {
- System.out.println("init...");
- // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置
- System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
- // 创建一个 FireFox 的浏览器实例
- driver = new FirefoxDriver();
- }
- @Test
- public void test() {
- // 让浏览器访问 zTree Demo
- driver.get("http://www.ztree.me/v3/demo/cn/core/url.html");
- // 等待 zTree 初始化完毕,Timeout 设置10秒
- try {
- (new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver d) {
- WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo li').get(0);");
- return element != null;
- }
- });
- } catch(Exception e) {
- e.printStackTrace();
- }
- ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');"
- + "window.zTreeNode = window.zTreeObj.getNodes()[0];");
- //点击第一个节点,弹出 zTree 官网
- WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#' + window.zTreeNode.tId + '_a').get(0);");
- element.click();
- //等待5秒,确保新页面加载完毕
- try {
- (new WebDriverWait(driver, 5, 1000)).until(new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver d) {
- return false;
- }
- });
- } catch(Exception e) {}
- //当前窗口的 Handle
- String curWindow = driver.getWindowHandle();
- //全部窗口的 Handle 集合
- Set<String> wins = driver.getWindowHandles();
- Iterator<String> itWin = wins.iterator();
- while(itWin.hasNext()) {
- String key = itWin.next();
- if (curWindow.equals(key)) {
- continue;
- }
- WebDriver newDriver = driver.switchTo().window(key);
- System.out.println("new Window: " + newDriver.getCurrentUrl());
- }
- }
- @AfterClass
- public static void destory() {
- System.out.println("destory...");
- //关闭浏览器
- driver.quit();
- }
- }
【3、另一种切换到 iframe 的方法】
今天主要接触了 switchTo 方法,使用这个方法,就可以直接切换到 iframe 窗口内,切换后使用js 时就可以把 iframe 当做当前的主窗口来使用了
- package lesson5;
- import org.junit.AfterClass;
- import org.junit.BeforeClass;
- import org.junit.Test;
- import org.openqa.selenium.JavascriptExecutor;
- import org.openqa.selenium.WebDriver;
- import org.openqa.selenium.firefox.FirefoxDriver;
- import org.openqa.selenium.support.ui.ExpectedCondition;
- import org.openqa.selenium.support.ui.WebDriverWait;
- public class ExampleForIframe2 {
- static WebDriver driver;
- @BeforeClass
- public static void init() {
- System.out.println("init...");
- // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置
- System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
- // 创建一个 FireFox 的浏览器实例
- driver = new FirefoxDriver();
- }
- @Test
- public void test() {
- // 让浏览器访问 zTree Demo
- driver.get("http://www.ztree.me/v3/demo.php#_102");
- // 等待 iframe 加载完毕,Timeout 设置10秒
- try {
- (new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver d) {
- Boolean loaded = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!demoIframe.$.fn.zTree.getZTreeObj('treeDemo');");
- return loaded;
- }
- });
- } catch(Exception e) {
- e.printStackTrace();
- }
- driver.switchTo().frame("demoIframe");
- ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');");
- //利用 expandNode 方法展开第2个根节点
- ((JavascriptExecutor)driver).executeScript("window.zTreeNode = window.zTreeObj.getNodes()[1]; window.zTreeObj.expandNode(window.zTreeNode, true);");
- // 等待 5 秒
- try {
- (new WebDriverWait(driver, 5, 1000)).until(new ExpectedCondition<Boolean>() {
- public Boolean apply(WebDriver d) {
- return false;
- }
- });
- } catch(Exception e) {}
- }
- @AfterClass
- public static void destory() {
- System.out.println("destory...");
- //关闭浏览器
- driver.quit();
- }
- }