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<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 + ":已经关闭!");
	}
}


运行结果:


  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.确认(verifation)和断言(assert)有什么区别? 确认:当测试的一个用例存在错误时,系统将会继续运行这些测试 断言:当测试的一个用例存在错误时,系统将会退出当前用例 总而言之,确认和断言的不同在于,当出现错误情况之后,系统将会如何处理。 .test case 和testsuite的区别? test case是一个用例 test suite是一组用例 7.selenium IDE, selenium core, selenium core hta, selenium rc四者的概念以及它们之间的区别? selenium IDE(集成开发环境)。它是一个firefox的插件,可以录制、回放并编辑测试脚本 selenium Core(核心)。这是符合断言机制,由测试套件执行的平台。它是整个测试机制的核心部分,由纯javaScript代码组成 selenium Core Hta.这是针对IE设计的执行平台,运行于IE的最高字全级别之上。 selenium Remote Control(远程控制):它是一个代理与控制端,可代替selenium core/selenium DIE的客户端,并支持多语言 8.能不能在IE录制脚本吗? 不能,只能在firefox安装selenium IDE,而只有selenium IDE才存在录制的功能。 如果想测试一些,不能在firefox正常显示的程序,则只有安装selenium RC,然后自己编写测试脚本,只有这样,脚本才能在ie运行。 12.怎样安装多窗口模型? (1)启动selenium-server时,输入以下的命令:java-jar selenium-server.jar -multiwindow。则会在两个窗口显示运行结果 (2)启动selenium-server时,输入以下的命令:java -jar selenium-server.jar -singlewindow。则会在一个窗口显示运行结果 15.怎样访问变量? ${变量名} 16.在录制的过程,遇到了提示框的话,要怎样处理才能在正常的回放? 17.录制到邮件的时候,不能正常录制,要如何处理呢? 录制的时候,首先要指定要框架,然后再输入文本。 例如:邮件通过firebug定位为: 在selenium ide则需要手动的输入以下的内容: 再输入一条以下的命令:selectFrame relative=top 则,此时的脚本就能正常的运行了。 18.录制到组件的时候,不能正常录制,要怎样处理? 例如:上传附件(以及其它一些要上传的东西),刚发现附件并不是不能录制,而是你在界面的定位不是很清楚,selenium不能识别。 19.录制时,会跳出多个窗口,此时要怎样处理? 存在四种解决方法,可以参考http://www.boobooke.com/bbs/viewthread.php?tid=41824&highlight=selenium的第七集 具体方法如下:(1)java可用如下的代码:String[] titles =selenium.getAllWindowTitles(); //得到所有窗口的标题 selenium.selectWindow("title="+titles[titles.length-1]); //选择最后打开的一个窗口 selenium.close(); //关闭最后打开的一个窗口 selenium.selectWindow("null"); //重新聚集在最开始的一个窗口(只有两个窗口的时候) (2)java可用如下的代码:selenium.click("link=????"); 换成如下的两行代码 String url = selenium.getAttribute(link=????@href); selenium.open(url); 注:此方法也存在一定的缺陷,就是不能验证click点击事件是否正确。 (3)利用javascript去掉原代码的target="_blank"的属性(目前为止还不清楚) (4)这种方法不清楚,看的不是很懂 20.什么是window
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值