上一篇說了窗口的切換,本篇說說框架的切換。html
切換框架:是指切換html中的iframe標籤元素或者frame標籤元素,注意,並不包括framesetjava
如下是經常使用的方法:git
方法 | 說明 |
WebDriver switchTo().frame(int index) | 經過索引切換到指定的框架,若框架不存在,則拋出異常 NoSuchFrameException |
WebDriver switchTo().frame(String nameOrId) | 經過框架的name或者id切換到指定的框架,若框架不存在,則拋出異常 NoSuchFrameException |
WebDriver switchTo().frame(WebElement frameElement) | 經過元素定位切換到該框架。若元素不穩定,則拋出StaleElementReferenceException,若框架不存在,則拋出NoSuchFrameException |
WebDriver switchTo().parentFrame() | 切換到父級框架,若是當前框架是最頂級,則不會切換。 |
WebDriver switchTo().defaultContent() | 返回到最頂級的主文檔,官方還說了一種可能,就是返回第一個框架,但我暫時未找到這個例子。 |
咱們在html目錄中增長四個html,分別爲frame.html,frame1.html,frame2.html,frameset.html,代碼以下github
frame.html api
<html> <head> <meta > <title></title> </head> <body> <div> 主頁文本框:<input type="text" id="text1" value="" /> </div> <div> <iframe src="frame1.html" id="frame1" name="frame1"> <p>您的瀏覽器不支持 iframe 標籤。</p> </iframe> </div> <div> <iframe src="frame2.html" id="frame2" name="frame2"> <p>您的瀏覽器不支持 iframe 標籤。</p> </iframe> </div> </body> </html>
frame1.html瀏覽器
<!DOCTYPE html> <html> <head> <meta > <title></title> </head> <body> <p>frame1文本框:<input id="text1" type="text" /></p> </body> </html>
frame2.html框架
<!DOCTYPE html> <html> <head> <meta > <title></title> </head> <body> <p>frame2文本框:<input id="text1" type="text" /></p> </body> </html>
frameset.html測試
<!DOCTYPE html> <html> <head> <meta> <title>窗口切換</title> </head> <frameset rows="*,*" ,border="0" scrolling="no"> <frame src="frame1.html" name="frame1" /> <frame src="frame2.html" name="frame2" /> </frameset> </html>
以上的代碼都很簡單,都是常見的兩種框架,iframe和frameset,創建四個html後,咱們的項目結構是這樣的spa
咱們先來測試下iframe,下面這段代碼的效果是,按次序切換到框架2,框架1,主框架,而且切換的時候,找到框架中的文本框,輸入文本3d
須要注意的時,每次切換完,下次切換到其餘框架時,都須要先切換到最頂端的主文檔,即先調用switchTo().defaultContent(),不然會拋出異常。
//獲得WebDriver WebDriver driver=DriverHelper.CreateChromeDriver(); //爲什麼此處刷新該頁,由於發現第一次加載時,並不肯定能載入iframe的內容,刷新後,基本都能載入,後面將會講到Selenium的「等待」 driver.get("D:\\WorkSpace\\SeleniumTest\\html\\frame.html"); Thread.sleep(1000); driver.get("D:\\WorkSpace\\SeleniumTest\\html\\frame.html"); Thread.sleep(1000); //切換到框架2,找到文本框,輸入「frame2」,首次運行,焦點默認在主文檔 driver.switchTo().frame(1); WebElement textFrame2=driver.findElement(By.id("text1")); textFrame2.sendKeys("frame2"); Thread.sleep(1000); //切換到框架1,找到文本框狂,輸入「frame1」 //須要先切換到最頂端文檔,不然會拋出異常,找不到該框架 driver.switchTo().defaultContent(); driver.switchTo().frame(0); WebElement textFrame1=driver.findElement(By.id("text1")); textFrame1.sendKeys("frame1"); Thread.sleep(1000); //切換回最頂端文檔,找到文本框,輸入「main」 driver.switchTo().defaultContent(); WebElement textMain=driver.findElement(By.id("text1")); textMain.sendKeys("main");
對於frameset.html,操做大同小異,你們可自行嘗試,此處就不囉嗦。
除了每次切換前,先調用switchTo().defaultContent()外,當第一次訪問frame.html時,框架不必定加載成功,這個要引發咱們的注意,實際上,這種狀況常常出現,後面將會講到如何避免這種狀況的發生。
最後給出本次代碼執行的效果: