精选文章 HtmlUnit 执行自定义JS,并获取执行后的结果,版本2.42.0

HtmlUnit 执行自定义JS,并获取执行后的结果,版本2.42.0

作者:nece001 时间: 2020-08-05 02:03:49
nece001 2020-08-05 02:03:49
package com.xxx;

import cn.hutool.core.io.file.FileWriter;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.ImmediateRefreshHandler;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.ScriptResult;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebResponse;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import java.io.File;
import java.io.IOException;

public class JsTestMain {
    public static void main(String[] args) throws IOException {
        WebClient webclient = new WebClient(BrowserVersion.CHROME); // 设置浏览器版本
        webclient.getOptions().setTimeout(600 * 1000);
        webclient.getOptions().setRedirectEnabled(true);
        webclient.getOptions().setThrowExceptionOnFailingStatusCode(false);
        webclient.getOptions().setUseInsecureSSL(true);
        webclient.getOptions().setJavaScriptEnabled(true); // 启用javascript
        webclient.getOptions().setThrowExceptionOnScriptError(false); // 关闭js的异常抛出
        webclient.getOptions().setCssEnabled(false); // 不加载CSS文件
        //webclient.getCookieManager().clearCookies();
        //webclient.getCache().clear();
        webclient.setJavaScriptTimeout(600 * 1000);
        webclient.waitForBackgroundJavaScript(60 * 1000);
        webclient.setAjaxController(new NicelyResynchronizingAjaxController());
        webclient.setRefreshHandler(new ImmediateRefreshHandler());

        
        String url = "https://www.baidu.com/";
        HtmlPage page = webclient.getPage(url);
        
        ScriptResult result = page.executeJavaScript("document.body.innerHTML = 'hello world';");
        HtmlPage newPage = (HtmlPage)page.getWebClient().getCurrentWindow().getEnclosedPage();
        String html = newPage.asXml();
        
        FileWriter writer = new FileWriter("E:\\temp\\tmp\\logs" + File.separator + "aaa.txt");
        writer.write(html);
    }
}

以下代码可能只能在2.36前的版本使用:

final WebClient webClient=new WebClient();
webClient.getOptions().setCssEnabled(false);
HtmlPage page=webClient.getPage("目标地址");
String hrefValue = "js方法";
ScriptResult s = page.executeJavaScript(hrefValue);//执行js方法
page = (HtmlPage) s.getNewPage();//获得执行后的新page对象,新版本没这个方法了
System.out.println(page.asXml());
webClient.close();

参见:

https://sourceforge.net/p/htmlunit/bugs/2023/

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:详解Python中函数和模块的特殊属性__annotations__

下一篇:如何学习数据可视化技术

您可能感兴趣

  • 50个最新TypeScript面试题合集 – TypeScript开发教程

    以下是最常见的Typescript面试问题和答案。 js项目如何升级为ts?有何影响?(参考:https://www.cnblogs.com/thyong/p/12182579.html) ts 基础类型都哪些,他们跟js的区别 ts为什么会流行?与ECMA新规范的关系? tslint都能配置哪些功能?对开发流程有何影响? 如何使用js实现类型约束,枚举等特性么?(仅需要在 变量、函数的参数...

  • 原生JS和jQuery的对比使用

    1.入口函数 js: window.onload = function(){js代码} 实质就是一个事件,拥有事件的三要素,事件源,事件,事件处理程序。等到所有内容,以及我们的外部图片之类的文件加载完了之后,才会去执行。只能写一个入口函数。 jq: $(function(){})   $(document).ready(function(){}) 在html所有的标签都加在之后就会去执行,...

  • 如果再写for循环,我就锤自己!

    来源 | juejin.im/post/5ea63f3ef265da47b177b4b6 几种遍历方法中for执行最快,它没有任何额外的函数调用栈和上下文。但在实际开发中我们要结合语义话、可读性和程序性能,去选择究竟使用哪种方案。下面来看for , foreach , map , for...in , for...

  • 2020年PHP面试题附答案(实战经验)

      出于一些原因近期做了一次工作变动,在职交接近一个半月时间大概面试了十五家公司,并且得到了自己比较满意的offer,最后基本上无缝衔接了新工作。总体来说,虽然准备的很充分,但面试期间还是暴露了许多问题,所以做下总结,供大家和自己以后参考,主要分四部分讲述: 简历方面,格式内容包括七个板块,个人简介,求职意向,工作经历,项目经历,技能描述,学历背景,自我评价。如果自己或公司没有其他特殊要求,...

  • 03-基于Spring Security + JWT实现前后端分离架构的权限管理

    任务案例分析 在我们传统的B\S应用开发方式中,都是使用session进行状态管理的,比如说:保存登录、用户、权限等状态信息。这种方式的原理大致如下: 上面就是一种有状态服务。 当然,这整个过程中,cookies和sessionid都是服务端和浏览器端自动维护的。所以从编码层面是感知不到的,程序员只能感知到session数据的存取。但是,这种方式在有些情况下,是不适用的。比如:非浏览器的客户...

  • 渗透测试 QA 收集

    目录 1、拿到一个待检测的站,你觉得应该先做什么? 2、判断出网站的CMS对渗透有什么意义? 3.一个成熟并且相对安全的CMS,渗透时扫目录的意义? 4.常见的网站服务器容器。 5.mysql注入点,用工具对目标站直接写入一句话,需要哪些条件? 6.目前已知哪些版本的容器有解析漏洞,具体举例。 7.如何手工快速判断目标站是windows还是linux服务器? 8.为何一个mysql数据库的站...

  • 【笔记】前端学习常见概念

    跟随百度学院学前端。 常见前端概念:HTML、CSS、JAvaScript、SQL、WebServices、PHP等。 一个普通网站访问的过程 先了解一个网站访问的大概过程: 用户操作浏览器访问,浏览器向服务器发出一个 HTTP 请求; 服务器接收到 HTTP 请求,Web Server 进行相应的初步处理,使用服务器脚本生成页面; 服务器脚本(利用Web Framework)调用本地和客户...

  • 时间切片的实现和调度(原创2.6万字)

    本人系一个惯用Vue的菜鸡,恰巧周末和大佬扯蛋,峰回路转谈到了fiber,被大佬疯狂鄙视...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。