《手把手教你》系列技巧篇(二十三)-java+ selenium自動化測試-webdriver處理瀏覽器多視窗切換下卷(詳細教程)

巨集哥發表於2021-09-03

1.簡介

 上一篇講解和分享瞭如何獲取瀏覽器視窗的控制程式碼,那麼今天這一篇就是講解獲取後我們要做什麼,就是利用獲取的控制程式碼進行瀏覽器視窗的切換來分別定位不同頁面中的元素進行操作。

2.為什麼要切換視窗?

Selenium在當前頁面開啟了新的視窗,此時就需要跳轉到新的視窗去,就需要把視窗進行切換。巨集哥這裡簡單舉例一個測試場景,你在頁面A點選一個連線,會在新的tab視窗開啟頁面B,這個時候,你在頁面B點選一個連線,會在新的tab視窗開啟頁面C。這種情況,在測試中經常遇到,自動化中,webdriver是如何處理的呢。這裡就需要用到今天講解和分享的知識了。

3.獲取視窗控制程式碼方法

獲取所有(set<String>)

//獲取所有開啟視窗控制程式碼,返回的是set型別
Set<String> handles = driver.getWindowHandles();

獲取當前(String型別):

//獲取當前視窗控制程式碼,返回的是string型別
String handle = driver.getWindowHandle();

視窗切換方法:

//視窗切換方法,需傳入想要切換視窗的控制程式碼
driver.switchTo().window();

switch_to_window(window_name):

將定位的頁面轉到指定的window_name頁面(window_name:指定頁面視窗的handle)

4.專案實戰

1.開啟百度首頁
2.從百度首頁開啟新聞,在新聞頁面輸入框輸入“阿富汗”
3.從百度首頁開啟地圖,在地圖頁面輸入框輸入“北京”

4.1程式碼設計

4.2參考程式碼

package lessons;

import java.util.ArrayList;
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;

/**
 * @author 北京-巨集哥
 * 
 *《手把手教你》系列技巧篇(二十二)-java+ selenium自動化測試-webdriver處理瀏覽器多視窗切換(詳細教程)
 *
 * 2021年8月27日
 */
public class SwitchWinId {
    
    public  static  void  main(String [] args) throws InterruptedException {
        
        System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑
 
        WebDriver driver =null;
        try {
            driver = new ChromeDriver();
            driver.get("http://wwww.baidu.com");
            driver.manage().window().maximize();
            //driver.findElement(By.id("kw")).sendKeys("北京巨集哥");
            Thread.sleep(2000);
            //獲取主頁面1控制程式碼
            String handle1 = driver.getWindowHandle();
            System.out.println("百度主頁面1控制程式碼:"+handle1);
            //點選頁面2的新聞超連結跳轉後,在頁面2文字框輸入資料
            Thread.sleep(2000);
            driver.findElement(By.xpath("//div/a[text()='新聞']")).click();
            String handle = getLastHandle(driver);
            System.out.println("新聞頁面2控制程式碼:"+handle);
            //獲取到頁面2的控制程式碼,將driver作用域切到頁面2
            driver.switchTo().window(handle);
            driver.findElement(By.id("ww")).sendKeys("阿富汗");
            Thread.sleep(2000);
            //返回主頁面1點選開啟新頁面3 
            //利用頁面1的控制程式碼,將driver作用域切回到頁面1
            driver.switchTo().window(handle1);
            //點選頁面3的超連結跳轉後,在頁面3文字框輸入資料
            driver.findElement(By.xpath("//div/a[text()='地圖']")).click();
            handle = getLastHandle(driver);
            System.out.println("地圖頁面3控制程式碼:"+handle);
            driver.switchTo().window(handle);
            driver.findElement(By.id("sole-input")).sendKeys("北京");
            Thread.sleep(2000);
            //關閉新開啟的頁面視窗3
            driver.close();
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            driver.quit();
        }
    }

    /**
     * @param driver
     * @return 當前開啟視窗的最後一個控制程式碼
     */
    public static String getLastHandle(WebDriver driver) {
        //獲取當前開啟視窗的所有控制程式碼
        Set<String> Allhandles = driver.getWindowHandles();
        ArrayList<String> lst = new ArrayList<String>(Allhandles);
        return lst.get(lst.size()-1);
    }    
    
}

4.3執行程式碼

1.執行程式碼,右鍵Run AS->java Application,控制檯輸出,如下圖所示:

2.執行程式碼後電腦端的瀏覽器的動作,如下小視訊所示:

5.小結

細心地小夥伴或者童鞋們或許發現巨集哥程式碼中註釋一行程式碼是在百度首頁的輸入框輸入“北京巨集哥”的,一定很好奇巨集哥為什麼將其註釋掉了。巨集哥這裡說一下原因:因為加上這一行後,就會定位不到元素(報錯),註釋掉就好了。具體原因巨集哥還沒找到,有知道的小夥伴或者童鞋們可以給巨集哥留言哈!

6.擴充

針對小結中的問題,巨集哥自己在本地寫程式碼實現了一個小demo,是可以在第一個主頁面輸入文字的,也沒有報錯。

6.1準備三個頁面

1.html

<html>
    <head>
        <title>百度</title>
    </head>
    <body>
        <div>
             百度 :<input type="text" id="input_1" value=""/><br><br>
            <a href="./2.html" target="_blank">點選這裡跳轉新聞頁面</a><br><br>
            <a href="./3.html" target="_blank">點選這裡跳轉地圖頁面</a><br><br>
        </div>
    </body>
</html>

2.html

<html>
    <head>
        <title>新聞</title>
    </head>
    <body>
        <div>
            新聞:<input type="text" id="input_2"/>
        </div>
    </body>
</html>

3.html

<html>
    <head>
        <title>地圖</title>
    </head>
    <body>
        <div>
            地圖:<input type="text" id="input_3"/>
        </div>
    </body>
</html>

6.2新建一個測試類

 新建一個Test.class類。

6.2.1程式碼設計

6.2.2參考程式碼
/**
 * 
 */
package lessons;

import java.util.ArrayList;
import java.util.Set;

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

/**
 * @author 北京-巨集哥
 *
 * 2021年8月24日
 */
public class Test {
    
    public static void main(String[] args) throws InterruptedException {
        System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑
        WebDriver driver =null;
        try {
            driver = new ChromeDriver();
            driver.get("file:///C:/Users/DELL/Desktop/test/1.html");
            driver.manage().window().maximize();
            driver.findElement(By.id("input_1")).sendKeys("百度寫入資料");
            Thread.sleep(2000);
            //獲取百度控制程式碼
            String handle1 = driver.getWindowHandle();
            System.out.println("百度控制程式碼:"+handle1);
            //點選新聞的超連結跳轉後,在新聞文字框輸入資料
            driver.findElement(By.partialLinkText("點選這裡跳轉新聞")).click();
            String handle = getLastHandle(driver);
            System.out.println("新新聞控制程式碼:"+handle);
            //獲取到新聞的控制程式碼,將driver作用域切到新聞
            driver.switchTo().window(handle);
            driver.findElement(By.id("input_2")).sendKeys("新開啟新聞 輸入資料");
            
            //返回百度點選開啟新頁面3 
            //利用頁面1的控制程式碼,將driver作用域切回到頁面1
            driver.switchTo().window(handle1);
            //點選頁面3的超連結跳轉後,在頁面3文字框輸入資料
            driver.findElement(By.partialLinkText("點選這裡跳轉地圖")).click();
            handle = getLastHandle(driver);
            System.out.println("地圖控制程式碼:"+handle);
            driver.switchTo().window(handle);
            driver.findElement(By.id("input_3")).sendKeys("新開啟地圖 輸入資料");
            Thread.sleep(2000);
            //關閉新開啟的地圖
            //driver.close();
            Thread.sleep(5000);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            driver.quit();
        }
    }

    /**
     * @param driver
     * @return 當前開啟視窗的最後一個控制程式碼
     */
    public static String getLastHandle(WebDriver driver) {
        //獲取當前開啟視窗的所有控制程式碼
        Set<String> Allhandles = driver.getWindowHandles();
        ArrayList<String> lst = new ArrayList<String>(Allhandles);
        return lst.get(lst.size()-1);
    }    

}
6.2.3執行程式碼

1.執行程式碼,右鍵Run AS->java Application,控制檯輸出,如下圖所示:

2.執行程式碼後電腦端的瀏覽器的動作,如下小視訊所示:

相關文章