Selenium三大切换详解

一、切换iframe

  当想要定位iframe中的元素时,由于driver的焦点还停留在原页面,我们在iframe新的页面上定位元素时,自然会产生错误,所以我们需要将driver的焦点切换到iframe页面中


切换方式:

driver.switchTo().frame(webElement)	// frame的元素对象
driver.switchTo().frame(frameId)	// frame的id属性值
driver.switchTo().frame(frameName)	// frame的name属性值

跳转到父级iframe中,如果是定级iframe,不会有任何变化

driver.switchTo().parentFrame()

回到默认内容页面(否则会找不到元素)

driver.switchTo().defaultContent()

如果只有一个iframe的情况下,driver.switchTo().parentFrame()和driver.switchTo().defaultContent()的效果是一样的。


Demo:

    @Test
    public void test010() throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        Window window = driver.manage().window();
        // 最大化
        window.maximize();
        driver.navigate().to("https://ke.qq.com/");
        driver.findElement(By.id("js_login")).click();
        Thread.sleep(2000);
        // 切换到iframe,通过WebElement元素对象切换
        WebElement iframeEle = driver.findElement(By.xpath("//iframe[contains(@src,'low_login_enable')]"));
        driver.switchTo().frame(iframeEle);
        // 点击账号密码登录
        WebDriverWait wait = new WebDriverWait(driver, 15);
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("switcher_plogin"))).click();
        //  输入账号密码,点击登录
        driver.findElement(By.id("u")).sendKeys("zzz");
        driver.findElement(By.id("p")).sendKeys("bbb");
        driver.findElement(By.id("login_button")).click();
        // 切换回原html网页
        driver.switchTo().parentFrame();
        // 关闭窗口
        driver.findElement(By.xpath("//i[@class='kc-login icon-font i-close']")).click();
        
    }

二、Alert弹框

被测html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>警告框处理</title>
    <script type="text/javascript">
        function jinggao() {
            alert("这个窗口是警告框!");
            print('你点击了确认');
        }

        function queren() {
            var se = confirm("这个窗口是确认框!");
            if (se == true) {
                print('你点击了确认1');
            } else {
                print('你点击了取消1');
            }
        }

        function duihua() {
            var se = prompt("这个窗口是对话框!","boge_blogs");
			document.write(se);
            if (se != null) {
                print('你点击了确认2');
            } else {
                print('你点击了取消2');
            }
        }

        function print(text) {
            var dom = document.createElement('div')
            dom.innerText = text
            document.getElementsByTagName('body')[0].appendChild(dom)
        }
    </script>
</head>
<body>
<input id="bu1" type="button" onclick="jinggao()" value="点击显示警告框"/>
<br>
<br>
<input id="bu2" type="button" onclick="queren()" value="点击显示确认框"/>
<br>
<br>
<input id="bu3" type="button" onclick="duihua()" value="点击显示对话框"/>
</body>
</html>

得到alert弹框:

Alert alert = driver.switchTo().alert();	// 获取alert弹框对象

常用方法:

alert.getText() 		// 获取警告框中的提示信息
alert.accept()			// 确认
alert.dismiss() 		// 取消
alert.sendKeys(value)	        // 输入值value

警告框Demo:

    @Test
    public void testDemo() throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("E:\\Notes\\Selenium\\Alert.html");
        Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 触发告警框
        driver.findElement(By.id("bu1")).click();
        Thread.sleep(3000);
        // 切换到告警框
        Alert alert = driver.switchTo().alert();
        // 获取文本值
        System.out.println("告警框提示:" + alert.getText());
        // 点击确认
        alert.accept();
    }

确认框Demo:

    @Test
    public void testDemo() throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("E:\\Notes\\Selenium\\Alert.html");
        Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 触发确认框
        driver.findElement(By.id("bu2")).click();
        Thread.sleep(3000);
        // 切换到确认框
        Alert alert = driver.switchTo().alert();
        // 获取文本值
        System.out.println("确认框提示:" + alert.getText());
        // 点击确认
        alert.accept();
    }

对话框Demo:

    @Test
    public void testDemo() throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("E:\\Notes\\Selenium\\Alert.html");
        Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 触发对话框
        driver.findElement(By.id("bu3")).click();
        Thread.sleep(3000);
        // 切换到对话框
        Alert alert = driver.switchTo().alert();
        // 获取文本值
        System.out.println("对话框提示:" + alert.getText());
        // 输入内容到对话框
        Thread.sleep(3000);
        alert.sendKeys("boge_blogs");
        // 点击确认
        alert.accept();
        driver.quit();
    }

三、Window切换

当我们点击了a标签元素时,会触发打开链接页面的事件,有两种情况:

  1.在当前窗口加载新页面的内容

  2.新建一个窗口加载新页面内容,这种情况在a标签有target="_blank"时触发

当发生这两种情况时,同iframe类似,我们需要切换窗口


切换方式:

传入要操作窗口的handle句柄

driver.switchTo.window(nameOrHandle); 

如何获取到窗口的句柄

driver.getWindowHandle();	// 获取当前操作窗口的句柄
driver.getWindowHandles();	// 获取打开的所有窗口句柄

窗口切换Demo:

    @Test
    public void testDemo() throws InterruptedException {
        WebDriver driver = new ChromeDriver();
        driver.get("https://www.baidu.com");
        Window window = driver.manage().window();
        // 最大化
        window.maximize();
        // 打开新闻之前的所有窗口句柄
        Set<String> windowHandles = driver.getWindowHandles();
        System.out.println("打开新闻之前的所有窗口句柄: " + windowHandles);
        // 点击新闻
        driver.findElement(By.xpath("//a[text()='新闻']")).click();
        // 打开新闻之后的所有窗口句柄
        Set<String> windowHandlesAfter = driver.getWindowHandles();
        System.out.println("打开新闻之后的所有窗口句柄: " + windowHandlesAfter);
        // 循环遍历所有的窗口句柄
        for (String handle:windowHandlesAfter) {
            // 判断是否是对应的句柄,用url也可以
            if (driver.getTitle().equals("百度新闻——海量中文资讯平台")) {
                break;
            }else {
                // 切换窗口
                driver.switchTo().window(handle);
            }
        }
        // 点击贴吧
        driver.findElement(By.xpath("//a[text()='贴吧']")).click();
    }

窗口切换的地方可以抽取成公共方法:

    /**
     * function:    公共窗口切换
     * @param title 标题名称
     */
    public void switchWindow(String title) {
        Set<String> allHandles = driver.getWindowHandles();
        for (String handle:allHandles) {
            // 判断是否是对应的句柄,用url也可以
            if (driver.getTitle().equals(title)) {
                break;
            }else {
                // 切换窗口
                driver.switchTo().window(handle);
            }
        }
    }
posted @ 2022-04-15 03:05  boge_blogs  阅读(373)  评论(0编辑  收藏  举报