1

VIA JAVA,我想登录一个网站。

身份验证:该站点有一个执行重定向到主页的 javascript 按钮。我的网络爬虫可以使用 Jsoup 以编程方式登录到具有 html 按钮的网站。但是,当我尝试登录一个在 javascript 中提交的网站时,我似乎无法以迄今为止发现的任何方式获得身份验证。

到目前为止,我已经尝试过:

  • 我尝试使用本机 java api、使用 URLConnection 和 OutputWriter 登录。它用正确的值填充用户和密码字段,但是当我尝试执行 javascript 方法时,它根本不起作用;
  • 汤。(它可以让我登录到任何包含 html 按钮的网站。但由于它不支持 javascript,所以没有多大帮助;
  • 我试过 HtmlUnit。它不仅打印了无数行输出,还需要很长时间才能运行,最后仍然失败。
  • 最后,我尝试使用 Rhino(基于 HtmlUnit),让它在一个长长的 javascript 方法列表中工作。但无法认证;
  • 我已经尝试过 Selenium,但一无所获,也..

我的想法不多了。也许我还没有探索这些 API 中包含的所有解决方案,但我仍然无法登录到包含 javascript 按钮的网站。有人有什么想法吗?

4

3 回答 3

3

使用Selenium Webdriver向浏览器发送 javascript 命令。我已经成功地使用它在客户端上对复杂的 javascript/ajax 程序进行了可靠且重复的数百次测试。

如果您以特定网页为目标,则可以自定义脚本并使其非常小。

WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;

// This is javascript, but can be done through Webdriver directly
js.executeScript("document.getElementById('theform').submit();");

填写表单假定已使用Selenium Webdriver API处理。您还可以将命令发送到click()右键等。

使用 Selenium Webdriver,您还可以将<script>标签写入浏览器,以加载更大的库。请记住,您可能必须等待/休眠,直到浏览器加载脚本文件 - 您自己的脚本文件和原始网页用于登录过程的脚本文件。加载和执行所有这些可能需要几秒钟。为避免睡眠时间过长,请使用更可靠的方法,即注入一个小脚本来检查其他所有内容是否已加载(检查网页脚本的状态标志、浏览器状态)。

于 2012-06-15T18:32:33.720 回答
1

我建议HtmlUnit

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

它具有相当好的 JavaScript 支持(不断改进),甚至能够使用非常复杂的 AJAX 库,根据您要使用的配置模拟 Firefox 或 Internet Explorer。

它通常用于测试目的或从网站检索信息。

于 2012-06-16T02:46:12.273 回答
0

我有一个听起来相似的问题(我有一个称为 javascript 方法的登录按钮)。

当我通过网络浏览器手动单击登录按钮时,我使用 JMeter 观察传递了什么(但我想你也可以使用 WireShark 来做到这一点)。

在我的 Java 代码中,我创建了一个包含所有正在发送的参数的 PostMethod。

PostMethod post = new PostMethod(WEB_URL); // URL of the login page
// first is the name of the field on the login page,
// then the value being submitted for that field
post.addParameter(FIELD_USERNAME, "username");
post.addParameter(FIELD_PASSWORD, "password");

然后我使用 HttpClient (org.apache.commons.httpclient.HttpClient) 来执行 Post 请求。

需要注意的一件事是,通过手动查看登录页面,我没有看到正在传递的“隐藏”参数。这些是在我使用 JMeter 时向我透露的。

我很乐意澄清任何似乎不清楚的事情。

于 2012-06-22T13:38:38.257 回答