HTMLUnit web测试
httpClient不能动态执行网页中的js,这样无法获取js生成的动态网页。htmlUnit是个解决方法。
if you’re considering web application testing tools, you’re probably looking at more than just these two options. Canoo WebTest, TestMaker, JWebUnit, Selenium, WebDriver and JMeter are all likely to be on your list.
HtmlUnit – A quick introduction
- HtmlUnit is an open source java library for creating HTTP calls which imitate the browser functionality.
- HtmlUnit is mostly used for integration testing upon Unit test frameworks such as JUnit or TestNG. This is done by requesting web pages and asserting the results.
Simple Example
1 2 3 4 5 6 | @Test public void testGoogle(){ WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/" ); assertEquals( "Google" , currentPage.getTitleText()); } |
WebClient
- As you can see in the example, the WebClient is the starting point. It is the browser simulator.
- WebClient.getPage() is just like typing an address in the browser. It returns an HtmlPage object.
HtmlPage
- HtmlPage represents a single web page along with all of it’s client’s data (HTML, JavaScript, CSS …).
- The HtmlPage lets you access to many of a web page content:
Page source
- You can receive the page source as text or as XML.
1 2 3 4 | HtmlPage currentPage = webClient.getPage( "http://www.google.com/" ); String textSource = currentPage.asText(); String xmlSource = currentPage.asXml(); |
HTML Elements
- HtmlPage lets you ability to access any of the page HTML elements and all of their attributes and sub elements. This includes tables, images, input fields, divs or any other Html element you may imagine.
- Use the function getHtmlElementById() to get any of the page elements.
1 2 3 4 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/" ); HtmlImage imgElement = (HtmlImage)currentPage.getHtmlElementById( "logo" ); System.out.println(imgElement.getAttribute( "src" )); |
Anchors
- Anchor is the representation of the Html tag <a href=”…” >link</a>.
- Use the functions getAnchorByName(), getAnchorByHref() andgetAnchorByText() to easily access any of the anchors in the page.
1 2 3 4 5 6 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/" ); HtmlAnchor advancedSearchAn = currentPage.getAnchorByText( "Advanced Search" ); currentPage = advancedSearchAn.click(); assertEquals( "Google Advanced Search" ,currentPage.getTitleText()); |
Dom elements by XPath
- You can access any of the page elements by using XPath.
1 2 3 4 5 6 7 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/search?q=avi" ); //Using XPath to get the first result in Google query HtmlElement element = (HtmlElement)currentPage.getByXPath( "//h3" ).get( 0 ); DomNode result = element.getChildNodes().get( 0 ); |
Form control
- A large part of controlling your HTML page is to control the form elements:
- HtmlForm
- HtmlTextInput
- HtmlSubmitInput
- HtmlCheckBoxInput
- HtmlHiddenInput
- HtmlPasswordInput
- HtmlRadioButtonInput
- HtmlFileInput
1 2 3 4 5 6 7 8 9 10 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/" ); //Get the query input text HtmlInput queryInput = currentPage.getElementByName( "q" ); queryInput.setValueAttribute( "aviyehuda" ); //Submit the form by pressing the submit button HtmlSubmitInput submitBtn = currentPage.getElementByName( "btnG" ); currentPage = submitBtn.click(); |
Tables
1 2 3 4 5 6 7 8 | currentPage = webClient.getPage( "http://www.google.com/search?q=htmlunit" ); final HtmlTable table = currentPage.getHtmlElementById( "nav" ); for ( final HtmlTableRow row : table.getRows()) { System.out.println( "Found row" ); for ( final HtmlTableCell cell : row.getCells()) { System.out.println( " Found cell: " + cell.asText()); } } |
JavaScript support
- HtmlUnit uses the Mozilla Rhino JavaScript engine.
- This lets you the ability to run pages with JavaScript or even run JavaScript code by command.
1 | ScriptResult result = currentPage.executeJavaScript(JavaScriptCode); |
- By default JavaScript exceptions will crash your tests. If you wish to ignore JavaScript exceptions use this:
1 | webClient().setThrowExceptionOnScriptError( false ); |
- If you would like to turn off the JavaScript all together, use this:
1 | currentPage.getWebClient().setJavaScriptEnabled( false ); |
HTTP elements
URL
1 2 3 4 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.co.uk/search?q=htmlunit" ); URL url = currentPage.getWebResponse().getRequestSettings().getUrl() |
Response status
1 2 3 4 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/" ); assertEquals( 200 ,currentPage.getWebResponse().getStatusCode()); assertEquals( "OK" ,currentPage.getWebResponse().getStatusMessage()); |
Cookies
1 2 3 4 | Set<Cookie> cookies = webClient.getCookieManager().getCookies(); for (Cookie cookie : cookies) { System.out.println(cookie.getName() + " = " + cookie.getValue()); } |
Response headers
1 2 3 4 5 6 7 8 9 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/search?q=htmlunit" ); List<NameValuePair> headers = currentPage.getWebResponse().getResponseHeaders(); for (NameValuePair header : headers) { System.out.println(header.getName() + " = " + header.getValue()); } |
Request parameters
1 2 3 4 5 | List<NameValuePair> parameters = currentPage.getWebResponse().getRequestSettings().getRequestParameters(); for (NameValuePair parameter : parameters) { System.out.println(parameter.getName() + " = " + parameter.getValue()); } |
Making assertions
- HtmlUnit comes with a set of assetions:
assertTitleEquals(HtmlPage, String) assertTitleContains(HtmlPage, String) assertTitleMatches(HtmlPage, String) assertElementPresent(HtmlPage, String) assertElementPresentByXPath(HtmlPage, String) assertElementNotPresent(HtmlPage, String) assertElementNotPresentByXPath(HtmlPage, String) assertTextPresent(HtmlPage, String) assertTextPresentInElement(HtmlPage, String, String) assertTextNotPresent(HtmlPage, String) assertTextNotPresentInElement(HtmlPage, String, String) assertLinkPresent(HtmlPage, String) assertLinkNotPresent(HtmlPage, String) assertLinkPresentWithText(HtmlPage, String) assertLinkNotPresentWithText(HtmlPage, String) assertFormPresent(HtmlPage, String) assertFormNotPresent(HtmlPage, String) assertInputPresent(HtmlPage, String) assertInputNotPresent(HtmlPage, String) assertInputContainsValue(HtmlPage, String, String) assertInputDoesNotContainValue(HtmlPage, String, String)
- You can still of course use the framework’s assertions. For example, if you are using JUnit, you can still use assertTrue() and so on.
- Here are a few examples:
1 2 3 4 5 6 7 8 9 10 11 | WebClient webClient = new WebClient(); HtmlPage currentPage = webClient.getPage( "http://www.google.com/search?q=htmlunit" ); assertEquals( 200 ,currentPage.getWebResponse().getStatusCode()); assertEquals( "OK" ,currentPage.getWebResponse().getStatusMessage()); WebAssert.assertTextPresent(currentPage, "htmlunit" ); WebAssert.assertTitleContains(currentPage, "htmlunit" ); WebAssert.assertLinkPresentWithText(currentPage, "Advanced search" ); assertTrue(currentPage.getByXPath( "//h3" ).size()> 0 ); //result number assertNotNull(webClient.getCookieManager().getCookie( "NID" )); |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?