【问题标题】:Java - Creating a mock browserJava - 创建一个模拟浏览器
【发布时间】:2012-07-05 21:33:48
【问题描述】:

我正在开发一个与社交网络上的用户交互的程序。我想要一个可以处理大部分或全部网络通信的工具

我的工作包括登录网站、阅读帖子、发送回复和个人信息。

我最初认为我可以处理一些套接字代码的必要交互。我最初的单次运行案例运行成功(我能够登录、发布内容、回复查询等),但是尝试一起运行所有内容都不起作用(服务器无法识别我的请求,以及各种其他错误)。我做了一些非常糟糕的 cookie 跟踪,我将套接字从 80 切换到 443 以进行 SSL 通信,我生成自己的数据包以发送到社交网络服务器,因为这是我第一次尝试网络交互,所以我离我还很远深度。我更喜欢跟踪 cookie、处理 SSL 通信、处理一般通信问题等的集成解决方案。基本上我希望我可以给出一个按钮的 X、Y 坐标(或从页面获取按钮列表,找到我想要的那个) , 选择那个) 和要在文本框中键入的内容的文本,并让模拟浏览器执行所有必要的数据包以使 Web 交互发生。

我想知道是否有可以使用的 java 模拟浏览器。即,我可以获得页面上文本框的句柄,输入我的登录信息并执行登录过程(然后模拟浏览器将处理所有 cookie,处理单个数据包等)

我的目标是拥有一个可以在我的计算机上运行的程序,它可以与社交网络上的用户进行交互,而无需我进行任何重大输入(我不希望该程序垄断 Firefox,这会阻止我在使用 Firefox在我的系统上)

对于上下文,我正在发送典型的 html 页面调用以及自定义数据包调用(并解析结果)

感谢您的帮助

【问题讨论】:

  • 你研究过硒了吗?
  • 还是 HtmlUnit (htmlunit.sourceforge.net)?
  • 如果我没记错的话,Selenium 看起来需要 Fiewfox 才能运行。 HtmlUnit 看起来非常接近我正在寻找的内容,您是否偶然知道它是否可以处理 Difi 请求?我需要独立运行的东西(不需要其他软件、FF 等)
  • 请提供 Difi 的链接。
  • Difi 不正确,我的意思是说社交网络在某些情况下使用了自定义协议 - 即,为了在消息中心获取更多内容,发送自定义数据包,仅请求相关内容而不是请求整个新页面。回复不是典型的 html 页面,因此我需要能够将自定义数据包发送到网络,然后在某些情况下亲自解析响应(但我仍然更喜欢模拟浏览器处理 cookie) - 或者我需要对 Javascript 理解适度的模拟浏览器(我认为 FF 使用 JS 来解析数据包 iirc)

标签: java


【解决方案1】:

我建议您选择以下两条路线之一:

选项 1: 使用Apache Http Components Library。我发现这很容易用于将表单数据发送到 Web 服务器。它支持 SSL 和 cookie,尽管我没有为此使用它。我唯一遇到的问题是我似乎无法让它通过代理服务器进行通信。 见my the question I posted about this. 但只要你不通过代理,我就会给图书馆一个热情洋溢的推荐,我在上面的链接中发布的代码显示了它是多么容易使用。下面是一个将表单数据发送到 Web 服务器的代码示例:

import org.apache.http.*;
import org.apache.http.client.*;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.client.methods.*;  //HttpHead, HttpPut, HttpGet, etc...
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.params.ConnRoutePNames;
import org.apache.http.entity.*;
import org.apache.http.impl.client.SystemDefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

public static void sendForm(String user, String val) throws IOException {    
    List<NameValuePair> formparams = new ArrayList<NameValuePair>();
    formparams.add(new BasicNameValuePair("user", user));
    formparams.add(new BasicNameValuePair("message", val));
    UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");
    String uri = "http://theServer.com";
    HttpPost httppost = new HttpPost(uri);  
    HttpClient httpclient = new SystemDefaultHttpClient();
    HttpResponse response = httpclient.execute(httppost);
    response.getStatusLine().toString() + "\n" +
    EntityUtils.toString(response.getEntity()));
    System.out.println(EntityUtils.toString(response.getEntity()));       
}

选项 2: JavaFX 附带了一个功能齐全的 Web 浏览器,称为 Web 视图。您可以通过编程方式与它进行交互,这在Java Spotlight Podcast 的最近一期中进行了讨论。

【讨论】:

  • 谢谢我正在开发客户端应用程序,所以我目前不关心代理或发送表单。我已经涉足了一些 HTTPclient 代码,但发现很多示例引用了在更新版本中已移入库中且不再有效的代码,并且考虑到我仍在跟踪 cookie,我不是太确定它会让我走多远。然而,JavaFX 听起来很有趣。我知道我想按下的按钮。我看到 JavaFX 据称与 Java 7.0_05 捆绑在一起 - 但是在升级了“import javafx.application.*;”之类的导入之后没有找到
  • 我认为您没有使用过 JavaFX,您/对使用这些类有什么建议吗?
  • 我对它的经验有限,但是netbeans 7.1支持它(你可以创建一个javafx 2项目)并且7.2 rc1集成了场景构建器,一个gui设计工具。
【解决方案2】:

你可以embed env.rhino.js in your Java app

env.js 是“作为脚本环境的浏览器的高度可移植的 javascript 实现(通常称为‘无头’浏览器)。”

rhino 实现使用 rhino javascript 引擎,它是 JavaScript 的 Java 运行时,将随 Oracle Java 实现一起提供。

env.js 相当有能力,因为它使用了参考 html5 解析器的交叉编译版本,并且可以处理充分利用 jQuery 库和 html dom 的 JavaScript。


另外,我很喜欢 Thorn 对 JavaFX Web 组件的建议。不过,如果您不需要显示任何视觉效果,您可能只需要 WebEngine 而不需要 WebView。

【讨论】:

    【解决方案3】:

    行业标准是Selenium。它通常用于创建自动化系统测试,但它可以用于任何需要代码内浏览器的地方。

    我会提醒你,让它工作起来可能是一个陡峭的学习曲线......需要相当神秘的glue code,但一旦你启动并运行它就很好了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-23
      • 1970-01-01
      • 2014-10-02
      • 2012-12-06
      相关资源
      最近更新 更多