1. 程式人生 > >Java+Selenium3方法篇21-webdriver處理瀏覽器多視窗切換

Java+Selenium3方法篇21-webdriver處理瀏覽器多視窗切換

       經過前面兩篇文章的鋪墊,我們這篇介紹,webdriver如何處理,一個瀏覽器上多個視窗之間切換的問題。我們先腦補這樣一個測試場景,你在頁面A點選一個連線,會在新的tab視窗開啟頁面B,這個時候,你在頁面B點選一個連線,會在新的tab視窗開啟頁面C。這種情況,在測試中經常遇到,自動化中,webdriver是如何處理的呢。

       我們先來看一個例項,在京東首頁,點選手機,會在新的頁面顯示手機通訊的頁面,在手機頁面點選小米,會在新的視窗開啟顯示小米手機的頁面。這個過程,剛好是頁面A到頁面B再到頁面C。我們先拋開其他的,就是先實現driver在頁面A切換到頁面B,然後切換到頁面C這個過程如何實現,在webdriver中提供了一個switch.to.window(handle)的方法。引數handle就是前面文章中提到的獲取視窗控制代碼的值。

相關程式碼如下:

package lessons;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementOpration {
	public static void main(String[] args) throws Exception {  
        
        System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");  
           
        WebDriver driver = new ChromeDriver();  
     
        driver.manage().window().maximize();  
       
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
          
        driver.get("https://www.jd.com/");  
       
        Thread.sleep(1000);
        
        //點選京東左側選單中的 手機
        WebElement phone_link = driver.findElement(By.linkText("手機"));
        phone_link.click();
        Thread.sleep(1000);
    
        // 獲取當前頁面控制代碼  
        String handle = driver.getWindowHandle();  
        // 獲取所有頁面的控制代碼,並迴圈判斷不是當前的控制代碼 
        for (String handles : driver.getWindowHandles()) {  
            if (handles.equals(handle))  
                continue;  
            driver.switchTo().window(handles);  
        }  
        
        WebElement xiaomi_link = driver.findElement(By.linkText("小米"));
        xiaomi_link.click();
        Thread.sleep(1000);
       
    }  
}
       上面在獲取handles過程寫了一個for迴圈,for迴圈的控制代碼和當前driver的控制代碼相等,那麼就continue,也就是結束單迴圈,什麼也不做。如果不是,那麼就呼叫切換視窗的方法,切換到第二個視窗。到了這裡,可能有人就會提出,如果我需要第二個切換到第三個呢,假如說,在判斷第三個控制代碼不等於第二個,那麼driver會不會預設切換到第三個視窗還是切換到第一個呢。如果真要這麼做,需要用到ArrayList,然後用到迭代,可能稍微變得複雜。為了避免這種複雜情況出現,我推薦這樣做,只需要把上面程式碼中的continue語句改成driver.close(),前面文章介紹過,close是關閉當前頁面。如果是頁面A點選連結開啟頁面B,那麼這個過程關閉的就是頁面A,同時把driver切換到頁面B。如果有第三個,從第二個頁面到第三個頁面也是用這樣切換方法。這裡永遠就兩個頁面之間處理的關係。一般來說,自動化也是儘量在一個頁面做完相關測試,才會切換到其他頁面。

修改後指令碼程式碼如下:

package lessons;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class ElementOpration {
	public static void main(String[] args) throws Exception {  
        
        System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");  
           
        WebDriver driver = new ChromeDriver();  
     
        driver.manage().window().maximize();  
       
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
          
        driver.get("https://www.jd.com/");  
       
        Thread.sleep(1000);
        
        //點選京東左側選單中的 手機
        WebElement phone_link = driver.findElement(By.linkText("手機"));
        phone_link.click();
        Thread.sleep(1000);
    
        // 獲取當前頁面控制代碼  
        String handle = driver.getWindowHandle();  
        // 獲取所有頁面的控制代碼,並迴圈判斷不是當前的控制代碼 
        for (String temhandle : driver.getWindowHandles()) {  
            if (!temhandle.equals(handle))  
            	driver.close();
                driver.switchTo().window(temhandle); 
           
        }  
        
        WebElement xiaomi_link = driver.findElement(By.linkText("小米"));
        xiaomi_link.click();
        Thread.sleep(1000);
        
    }  
}
       上面實現了頁面A,切換到頁面B,同時關閉頁面A,頁面B點選觸發頁面C,這個過程還需要用for迴圈判斷一次。所以關於這塊,我建議你單獨寫成一個方法,例如靜態方法,直接呼叫這個,就程式碼看起來很舒服。關於這個,後面我們會介紹,框架設計部分,肯定要寫不同的方法進行呼叫。