1.前期准备
下载HtmlUnit,本博客使用的是2.15版本。
2.人人网登陆页面分析
在浏览器输入人人网登陆地址,查看网页源码可发现,登陆框代码如下:
<form method="post" <span style="color:#ff0000;">id="loginForm"</span> class="login-form" action="http://www.renren.com/PLogin.do">
<dl class="top clearfix">
<dd>
<input <span style="color:#ff0000;">type="text"</span> <span style="color:#ff0000;">name="email"</span> class="input-text" <span style="color:#ff0000;">id="email"</span> tabindex="1" value="" />
</dd>
</dl>
<dl class="pwd clearfix">
<dd>
<input <span style="color:#ff0000;">type="password" id="password" name="password"</span> error="请输入密码" class="input-text" tabindex="2"/>
<label class="pwdtip" id="pwdTip" for="password">请输入密码</label>
<a class="forgetPwd" id="forgetPwd" href="http://safe.renren.com/findPass.do" stats="home_findpassword">忘记密码?</a>
</dd>
</dl>
<div class="caps-lock-tips" id="capsLockMessage" style="display:none"></div>
<dl class="savepassword clearfix">
<dt>
<label title="为了确保您的信息安全,请不要在网吧或者公共机房勾选此项!" for="autoLogin" class="labelCheckbox">
<input type="checkbox" name="autoLogin" id="autoLogin" value="true" tabindex="4" />下次自动登录
</label>
</dt>
<dd>
<span class="getpassword" id="getpassword"><a href="http://safe.renren.com/findPass.do" stats="home_findpassword">忘记密码?</a></span>
</dd>
</dl>
<dl id="code" class="code clearfix">
<dt><label for="code">验证码:</label></dt>
<dd>
<input id="icode" type="text" name="icode" class="input-text" tabindex="3" autocomplete="off" />
<label class="codetip" id="codeTip" for="icode">请输入验证码</label>
</dd>
</dl>
<dl id="codeimg" class="codeimg clearfix">
<dt></dt>
<dd><img id="verifyPic_login" src="http://icode.renren.com/getcode.do?t=web_login&rnd=Math.random()"/>
</dd>
<a class="changeone" href="javascript:refreshCode_login();" >换一个</a>
</dl>
<dl class="bottom">
<input type="hidden" name="origURL" value="http://www.renren.com/home" />
<input type="hidden" name="domain" value="renren.com" />
<input type="hidden" name="key_id" value="1" />
<input type="hidden" name="captcha_type" id="captcha_type" value="web_login" />
<input <span style="color:#ff0000;">type="submit" id="login"</span> class="input-submit login-btn" stats="loginPage_login_button" <span style="color:#ff0000;">value="登录"</span> tabindex="5"/>
</dl>
</form>
欲模拟登陆,就先将用户名和密码填入响应输入框,人后将表单提交。简单浏览上述代码容易发现,表单的id为loginForm,
用户名输入框的name属性为email,密码输入框的name属性为password,登陆按钮的value属性为登陆,去代码中红色片段。通过
响应属性获取响应元素,执行相应操作即可。
3.编码实现
新建java工程,将HtmlUnit文件下libs下的所有*.jar添加到工程的classpath。具体方法为:右键工程,选择构建路径,选择配置构建路径,
添加外部Jar,全选添加。
package wukesly.htmlUnit.login;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
public class LoginRenren {
/**
* 人人网登陆页面地址
*/
private static final String rrUrl = "http://www.renren.com/";
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 浏览器
*/
private WebClient webClient;
/**
* 登陆页面
*/
private HtmlPage loginPage;
/**
* 登陆表单
*/
private HtmlForm loginForm;
/**
* 人人网登陆表格id
*/
private static final String formId = "loginForm";
/**
* 用户名输入域
*/
private HtmlTextInput usenameField;
/**
* 密码输入域name
*/
private static final String uFieldName = "email";
/**
* 密码输入域
*/
private HtmlPasswordInput passwordField;
/**
* 密码输入域name
*/
private static final String pFieldName = "password";
/**
* 登陆按钮
*/
private HtmlSubmitInput loginBnt;
/**
* 登陆按钮的值
*/
private static final String bntValue = "登录";
/**
* 登陆成功返回页面
*/
private HtmlPage retPage;
/**
* @param username 用户名
* @param password 密码
*/
public LoginRenren(String username, String password) {
this.username = username;
this.password = password;
init();
}
/**
* 初始化函数
*/
private void init(){
//初始化浏览器
webClient = new WebClient(BrowserVersion.CHROME);
//设置浏览器
setting();
}
private void setting(){
// TODO 设置浏览器属性
webClient.getOptions().setJavaScriptEnabled(false);
}
/**
* 关机
*/
public void shutdown(){
//关闭浏览器
webClient.closeAllWindows();
}
/**
* 登陆
* @return 登陆成功返回的页面
* @exception 页面获取异常
*/
public HtmlPage Login() throws Exception{
//获取登陆页面
loginPage = webClient.getPage(rrUrl);
//获取表单,人人网登陆页面只有一个表单
loginForm = loginPage.getForms().get(0);
//获取用户名输入域
usenameField = loginForm.getInputByName(uFieldName);
//获取密码输入域
passwordField = loginForm.getInputByName(pFieldName);
//设置登陆参数
usenameField.setValueAttribute(username);
passwordField.setValueAttribute(password);
//获取登陆按钮
loginBnt = loginForm.getInputByValue(bntValue);
//提交表单
retPage = loginBnt.click();
return retPage;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
String u = "usename";//填写默认用户名
String p = "password";//填写默认密码
if(args.length<2){
System.out.println("运行参数为默认!");
}else if(args.length==2){
u = args[0];
p = args[1];
}
LoginRenren loginRenren = new LoginRenren(u, p);
try {
HtmlPage page = loginRenren.Login();
System.out.println("*********************登陆成功!文本内容如下:*************************");
<span style="white-space:pre"> </span>//输出登陆成功返回页面的文本内容
System.out.print(page.asText());
} catch (Exception e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
loginRenren.shutdown();
}
}