java--HtmlUnit--模拟浏览器操作--自动化操作浏览器--自动登录校园网为案例

写在前面:
闲来无事,因为宿舍每次嫌登录校园网有点免费。然后想着能不能一键自动化实现。然后更麻烦了,哈哈哈。不过倒是写一次代码就可以了。
可能不是特别系统,因为资料太少了。都是案例驱动找的资料。花了3大节课才搞完了。
会用js的话,学起来倒是比较简单一点。(说起来我咋不用js代码去做,有时间去看看)

HtmlUnit介绍

HtmlUnit是一个“Java程序的无GUI浏览器”。 它对 HTML 文档进行建模,并提供一个 API,允许您调用页面、填写表单、单击链接等。 就像您在“普通”浏览器中所做的那样。

安装–maven依赖

<dependency>
    <groupId>net.sourceforge.htmlunit</groupId>
    <artifactId>htmlunit</artifactId>
    <version>2.70.0</version>
</dependency>

入门案例

得到xxx页面id为xxx里面所有div内容
网页为

<?xml version="1.0" encoding="GBK"?>
<html xmlns="http://www.w3.org/1999/xhtml" style="background: url(&quot;https://api.ixiaowai.cn/mcapi/mcapi.php">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312"/>
    <meta id="viewport" name="viewport" content="target-densitydpi=device-dpi,width=640px,user-scalable=1"/>
    <meta name="renderer" content="webkit"/>
    <meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE"/>
    <title>
      unit
    </title>
</head>
  <body>
    <div id="abc">
      <a href="www.baidu.com">1231</a>
      <div>a</div>
      <div>b</div>
      <div>c</div>
      <div>d</div>
      <div>e</div>
      <div>f</div>
      <div>g</div>
      <div>h</div>
      <div>i</div>
      <div>g</div>
    </div>
  </body>
</html>

    @Test
    public void getDivContent() {
    	//获取webclient浏览器
        try (WebClient webClient = new WebClient();) {
        	//获取对应网站的页面
            HtmlPage page = webClient.getPage("http://127.0.0.1:5500/Test.html");
			
			//根据id获取元素
            HtmlElement abc = page.getHtmlElementById("abc");
		
			//获取里面所有的div
            List<HtmlElement> divs = abc.getByXPath("div");

			//收集里面div所有的内容
            StringBuilder sb = new StringBuilder();
            for (HtmlElement div : divs) {
                sb.append(div.getTextContent());
            }
            //断言
            Assert.assertEquals(sb.toString(),"abcdefghig");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

在这里插入图片描述

浏览器

创建

try (WebClient webClient = new WebClient()) {}

也可以指定浏览器
在这里插入图片描述

浏览器选项

// 禁用js
webClient.getOptions().setJavaScriptEnabled(false);
// 禁用css
webClient.getOptions().setCssEnabled(false);
//对未处理的js错误执行js
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
// 上面三个好像只是为了更快,减少不需要的

获取页面

HtmlPage page = webClient.getPage(url);
//url为网站的url

页面元素选择器

id选择器

这个是最准确的,但是不是所有的元素都有id。

//获取对应id的元素
<E extends HtmlElement> E page.getHtmlElementById(id)

List<DomElement> getElementsById(final String elementId)

我们选用第一个,可以得到html元素的专门的组件
如下面我们可以得到input组件和password组件,里面的封装的方法更准确。
在这里插入图片描述
常见的对应

html组件htmlunit
aHtmlAnchor
inputHtmlInput
buttonHtmlButton
imageHtmlImage
formHtmlForm
tableHtmlTable
labelHtmlLabel
optionHtmlOption

name选择器

这个也比较准确,但一样的也不是都有name

//返回具有指定名称的元素。如果有多个元素具有此名称,那么此方法将返回第一个名称
 <E extends DomElement> E getElementByName(final String name)

css选择器

xpath
需要强转。

<T> List<T> getByXPath(final String xpathExpr)

HtmlAnchor anchor = (HtmlAnchor) page.getByXPath("复制过来的xpath"); 

在这里插入图片描述

返回文档中与指定选择器组匹配的第一个元素。

<N extends DomNode> N querySelector(final String selectors)

组件操作

每个组件对应操作,如点击输入啥的。
这时候我们如果上面选择的是html对应的组件就很好操作了。
idea会有提示。
如a标签的点击。还有着封装很多的方法,如修改值setvalue,修改id等等。
在这里插入图片描述

动态数据加载

需要设置js为true,然后需要等待数据加载完成。
css一定要禁用,不然很难用。

webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);
Thread.sleep(500);

调试技巧

我们可以选择到一个操作就把这个操作的页面打印出来
这样我们就可以在文件fw中去查看了
在这里插入图片描述
在这里插入图片描述

登录案例

登录页面
在这里插入图片描述
然后通过F12进行查看。
在这里插入图片描述
其有id所以我们可以直接进行id选择,然后设置值。
在这里插入图片描述
查看按钮的
在这里插入图片描述
有name,然后是button组件
click返回点击后的页面。
在这里插入图片描述
这样就登录成功了。
如果需要动态获取的需要等待数据加载。
如这个没有等待的。
在这里插入图片描述

这个有等待的,设置的大小自己调试,我这里50就可以加载出来了。
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值