0

我试图u_0_1e从页面墙上获取带有 id 的文本框,但 HtmlUnit 没有找到任何东西。最后一行打印null. 这是代码:

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);

        WebClient client = new WebClient(BrowserVersion.CHROME);
        JavaScriptEngine engine = new JavaScriptEngine(client);

        client.setJavaScriptEngine(engine);
        HtmlPage home = client.getPage("https://www.facebook.com/login.php");
        HtmlSubmitInput login = (HtmlSubmitInput) home.getElementById("u_0_1");
        HtmlTextInput name = (HtmlTextInput) home.getElementById("email");
        HtmlPasswordInput pass = (HtmlPasswordInput) home.getElementById("pass");

        name.setValueAttribute("myname");
        pass.setValueAttribute("mypass");

        HtmlPage page = login.click();
        HtmlPage wall = client.getPage("https://www.facebook.com/");

        System.out.println(wall.getElementById("u_0_1e"));
4

1 回答 1

0

我对你的问题有一些意见。

首先,您禁用了 HtmlUnit 的日志记录。因此,如果您有任何 JavaScript 问题,那么您将不会看到它。如果您确实遇到了 JavaScript 错误,那么 JavaScript 代码将不会被完全执行。如果您尝试获取的元素是从服务器动态获取的(可能使用 AJAX),那么 JavaScript 错误(如果有)可能会导致该元素未被获取。

如果您是网络抓取,显然是这种情况,那么您对 ​​JS 没有任何控制权,因此您只能接受它不工作或禁用 JS 并手动处理 AJAX 请求。

当然,您会看到页面在真实浏览器上完美运行,但考虑到 HtmlUnit 使用的 JavaScript 引擎与真实浏览器不同。

其次,包含这个词的两行engine是绝对不需要的。

第三,正如我在您之前的问题中提到的,这将更适合通过Facebook API来处理。

最后,您可能会发现这个其他答案很有用: JavaScript not being proper executed in HtmlUnit

于 2013-11-14T01:06:17.917 回答