Selenium WebDriver高級用法
掌握selenium初級用法后,來繼續深入學習。
選擇合適的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("http://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("http://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 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("
//添加Cookie
Cookie cookie = new Cookie("uuid", "abcdedfjeiajfei");
driver.manage().addCookie(cookie);
//遍歷當前域名的cookie
Set(Cookie) allCookies = driver.manage().getCookies();
for(Cookie loadedCookie : allCookies)
{
System.out.println(String.format("%s ---> %s", loadedCookie.getName(), loadedCookie.getValue()));
}</code></pre>
本文鏈接地址: Selenium WebDriver高級用法