Selenium WebDriver高級用法

jopen 10年前發布 | 252K 次閱讀 Selenium 測試工具 Selenium WebDriver

掌握selenium初級用法后,來繼續深入學習。

選擇合適的WebDrvier

WebDriver是一個接口,它有幾種實現,分別是HtmlUnitDrvierFirefoxDriverInternetExplorerDriverChromeDriverOperaDriver,除了 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>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!