1.簡介
今天本來就要分享和講解三大延時等待的,但是在寫作過程中發了問題,會用到這一個知識點,於是就提前介紹一下,以便后邊用到了可以更好的理解和掌握。本文就是要介紹如何獲得瀏覽器窗體的句柄或者叫編號,為后面的driver實例在多個窗體之間切換做准備。
2.什么是瀏覽器窗口句柄?
先來解釋下什么是句柄,有時候瀏覽器的窗口句柄,也叫windows id,英文單詞更好理解。你打開了一個瀏覽器,你開一個tab,就生成了一個id,這個id直到你關閉這個tab才會消失。如果你在一個瀏覽器上打開多個tab,那么就有多個windows id,為什么你關閉其中一個tab,但是不影響其他tab的顯示,就是這個id的作用。
3.實戰
廢話不說 ,直接進入主題進行實例講解。
3.1一個windows句柄
我們先看看瀏覽器只開一個tab,也就是只有一個windows句柄的時候,打印出這個句柄出來。
3.1.1代碼設計
3.1.2參考代碼
package lessons; import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; /** * @author 北京-宏哥 * * 2021年8月19日 */ public class GetWinId { public static void main(String [] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑 WebDriver driver = new ChromeDriver (); //最大化窗口 driver.manage().window().maximize(); //打開百度首頁 driver.get("http://wwww.baidu.com"); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); Thread.sleep(1000); //打印當前頁面句柄 System.out.println("打印結果"+driver.getWindowHandle()); driver.close(); } }
3.1.3運行代碼
1.運行代碼,右鍵Run AS->java Application,控制台輸出,如下圖所示:
2.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示:
3.2兩個windows句柄
接下來,看看有兩個tab,打印出兩個windows句柄來,使用getWindowsHandles()方法。
3.2.1代碼設計
3.2.2參考代碼
package lessons; 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 北京-宏哥 * * 2021年8月19日 */ public class GetWinId { public static void main(String [] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑 WebDriver driver = new ChromeDriver (); //最大化窗口 driver.manage().window().maximize(); //打開百度首頁 driver.get("http://wwww.baidu.com"); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); Thread.sleep(1000); WebElement News = driver.findElement(By.xpath("//div/a[text()='新聞']")); News.click(); Thread.sleep(1000); //打印當前頁面句柄 System.out.println("打印結果"+driver.getWindowHandles()); driver.close(); } }
3.2.3運行代碼
1.運行代碼,右鍵Run AS->java Application,控制台輸出,如下圖所示:
2.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示:
3.3大於兩個windows句柄
接下來,看看大於兩個tab,打印出大於兩個windows句柄來,使用getWindowsHandles()方法。
3.3.1代碼設計
3.3.2參考代碼
package lessons; 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 北京-宏哥 * * 2021年8月19日 */ public class GetWinId { public static void main(String [] args) throws InterruptedException { System.setProperty("webdriver.gecko.driver", ".\\Tools\\chromedriver.exe"); //指定驅動路徑 WebDriver driver = new ChromeDriver (); //最大化窗口 driver.manage().window().maximize(); //打開百度首頁 driver.get("http://wwww.baidu.com"); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); Thread.sleep(1000); //打開新聞頁面 WebElement News = driver.findElement(By.xpath("//div/a[text()='新聞']")); News.click(); Thread.sleep(1000); //打開地圖頁面 WebElement Map = driver.findElement(By.xpath("//div/a[text()='地圖']")); Map.click(); Thread.sleep(1000); //打印當前頁面句柄 System.out.println("打印結果"+driver.getWindowHandles()); driver.close(); } }
3.3.3運行代碼
1.運行代碼,右鍵Run AS->java Application,控制台輸出,如下圖所示:
2.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示:
4.小結
在實際操作中,細心的小伙伴們或者童鞋們已經發現代碼的邏輯一直都在百度首頁,也就是第一個打開的頁面,所以在執行driver.close();時候只有百度首頁關閉了,其他頁面不受影響,不相信的小伙伴們可以在第一個或者第二個頁面定位到頁面的元素進行操作,代碼會報錯告訴你找不到頁面元素。所以要想操作對應頁面的元素,我們就需要切換到對應窗口的句柄即可。
宏哥在后邊的實操中在斷言時候,就遇到相同的問題,需要進行句柄切換進行斷言,這個宏哥可能會單獨列一篇文章進行講解和分享的。
好了,今天時間也不早了,感謝你耐心地閱讀。早點休息吧!