问题背景:测试工具要实现运行被测试设备里面的web服务中的某个url请求(HTML),运行里面js的相关事件,抓取返回值,这里关键是怎么通过工具实现请求被测试设备的url(web服务),这里我通过上网学习,写了几种思路的方法.
下面是我实现这种思路的部分代码
public static void runBroswer(String url,int flag) { try { Desktop desktop = Desktop.getDesktop(); if (desktop.isDesktopSupported() && desktop.isSupported(Desktop.Action.BROWSE)) { URI uri = new URI(url); desktop.browse(uri); //使用系统默认的浏览器执行这个url Thread.sleep(2000); //Runtime.getRuntime().exec("taskkill /F /IM Iexplore.exe"); Runtime.getRuntime().exec("taskkill /IM firefox.exe"); //因为我系统默认的是火狐,然后关闭火狐浏览器 } }
这种方法,实现的效果在实际中,就是要调用浏览器,桌面会弹出浏览器界面,然后请求url;
后面我在想,能不能直接使用Java模拟浏览器直接实现url请求,开始是使用这两个httpclient 和 HttpUrlConnection来实现这个效果,下面是部分代码:
String strUrl = "http://localhost:8088/testWeb"; //这是我临时建的web项目,去访问它的index.jsp界面 URL url = new URL(strUrl); HttpURLConnection httpcon = (HttpURLConnection) url.openConnection(); InputStreamReader input = new InputStreamReader(httpcon.getInputStream(), "utf-8"); BufferedReader br = new BufferedReader(input); StringBuffer sb = new StringBuffer(); String line = ""; while((line = br.readLine()) != null){ //读取每行数据 sb.append(line); sb.append("\r\n"); } String sbString = sb.toString(); System.out.println("result... "+sbString);
通过运行这部分代码发现.它只是完全返回HTML代码,并没有执行HTML里面的js onload()事件,也就是没有运行,js;当然我这部分代码是使用HttpUrlConnection类,也可以使用Httpclient类,第三方工具类;
因为第二种方法我感觉他是没有运行js里面的事件,只是获取HTML代码,后面继续网上学习,发现了HtmlUtil这个工具类.
HtmlUnit是一款基于Java的没有图形界面的浏览器程序。它模仿HTML document并且提供API让开发人员像是在一个正常的浏览器上操作一样,获取网页内容,填充表单,点击超链接等等。
它非常好的支持JavaScript并且仍在不断改进,同时能够解析非常复杂的AJAX库,通过不同的配置来模拟Chrome、Firefox和IE浏览器。
下面是我实现的部分代码:
public static void main(String[] args) { WebClient wc = new WebClient(BrowserVersion.getDefault()); wc.setJavaScriptEnabled(true); //启用JS解释器,默认为true wc.setJavaScriptTimeout(100000);//设置JS执行的超时时间 wc.setCssEnabled(false); //禁用css支持 wc.setThrowExceptionOnScriptError(false); //js运行错误时,是否抛出异常 wc.setTimeout(10000); //设置连接超时时间 ,这里是10S。如果为0,则无限期等待 //wc.setWebConnection( // new WebConnectionWrapper(wc) { // public WebResponse getResponse(WebRequest request) throws IOException { // WebResponse response = super.getResponse(request); // if (request.getUrl().toExternalForm().contains("test.js")) { // String content = response.getContentAsString("GBK"); // WebResponseData data = new WebResponseData(content.getBytes("UTF-8"), // response.getStatusCode(), response.getStatusMessage(), response.getResponseHeaders()); // response = new WebResponse(data, request, response.getLoadTime()); // } // return response; // } // } //); try { //HtmlPage page = wc.getPage("http://192.168.0.1/Del_Bridge_Wan.html"); HtmlPage page = wc.getPage("http://localhost:8088/testWeb"); FileWriter fileWriter = new FileWriter("D:\\text.html"); System.out.println("over..."); String str = ""; //获取页面的XML代码 str = page.asXml(); fileWriter.write( str ); //关闭webclient //wc.close(); wc.closeAllWindows(); fileWriter.close(); } catch (Exception e) { e.printStackTrace(); } }
通过运行这部分代码后发现,(注释部分解决编码问题,可以通过重写WebConnectionWrapper类的getResponse方法来修改返回值),运行了HTML里面的onload事件,达到了不调用浏览器也能访问url,并能运行js事件,而不是直接返回该HTML的源代码.最后打开生成的test.html就可以发现是我之前创建的testWeb服务index.jsp里面写的返回值;
End:因为实现这个需求都是在网上学习别人的很多例子,如有知识侵权,请联系本人删除;如果发现写的不好或者有建议的可以互相讨论,互相学习.
Original url: Access
Created at: 2020-03-03 15:02:17
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论