(十六)多窗口切换:句柄、索引、title

句柄:窗口编号

当新打开一个窗口,就会产生一个句柄。切换只要获取所有的句柄,然后选择相应的句柄即可

方法一:利用for循环来实现窗口之间的切换

 private WebDriver driver;
	 
@Test  
	  public void testUntitledTestCase() throws Exception {
		 driver.get("https://www.jd.com/");
		 String oldHandle=driver.getWindowHandle();
		 String oldtitle=driver.getTitle();
		 System.out.println(oldHandle+"---------");
		 
		 driver.findElement(By.linkText("家用电器")).click();
		 
		 driver.findElement(By.partialLinkText("京东金融")).click();;
		 
		 //除第一个窗口,均关闭
		 //switchToWindowAndClose(oldHandle,oldtitle);
		 
			
		 	
	 }
	 
	 //到最初的窗口,并把其他窗口关闭因为最开始的窗口索引为0
	private void switchToWindowAndClose(String oldHandle,String oldtitle) {
		// TODO Auto-generated method stub
		//driver.switchTo().window(driver.getWindowHandles().iterator().next());
	
		for(String winHandle:driver.getWindowHandles())
		{
			
			if(winHandle.equals(oldHandle))
			{
				driver.switchTo().window(winHandle);//如果不是,则切换到当前窗口
				System.out.println(driver.getTitle().equals(oldtitle));//检查title是否一致
				continue;
				
			}
			
			driver.switchTo().window(winHandle);
			driver.close();
		}
		
	}

方法二:

1、获取所有窗口的句柄并放入到set集合中

2、把set集合放入到list对象中

在list中索引对应的窗口顺序:第一个打开的窗口索引是0;其他窗口对应的索引顺序是:最后一个打开的窗口索引是1,剩下的窗口索引依次是打开窗口顺序的倒序

下面例子是切换到家用电器窗口

 @Test  
	  public void testUntitledTestCase() throws Exception {
		 driver.get("https://www.jd.com/");//向浏览器发送网址 0
		 
		 driver.findElement(By.linkText("家用电器")).click();//2
		 
		 driver.findElement(By.partialLinkText("京东金融")).click();;// 1
		 
		 //除第一个窗口,均关闭
		 switchToWindowAndClose();
		
		 	
	 }
	 
	 //在list中索引对应的窗口顺序:第一个打开的窗口索引是0;其他窗口对应的索引顺序是:最后一个打开的窗口索引是1,剩下的窗口索引依次是打开窗口顺序的倒序
	 private void switchToWindowAndClose() {
			// TODO Auto-generated method stub
			//driver.switchTo().window(driver.getWindowHandles().iterator().next());
		    Set<String> allwinds=driver.getWindowHandles();
		    List<String> it=new ArrayList<String>(allwinds); //ArrayList(Collection<? extends E> c)
			for(int i=0;i<it.size();i++)
			{
				if(i==2)
				{
					driver.switchTo().window(it.get( i));
					continue;
				}
				driver.switchTo().window(it.get( i));
				driver.close();
			}
			
				
			
			
		}

衍生的方法,可以根据title切换窗口(一般来说,一个页面的title不会变,通过观察页面就可找到,所以是已知项)

 //根据title切换窗口
	 @Test  
	  public void testUntitledTestCase() throws Exception {
		 driver.get("https://www.jd.com/");
		 
		 driver.findElement(By.linkText("家用电器")).click();
		 
		 driver.findElement(By.partialLinkText("京东金融")).click();
		 
		 //切换到京东金融窗口
		 switchToWindowAndClose();
		 
		 	
	 }



	private void switchToWindowAndClose() {
		// TODO Auto-generated method stub
		for(String winHandle:driver.getWindowHandles())
		{
			
			if(winHandle.equals("京东金融-服务金融机构的数字科技公司"))
			{
				driver.switchTo().window(winHandle);//如果不是,则切换到当前窗口
				System.out.println(driver.getTitle().equals("京东金融-服务金融机构的数字科技公司"));//检查title是否一致
				continue;
				
			}
			
			driver.switchTo().window(winHandle);
			driver.close();
		}
	}

在本例中所涉及的新方法如下:

  • getWindowHandle(): 获得当前窗口句柄。

  • getWindowHandles(): 返回的所有窗口的句柄到当前会话。

  • switchTo().window(): 用于切换到相应的窗口,与上一节的switchTo().frame()类似,前者用于不同窗口的切换, 后者用于不同表单之间的切换。

posted @ 2019-06-25 10:00  测试开发分享站  阅读(251)  评论(0编辑  收藏  举报