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.運行代碼后電腦端的瀏覽器的動作,如下小視頻所示: