在Selenium的窗口的切换中,我们遇到的两个窗口之间的切换比较多。但是,在实际的测试过程,我们可能会遇到3个或者更多的窗口之间的相互切换、关闭等操作。
方法一:利用for循环来实现窗口之前的切换。
示例代码:
package com.sandy;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class ManyHandleChange {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "E:\\eclipse_jar\\selenium_jar\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com/"); //打开百度首页
String window_one = driver.getWindowHandle();
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.open('http://www.sogou.com/')"); //用js打开新的窗口
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.open('http://www.youdao.com/')"); //用js打开新的窗口
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.open('http://www.qq.com/')"); //用js打开新的窗口
Thread.sleep(2000);
Set<String> allWindow = driver.getWindowHandles(); //获取所有的窗口句柄
System.out.println(allWindow.size()); //输出句柄集合
/**
* 使用循环来实现窗口之间的相互切换、关闭
*/
for(String i:allWindow) {
if(i != window_one) { //判断当前是否是第一个窗口
driver.switchTo().window(i); //如果不是,则切换到当前窗口
System.out.println("成功切换到:" + driver.getTitle()); //为了证明确实切换了,打印一下窗口的title
Thread.sleep(2000);
/**
* 截取当前窗口的图片并保存到指定文件夹中
*/
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); //设置时间格式
String time = dateFormat.format(Calendar.getInstance().getTime()); //获取当前时间
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); //执行屏幕截取
FileUtils.copyFile(srcFile, new File("snapshot", time+".png")); //利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件
driver.close();
}
Thread.sleep(2000);
}
}
}
方法二:
1、获取所有窗口的句柄并放入到set集合中
2、把set集合放入到list对象中
Note:在list中索引对应的窗口顺序是:第一个打开的窗口(百度)索引是0;其他窗口对应的索引顺序是:最后一个打开的窗口(腾讯)索引是1,剩余的窗口对应的索引依次是打开窗口顺序的倒序,即2是有道,3是搜狗
3、通过list数组的索引使用switchTo()方法实现切换
示例代码:
package com.sandy;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Set;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class ManyHandleChange {
private static WebDriver driver;
public static void main(String[] args) throws Exception {
System.setProperty("webdriver.chrome.driver", "E:\\eclipse_jar\\selenium_jar\\chromedriver.exe");
driver = new ChromeDriver();
driver.get("http://www.baidu.com/"); //打开百度首页
String window_one = driver.getWindowHandle();
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.open('http://www.sogou.com/')"); //用js打开新的窗口
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.open('http://www.youdao.com/')"); //用js打开新的窗口
Thread.sleep(2000);
((JavascriptExecutor)driver).executeScript("window.open('http://www.qq.com/')"); //用新浪打开新的窗口
Thread.sleep(2000);
Set<String> allWindow = driver.getWindowHandles(); //获取所有的窗口句柄
List<String> it = new ArrayList<String>(allWindow); //将set集合存入list对象中
System.out.println(allWindow.size()); //输出句柄集合
//通过list的索引切换窗口
driver.switchTo().window(it.get(3));
String title = driver.getTitle(); //获取当前窗口的title
System.out.println("已切换到:" + title);
Thread.sleep(500);
driver.close(); //关闭当前窗口
System.out.println(title + ":已经关闭!");
Thread.sleep(1000);
driver.switchTo().window(it.get(2));
String title1 = driver.getTitle(); //获取当前窗口的title
System.out.println("已切换到::" + title1);
Thread.sleep(500);
driver.close(); //关闭当前窗口
System.out.println(title1 + ":已经关闭!");
Thread.sleep(1000);
driver.switchTo().window(it.get(1));
String title2 = driver.getTitle(); //获取当前窗口的title
System.out.println("已切换到:" + title2);
Thread.sleep(500);
driver.close(); //关闭当前窗口
System.out.println(title2 + ":已经关闭!");
Thread.sleep(1000);
driver.switchTo().window(it.get(0));
String title3 = driver.getTitle(); //获取当前窗口的title
System.out.println("已切换到:" + title3);
Thread.sleep(500);
driver.close(); //关闭当前窗口
System.out.println(title3 + ":已经关闭!");
}
}
运行结果: