文章目录
一、窗口切换常见的场景
- 窗口句柄
- 弹窗(alert、confirm 等)
- frame
二、窗口句柄
官方文档:https://www.selenium.dev/documentation/webdriver/browser/windows/
1.切换句柄一般流程
- 获取当前的窗口句柄
driver.getWindowHandle();
- 获取当前会话下的所有窗口句柄
driver.getWindowHandles();
- 遍历所有的句柄;
- 找到和切换窗口
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.常用方法
- 确定
driver.switchTo().alert().accept();
- 取消
driver.switchTo().alert().dismiss();
- 获取弹窗中内容
driver.switchTo().alert().getText();
- 发送文本至弹窗
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
- 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();