zoukankan      html  css  js  c++  java
  • 用Java模拟网站登录(二)

    本文为原创,转载请声明来源和作者,谢谢!
    作者:_cha1R

    上一篇文章《用Java模拟网站登录》介绍过,模拟一些如百度、QQ之类的网站登录?有两个方式,一是发送模拟请求,二是模拟浏览器操作。那么这次介绍第二种方式,模拟浏览器操作。这个可能知道的人不多,它并没有HttpClient那么出名。当初我在学习它的时候,在百度几乎搜索不到关于它的资料,幸亏我们还可以用Google。它叫htmlunit。

    htmlunit:A java GUI-Less browser, which allows high-level manipulation of web pages, such as filling forms and clicking links; just getPage(url), find a hyperlink, click() and you have all the HTML, JavaScript, and Ajax are automatically processed.

    简单翻译下介绍:一个Java代码版浏览器,它没有图形界面。它可以允许使用网页的一些高级操作,如填写表单、点击链接。你只需要调用getPage(url)方法,然后找到一个超链接,调用click()方法点击它,你就可以得到点击后返回的页面。包括Javascript、Ajax、cookie等都是自动处理的。

    换言之,浏览器能做什么,它就能做什么。它可以模拟浏览器大部分操作,包括解析Js、css!

    在使用它之前,做好准备工作:
    http://sourceforge.net/projects/htmlunit/files/上下载htmlunit-2.13-bin.zip,解压后导入到项目里。

    导入完以后,模拟一个登陆的过程:
    首先创建一个WebClient对象,这个对象跟HttpClient对象有几分相似,同样是一个浏览器对象,可以用它来做点浏览器可以做的事情。
    WebClient webClient =  new WebClient();//创建WebClient

    它可以打开一个网址,返回一个HtmlPage对象,我们可以用它来获得表单。

    HtmlPage page = webClient.getPage("http://www.baidu.com/");    //打开百度

    获得一个HtmlElement对象,可以根据html的id、name来获取,如果都没有,也可以用Xpath语法来获取htmlElement对象

    //获得name为"登陆"的html元素
    HtmlElement htmlElement = page.getElementByName("登陆"); 

    获得后,“点击”这个htmlElement。返回的是点击百度的“登陆”后的页面

    page = htmlElement.click();//调用click()方法

    这样当前的page2就是百度的登陆页面,那么我们要填写表单然后提交表单登陆。

    还是先获取HtmlElement元素

    //获得name为"username"的html元素
    HtmlElement usernameEle = page.getElementByName("username"); 
    //获得id为"password"的html元素
    HtmlElement passwordEle = (HtmlElement)page.getElementById("password");

    填写这两个表单元素,用type()方法,注意先设置焦点:

    usernameEle.focus();   //设置输入焦点
    usernameEle.type("username123");  //填写值
    
    passwordEle.focus();   //设置输入焦点
    passwordEle.type("mypassword");  //填写值

    填写完后,提交登陆表单

    //获得name为"登陆"的元素 
    HtmlElement submitEle = page.getElementByName("登陆"); 
    //点击“登陆”
    page = submitEle.click();

    click()完以后,会返回click()后的HtmlPage对象,我们可以用它来判断是否登陆成功

    String result = page.asXml();//获得click()后的html页面(包括标签)
    if(result.contains("登陆成功!")){
         System.out.println("登陆成功");     
    }else{
         System.out.println("登陆失败");
    }

    下面附上整个代码以便测试:

    WebClient webClient =  new WebClient();//创建WebClient
            HtmlPage page = webClient.getPage("http://www.baidu.com/");    //打开百度
            //获得name为"登陆"的html元素
            HtmlElement htmlElement = page.getElementByName("登陆"); 
            page = htmlElement.click();//调用click()方法
            //获得name为"username"的html元素
            HtmlElement usernameEle = page.getElementByName("username"); 
            //获得id为"password"的html元素
            HtmlElement passwordEle = (HtmlElement) page.getElementById("password");
            usernameEle.focus();   //设置输入焦点
            usernameEle.type("username123");  //填写值
    
            passwordEle.focus();   //设置输入焦点
            passwordEle.type("mypassword");  //填写值
            //获得name为"登陆"的元素 
            HtmlElement submitEle = page.getElementByName("登陆"); 
            //点击“登陆”
            page = submitEle.click();
            String result = page.asXml();//获得click()后的html页面(包括标签)
            if(result.contains("登陆成功!")){
                 System.out.println("登陆成功");     
            }else{
                 System.out.println("登陆失败");
            }




  • 相关阅读:
    static
    crontab
    coco2d-x 纹理研究
    2048-AI程序算法分析
    如何利用SVN合并代码
    Cocos2d-x 对于中文的支持-----iconv库
    cocos2d-x 2.2 资源更新AssetsManager例子代码
    防止手机游戏衰老的方法
    游戏开发博客
    网络游戏同步法则
  • 原文地址:https://www.cnblogs.com/cha1r/p/3410966.html
Copyright © 2011-2022 走看看