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);
}
}
}