Selenium中的多个窗口切换(3个及以上的窗口切换)

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


运行结果:

Selenium中的多个窗口切换(3个及以上的窗口切换)_第1张图片


方法二:

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 allWindow = driver.getWindowHandles();  //获取所有的窗口句柄
		List it = new ArrayList(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 + ":已经关闭!");
	}
}


运行结果:

Selenium中的多个窗口切换(3个及以上的窗口切换)_第2张图片

你可能感兴趣的:(selenium)