HtmlUnit测试工具的推出,创意非常好。是一款给java开发用的browser。说它是browser,其实它是对html建模并且提供API来访问页面,点击链接等等的java类库。

    这样的测试工具有这样几个优点:
运行起来没有界面,速度非常快。
由于是java类库,有无限扩展的可能,可以构造各种功能强大的工具。包括本地化测试,多种数据源输入数据。
跨平台,跨浏览器。java本身就有跨平台的特性,浏览器,只要简单的设定一个参数就可以轻易模仿想要的浏览器了。
转化为性能测试,非常简单,可以共享同一脚本。
 
官网:http://htmlunit.sourceforge.net/
 
代码示例:
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.HttpMethod;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequest;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.util.NameValuePair; public class MySina { private WebClient client;
private WebRequest request;
private String sinaLoginUrl = " http://mail.sina.com.cn/cgi-bin/login.php";
private String hostSinaUrl = ""; public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
String username = "***";
String password = "***";
String newpassword = "***";
String nickname = "***"; MySina mySina = new MySina();
if (mySina.mailLoginBySina(username, password)) { // 登录
mySina.updatePwdBySina(password, newpassword); // 修改密码
mySina.updateNickName(nickname); // 修改帐户昵称
} else {
System.out.println("登录失败!请检查用户名和密码是否正确!");
}
} public MySina(){
client = new WebClient(BrowserVersion.INTERNET_EXPLORER_8);
client.setJavaScriptEnabled(false);
} /**
* 更改帐户昵称
*
* @param nickname 昵称
* @return boolean
* @throws FailingHttpStatusCodeException
* @throws IOException
*/ public boolean updateNickName(String nickname) throws FailingHttpStatusCodeException, IOException {
String sinaSetUrl = hostSinaUrl + "basic/setting_account";
request = new WebRequest(new URL(sinaSetUrl), HttpMethod.POST);
request.setCharset("utf-8");
request.setRequestParameters(Arrays.asList(new NameValuePair("nickname", nickname), new NameValuePair("pop3",
"on"),
new NameValuePair("imap", "on")));
client.getPage(request);
HtmlPage p = client.getPage(hostSinaUrl + "classic/index.php"); if (p.getBody().getTextContent().indexOf("\"NickName\":\"" + nickname + "\"") > 0) {
return true;
} else {
return false;
} } /**
* 修改密码
*
* @param oldpassword 旧密码
* @param newpassword 新密码
* @return boolean
* @throws FailingHttpStatusCodeException
* @throws IOException
*/ public boolean updatePwdBySina(String oldpassword, String newpassword) throws FailingHttpStatusCodeException,
IOException {
String sinaSetUrl = " http://login.sina.com.cn/member/security/password.php";
request = new WebRequest(new URL(sinaSetUrl), HttpMethod.POST);
request.setCharset("gbk");
request.setRequestParameters(Arrays.asList(new NameValuePair("pass", oldpassword),
new NameValuePair("pass1", newpassword),
new NameValuePair("pass2", newpassword)));
HtmlPage p = client.getPage(request); if (p.getBody().getTextContent().indexOf("您的密码修改成功") > 0) {
return true;
} else {
return false;
}
} /**
* 登录
*
* @param username 用户名
* @param password 密码
* @return boolean
* @throws FailingHttpStatusCodeException
* @throws MalformedURLException
* @throws IOException
*/ public boolean mailLoginBySina(String username, String password) throws FailingHttpStatusCodeException,
MalformedURLException, IOException { HtmlPage loginPage = client.getPage(sinaLoginUrl);
HtmlForm loginForm = loginPage.getFormByName("free");
HtmlInput u = loginForm.getInputByName("u");
HtmlInput psw = loginForm.getInputByName("psw");
HtmlSubmitInput loginButton = loginForm.getInputByName("登录");
u.setValueAttribute(username);
psw.setValueAttribute(password);
HtmlPage result = loginButton.click();
String resultUrl = result.getUrl().toString(); if (resultUrl.indexOf("classic/index.php") > 0) {
String regex = "http://(.*?)/";
hostSinaUrl = myRegex(resultUrl, regex, null);
if (hostSinaUrl.length() > 0) {
return true;
} else {
return false;
}
} else {
return false;
} } /**
* 正则匹配替换
*
* @param str
* @param reg
* @param replace
* @return
*/ public String myRegex(String str, String reg, String[] replace) {
String result = null;
Matcher m = Pattern.compile(reg).matcher(str);
while (m.find()) {
result = m.group();
if (replace != null && replace.length > 0) {
for (String s : replace) {
result = result.replace(s, "");
}
}
}
return result;
}
}

  

html页面工具-htmlUnit的更多相关文章

  1. 如何编辑PDF文件,怎么使用PDF裁剪页面工具

    在编辑PDF文件的时候,往往会有很多的小技巧可以使用,在编辑PDF文件的时候,怎么对文件的页面进行裁剪呢,不会的话,看看下面的文章吧,小编已经为大家整理好了哦. 1.打开运行PDF编辑器,在编辑器中打 ...

  2. jekyll介绍安装.github静态页面工具

    jekyll build # => 当前文件夹中的内容将会生成到 ./site 文件夹中. $ jekyll build --destination <destination> # ...

  3. 微软Connect教程系列--自动生成增删改查页面工具介绍(二)

    本章课程描述了vs2015的三个特点,其中主要将描述在vs2015下面,使用命令自动生成增删改查界面,具体如下: 1.web.config文件不在存在,用config.json替代,以适应支撑vs的插 ...

  4. Javascrpt 页面工具

    /**  *  笔者:DL  *  时间:2014-3-19   * PagingTool模块提供最基本的.网页工具栏.和页面数据 回电话 可扩展性 分页工具栏介绍,和页面呈现的数据   *   主意 ...

  5. ASP.NET 数据库页面访问简单工具

    在工作中,有很多项目已上线后,很多项目的数据库服务器都不会对外开放的,外网想直接访问客户数据库服务器时,可能会出现困难. 这时就需要一个可以查询,更新数据库操作的页面了: 本来用sql语句直接操作数据 ...

  6. [转]以Facebook为案例剖析科技公司应有的工具文化

    原文:http://36kr.com/p/146507.html 这是一篇几年前的文章,但对于没有涉及到工具文化这个概念的人来说,还是很新的. 前言 前段时间和大众点评的 CEO 张涛聊天的时候碰到内 ...

  7. ArcGIS空间分析工具

    1. 3D分析 1.1. 3D Features toolset 工具 工具 描述 3D Features toolset (3D 要素工具集) Add Z Information 添加 Z 信息 添 ...

  8. 自定义tld标签,页面使用

    背景需求: 系统本身的session不能在页面使用 如下: controller: @RequestMapping(method=RequestMethod.GET) public String ge ...

  9. 以Facebook为案例剖析科技公司应有的工具文化

    http://www.36kr.com/p/146507.html 编者按:本文由 @王淮Harry哥 撰写,摘自他即将出版的新书.王淮是 Facebook 早期员工,中国藉第二位工程师第一位研发经理 ...

随机推荐

  1. C#获得窗口控件句柄

    /*整个Windows编程的基础.一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条, ...

  2. error MSB3073 解决办法

    发现拷贝命令编译错误,查看输出列表发现时无法找到相应的路径. 1.顺着这个思路第一个想到的是中文路径的问题,先修改了盘符的中文名称,发现还是无法解决具体的问题. 2.后来反复查阅网上的资料,发现帮助并 ...

  3. C++ 经典知识点面试题

    1.指针的优点和缺点 优点:灵活高效 (1)提高程序的编译效率和执行速度(数组下标往下移时,需要使用乘法和加法,而指针直接使用++即可) (2)通过指针可使用主调函数和被调函数之间共享变量或数据结构, ...

  4. wampServer 安装 Redis 扩展

    REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵守B ...

  5. Python进制转换(二进制/八进制/十进制/十六进制)

    Python 进制转换 二进制 八进制 十进制 十六进制 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/p/python3-scale.html 全局定义 ba ...

  6. [Go] 理解 golang 中的 nil

    nil是什么 相信写过Golang的程序员对下面一段代码是非常非常熟悉的了: if err != nil { // do something.... } 当出现不等于nil的时候,说明出现某些错误了, ...

  7. Java LinkedList工作原理及实现

    1. 概述 以双向链表实现.链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作. 按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组 ...

  8. 奇怪吸引子---QiChen

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  9. C# Dictionary, SortedDictionary, SortedList

    就我个人觉得Dictionary, SortedDictionary, SortedList 这几个类的使用是比较简单的,只要稍微花点时间在网上查找一点资料,然后在阅读以下源码就理解的很清楚了.为什么 ...

  10. .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)

    本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...