轉自:http://www.open-open.com/lib/view/open1402625607337.html
選擇合適的WebDrvier
WebDriver是一個介面,它有幾種實現,分別是HtmlUnitDrvier、FirefoxDriver、InternetExplorerDriver、ChromeDriver、OperaDriver,除了 InternetExplorerDriver只能在Windows平台運行,其他WebDriver均能跨平台。
如果追求運行速度,HtmlUnitDriver是首選,但是它沒有運行介面,不能即時看到運行效果。如果想看到運行效果,可以使用FirefoxDrvier,它會真正開啟瀏覽器,在螢幕上運行,因此我們可以監測頁面元素的位置、CSS的值等,但是代價就是速度慢。
這裡為了簡單,使用 HtmlUnitDriver.
WebDriver driver = new HtmlUnitDriver();
導航
有了WebDriver執行個體,第一件事情就是開啟頁面。一般的做法是調用get方法:
driver.get("http://www.yeetrack.com");
WebDriver會一直等待,直到頁面載入完畢(也就是”onload”方法釋放)。
和頁面進行互動 僅僅開啟頁面還不夠,我們需要的是在頁面上進行操作,進一步講就是要操作頁面中的html元素,如:
<input type="text" name="passwd" id="passwd-id" />
要操作頁面元素,首先要定位元素,可以通過多種方法定位,如下:
WebElement element;element = driver.findElement(By.id("passwd-id"));element = driver.findElement(By.name("passwd"));element = driver.findElement(By.xpath("//input[@id='passwd-id']"));
定位元素時,有兩點要注意。通過text的值來定位一個Link時,text必須精確匹配;通過xpath來定位元素時,如果匹配到多條,只會返回第一條結果,如果沒有匹配到,會拋 NoSuchElementException 異常。
WebDriver擁有”Object-baseed” API,我們可以使用WebElement來表示所有的頁面元素。WebElement類有很多操作元素的方法,但是有些方法可能對當前元素無效,不用擔 心,WebDriver會儘力幫我們處理。如,對一個”meta”標籤元素,我們調用了WebElement的”SetSelected()”方 法,WebDriver會拋出異常。
我們定位到一個Element,接下來,我們可能要進行一些操作,如想鍵入一些字元:
element.sendKeys("sone text");
當然,我們也可以通過”Keys”這個類,來類比鍵盤輸入:
element.sendKeys(" and some", Keys.ARROW_DOWN);
記住,我們向這些元素輸入的字串,它們不會自動清空,也就是說調用”sendKeys()”方法,就是向元素中追加字串。如果要清空一個input標籤或者textarea:
element.clear();
填寫表單
已經知道了如何鍵入字串,那麼其他元素呢。如checkboxes,如何選中;”OPTION”標籤,如何設定”setSelected()”。下面是處理Select標籤的例子:
WebElement select = driver.findElement(By.xpath("//select"));List<WebElement> allOptions = select.findElements(By.tagName("option"));for(WebElement option : allOptions){ System.out.println(String.format("Value is " %s, option.getAttribute("value"))); option.click();}
上面的代碼,首先定位一個Select元素,然後擷取它下面的所有option,並且列印出來,執行一個click操作。明顯,如果想選中某個選 中,這種方法不是最佳選擇。其實WebDrvier定義了Select類,它提供一些更快捷的方式, 如”selectByIndex()”、”selectByValue()”。
表單填寫完畢,然後就是提交,我們可以通過點擊提交按鈕,進行提交。
driver.findElement(By.id("submit")).click(); 或者,WebElement提供”submit()”這個方法,如果當前元素處在form表單中,調用該元素的submit方法,WebDriver就會自動認可這個表單;如果不處於form表單中,會拋出”NoSuchElementException”異常。
element.submit();
拖放
WebDriver允許我們拖放元素,如將某個元素拖到其他地方、或者將某個元素拖到其他元素上。
WebElement element = driver.findElement(By.name("source"));WebElement element = driver.findElement(By.name("target"));(new Actions(driver)).dragAndDrop(element, target).perform();
切換window或者Frame
對於現在的web應用程式來說,很少有單個window的情況,都是嵌入了其他的frame。WebDrvier支援使用”switchTO”方法切換到其他window。
driver.switchTo().window.("windowName");
上面的代碼執行後,driver就會切換到windowName這個window。但是如何擷取windowName呢。來一個例子:
<a href="http://www.yeetrack.com" target="windowName">點擊開啟新視窗</a>
還有,我們可以通過”window handle”來切換,並且還可以遍曆當前所有的window
for(String handle : driver.getWindowHandles()){ driver.switchTo().window(handle);}
切換frame(或者iframe)
driver.switchTo().frame("frameName"); switchTo()可以鏈式調用,或者通過index來切換
drvier.switchTo().frame("frameName") .switchTo().frame(0) .switchTo().frame("child"); 上面的語句執行後,driver會進入”frameName”這個frame,然後進入到第一個子frame,然後再進入到這個子frame的名稱是”child”的frame中。如果要回到頂級的frame,執行下面的代碼:
driver.switchTo().defaultContent();
導航:History和Location
早先,我們使用WebDriver的get方法,開啟了”http://www.yeetrack.com”。WebDriver提供一些介面,其中一個如下:
driver.navigate().to("http://www.yeetrack.com"); “navigate().to()”和”get()”方法,實現的功能完全一樣,只不過”get()”拼字起來更簡單。
“navigete”介面,還可以控制瀏覽器的前進和後退:
driver.navigate().forward();driver.navigate().back();
請注意,這個功能完全依賴於底層的瀏覽器。如果兩種瀏覽器的行為不一致,那麼代碼執行的效果也會不一致。
Cookies
瀏覽器的安全性測試,cookie是不能跨域的,所以你想操作A網域名稱的cookie,首先你要讓切換到A網域名稱上。
//開啟網域名稱driver.get("http://www.yeetrack.com");//添加CookieCookie cookie = new Cookie("uuid", "abcdedfjeiajfei");driver.manage().addCookie(cookie);//遍曆當前網域名稱的cookieSet(Cookie) allCookies = driver.manage().getCookies();for(Cookie loadedCookie : allCookies){ System.out.println(String.format("%s ---> %s", loadedCookie.getName(), loadedCookie.getValue()));}