ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Selenium三大切换详解

2022-04-15 03:31:06  阅读:190  来源: 互联网

标签:窗口 Selenium driver alert window 详解 句柄 三大 switchTo


一、切换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);
            }
        }
    }

标签:窗口,Selenium,driver,alert,window,详解,句柄,三大,switchTo
来源: https://www.cnblogs.com/91boge/p/16147328.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有