七、Selenium 多窗口切换(switchTo())


一、窗口切换常见的场景

  • 窗口句柄
  • 弹窗(alert、confirm 等)
  • frame

二、窗口句柄

官方文档:https://www.selenium.dev/documentation/webdriver/browser/windows/

1.切换句柄一般流程

  1. 获取当前的窗口句柄 driver.getWindowHandle();
  2. 获取当前会话下的所有窗口句柄 driver.getWindowHandles();
  3. 遍历所有的句柄;
  4. 找到和切换窗口 driver.switchTo().window(windowHandle);

代码如下(示例):

		driver.get("https://www.baidu.com");

        //获取当前句柄
        String currentHandle = driver.getWindowHandle();
        System.out.println("当前句柄为:" + currentHandle);

        //点击 顶部导航:新闻
        driver.findElement(By.xpath("//*[@id='s-top-left']/a[1]")).click();

        //获取所有的句柄
        Set<String> windowHandles = driver.getWindowHandles();

        for (String windowHandle : windowHandles) {
            if (windowHandle.equals(currentHandle)){
                driver.switchTo().window(windowHandle);
                System.out.println("句柄切换成功");
                Thread.sleep(3000);
            }
        }

二、弹窗

官方文档:https://www.selenium.dev/documentation/webdriver/browser/alerts/

1.常用方法

  1. 确定 driver.switchTo().alert().accept();
  2. 取消 driver.switchTo().alert().dismiss();
  3. 获取弹窗中内容 driver.switchTo().alert().getText();
  4. 发送文本至弹窗 driver.switchTo().alert().sendKeys();

代码如下(示例):

		driver.get("https://sahitest.com/demo/confirmTest.htm");

        // 打开弹窗
        driver.findElement(By.xpath("//*[@value='Click For Confirm']")).click();

        String text = driver.switchTo().alert().getText();
        System.out.println("text:" + text);

        //确定
        driver.switchTo().alert().accept();

        // 打开弹窗
        driver.findElement(By.xpath("//*[@value='Click For Confirm']")).click();

        //取消
        driver.switchTo().alert().dismiss();

三、frame

官方文档:https://www.selenium.dev/documentation/webdriver/browser/frames/

1.什么是 frame

  • frame 是 html 中的一个内联框架。一个内联框架被用来在当前 HTML 文档中嵌入另一个文档。即在一个页面中引入另一个页面,实现页面之间的嵌套。(用于在网页内显示网页)

2.frame 分类:frameset、frame、iframe

参考:详解iframe与frame的区别

  • frameset 和普通标签一样,可以使用任意的方式定位。
  • HTML5 中不再支持 frame
  • frame不能脱离frameSet(frame集合)单独使用,iframe可以;

3.frame 中常用的方法

  • 用 frame 的 index ,适用于一个标签下有多个 iframe:driver.switchTo().frame(int index);
  • 通过 frame 的 id 或者名字:driver.switchTo().frame(String nameOrId);
  • 通过 findElement 等方法: driver.switchTo().frame(WebElement frameElement);
  • 嵌套 frame,切换到父级 Frame(向上切换,回退):driver.switchTo().parentFrame();
  • 切换到原有模式:driver.switchTo().defaultContent();
  • 当一个页面有多个 frame 时,如果需要切换,需要调用driver.switchTo().defaultContent();,回到页面的默认状态;

代码如下(示例):

        driver.get("https://sahitest.com/demo/iframesTest.htm");

        // 切换到 左边的 iframe 中
//        WebDriver frame = driver.switchTo().frame(0);
        WebDriver frame = driver.switchTo().frame(driver.findElement(By.xpath("//iframe")));
//        System.out.println("frame:" + frame);


        // 点击 frame 中的 Link Test <a> 标签
        driver.findElement(By.xpath("//*[text()='Link Test']")).click();

        // 需要切换成默认的状态,否则无法切换 iframe
        driver.switchTo().defaultContent();

        //切换到 右边的 iframe 中
        WebDriver another = driver.switchTo().frame(driver.findElement(By.xpath("//*[@id='another']/iframe")));
        System.out.println("another:" + another);

        // 点击 frame 中的 Link Test <a> 标签
        driver.findElement(By.xpath("//*[text()='Link Test']")).click();
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

geekJP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值