【轉】 HtmlUnit簡介
HtmlUnit簡介:
HtmlUnit 是 JUnit 的擴充套件測試框架之一。HtmlUnit 將返回文件模擬成 HTML,這樣您便可以直接處理這些文件了。HtmlUnit 使用例如 table、form 等識別符號將測試文件作為 HTML 來處理。它同樣需要遵循 JUnit 測試框架結構的 Java™ 測試程式。解壓後將lib目錄下面的jar檔案放入工程的classpath就可以使用了。
基本套路
對於一些開源框架的使用,都有一定的基本套路,對於HtmlUnit,由於是對JUnit的擴充套件,當然,也需要繼承自TestCase,並且也可以Override相應的setUp()和tearDown()方法。對於HtmlUnit的使用,也有著基本的套路,如下:
- publicvoid testHomePage() throws Exception {
- // 新建一個WebClient物件,此物件相當於瀏覽器
- final WebClient webClient = new WebClient();
- // 構造一個URL,指向需要測試的URL,如http://www.javaeye.com
- URL url = new URL("http://www.javaeye.com");
- // 通過getPage()方法,返回相應的頁面
- HtmlPage page = (HtmlPage) webClient.getPage(url);
- // System.out.println(page.getTitleText());
- assertEquals(
- "JavaEye Java程式設計 Spring框架 AJAX技術 Agile敏捷軟體開發 ruby on rails實踐 - JavaEye做最棒的軟體開發交流社群",
- page.getTitleText());
- }
public void testHomePage() throws Exception { // 新建一個WebClient物件,此物件相當於瀏覽器 final WebClient webClient = new WebClient(); // 構造一個URL,指向需要測試的URL,如http://www.javaeye.com URL url = new URL("http://www.javaeye.com"); // 通過getPage()方法,返回相應的頁面 HtmlPage page = (HtmlPage) webClient.getPage(url); // System.out.println(page.getTitleText()); assertEquals( "JavaEye Java程式設計 Spring框架 AJAX技術 Agile敏捷軟體開發 ruby on rails實踐 - JavaEye做最棒的軟體開發交流社群", page.getTitleText()); }
WebClient物件提供了一系列涉及到瀏覽器的方法,比如像
setThrowExceptionOnScriptError(false|true)-是否丟擲頁面javascript錯誤
setThrowExceptionOnFailingStatusCode(false|true)-是否丟擲response的錯誤
HtmlPage對應頁面,getTitleText()返回頁面的title。
執行測試,就會看到我們所喜愛的綠條。
HtmlUnit的頁面元件
像上面的HtmlPage,HtmlUnit中定義了許多頁面元件物件,像HtmlForm對應Form表單,HtmlImage對應頁面中的img標籤, HtmlInput對應頁面中的input標籤,HtmlAnchor對應頁面中的超連結,頁面中的每一個標籤,HtmlUnit都會有相對應的物件,具體的,可以參看隨HtmlUnit下載的doc文件。
超連結
Java程式碼- // 或取一個<a>的超連結
- //HtmlAnchor anchor = (HtmlAnchor) page.getAnchorByName("welcome");
- page = (HtmlPage) page.getAnchorByName("welcome").click();
- String pageContent = page.getWebResponse().getContentAsString();
- System.out.println(pageContent);
// 或取一個<a>的超連結
//HtmlAnchor anchor = (HtmlAnchor) page.getAnchorByName("welcome");
page = (HtmlPage) page.getAnchorByName("welcome").click();
String pageContent = page.getWebResponse().getContentAsString();
System.out.println(pageContent);
Form提交
只是簡單的測試一個頁面的title,當然無法滿足需求,對於WEB應用,有著大量的表單,所以HtmlUnit提供了HtmlForm這個物件,以及表單操作的相應方法:
Java程式碼- publicvoid testHomePage() throws Exception {
- final WebClient webClient = new WebClient();
- // 獲取首頁
- final HtmlPage page1 = (HtmlPage) webClient.getPage("http://htmlunit.sourceforge.net");
- // 根據form的名字獲取頁面表單,也可以通過索引來獲取:page.getForms().get(0)
- final HtmlForm form = page1.getFormByName("myform");
- final HtmlSubmitInput button
- = (HtmlSubmitInput) form.getInputByName("submitbutton");
- final HtmlTextInput textField
- = (HtmlTextInput) form.getInputByName("userid");
- // 設定表單域的值
- textField.setValueAttribute("root");
- // 提交表單,返回提交表單後跳轉的頁面
- final HtmlPage page2 = (HtmlPage) button.click();
- }
public void testHomePage() throws Exception {
final WebClient webClient = new WebClient();
// 獲取首頁
final HtmlPage page1 = (HtmlPage) webClient.getPage("http://htmlunit.sourceforge.net");
// 根據form的名字獲取頁面表單,也可以通過索引來獲取:page.getForms().get(0)
final HtmlForm form = page1.getFormByName("myform");
final HtmlSubmitInput button
= (HtmlSubmitInput) form.getInputByName("submitbutton");
final HtmlTextInput textField
= (HtmlTextInput) form.getInputByName("userid");
// 設定表單域的值
textField.setValueAttribute("root");
// 提交表單,返回提交表單後跳轉的頁面
final HtmlPage page2 = (HtmlPage) button.click();
}
表單的提交,超連結的跳轉,都是通過click()方法,既通過滑鼠點選事件觸發的。它們都可以返回相應的HtmlPage物件,然後通過HtmlPage 物件的相應方法來測試,其實,HtmlPage物件,就是包裝了頁面Html的一個物件,可以通過page.getWebResponse(). getContentAsString()直接返回頁面的html程式碼,然後通過HTML程式碼來測試:
Java程式碼- String pageContent = page.getWebResponse().getContentAsString();
- System.out.println(pageContent);
- int indexInt = pageContent.indexOf(WELCOME);
- // assert whether Login successful, using user and password
- assertTrue(indexInt != -1);
String pageContent = page.getWebResponse().getContentAsString();
System.out.println(pageContent);
int indexInt = pageContent.indexOf(WELCOME);
// assert whether Login successful, using user and password
assertTrue(indexInt != -1);
頁面中的javascript
對於頁面中的javascript,HtmlUnit並沒有太好的測試方法,也只能通過相應的ScriptEngine來處理。
對於HtmlUnit,個人感覺實用性並不太大。當然,如果有專人寫HtmlUnit測試程式碼,則可以作為自動化測試,不過不知道有沒有公司這麼幹的。