1. 程式人生 > >【轉】 HtmlUnit簡介

【轉】 HtmlUnit簡介

HtmlUnit簡介:

HtmlUnit 是 JUnit 的擴充套件測試框架之一。HtmlUnit 將返回文件模擬成 HTML,這樣您便可以直接處理這些文件了。HtmlUnit 使用例如 table、form 等識別符號將測試文件作為 HTML 來處理。它同樣需要遵循 JUnit 測試框架結構的 Java™ 測試程式。

解壓後將lib目錄下面的jar檔案放入工程的classpath就可以使用了。

基本套路

對於一些開源框架的使用,都有一定的基本套路,對於HtmlUnit,由於是對JUnit的擴充套件,當然,也需要繼承自TestCase,並且也可以Override相應的setUp()和tearDown()方法。對於HtmlUnit的使用,也有著基本的套路,如下:

Java程式碼 複製程式碼
  1. publicvoid testHomePage() throws Exception {   
  2. // 新建一個WebClient物件,此物件相當於瀏覽器
  3. final WebClient webClient = new WebClient();   
  4. // 構造一個URL,指向需要測試的URL,如http://www.javaeye.com
  5.         URL url = new URL("http://www.javaeye.com");   
  6. // 通過getPage()方法,返回相應的頁面
  7.         HtmlPage page = (HtmlPage) webClient.getPage(url);   
  8. // System.out.println(page.getTitleText());
  9.         assertEquals(   
  10. "JavaEye Java程式設計 Spring框架 AJAX技術 Agile敏捷軟體開發 ruby on rails實踐 - JavaEye做最棒的軟體開發交流社群",   
  11.                 page.getTitleText());   
  12.     }  
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程式碼 複製程式碼
  1. // 或取一個<a>的超連結
  2. //HtmlAnchor anchor = (HtmlAnchor) page.getAnchorByName("welcome");
  3.         page = (HtmlPage) page.getAnchorByName("welcome").click();   
  4.         String pageContent = page.getWebResponse().getContentAsString();   
  5.         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程式碼 複製程式碼
  1. publicvoid testHomePage() throws Exception {   
  2. final WebClient webClient = new WebClient();   
  3. // 獲取首頁
  4. final HtmlPage page1 = (HtmlPage) webClient.getPage("http://htmlunit.sourceforge.net");   
  5. // 根據form的名字獲取頁面表單,也可以通過索引來獲取:page.getForms().get(0)
  6. final HtmlForm form = page1.getFormByName("myform");   
  7. final HtmlSubmitInput button    
  8.             = (HtmlSubmitInput) form.getInputByName("submitbutton");   
  9. final HtmlTextInput textField    
  10.             = (HtmlTextInput) form.getInputByName("userid");   
  11. // 設定表單域的值
  12.         textField.setValueAttribute("root");   
  13. // 提交表單,返回提交表單後跳轉的頁面
  14. final HtmlPage page2 = (HtmlPage) button.click();   
  15.     }  
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程式碼 複製程式碼
  1. String pageContent = page.getWebResponse().getContentAsString();   
  2.         System.out.println(pageContent);   
  3. int indexInt = pageContent.indexOf(WELCOME);   
  4. // assert whether Login successful, using user and password
  5.         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測試程式碼,則可以作為自動化測試,不過不知道有沒有公司這麼幹的。