HtmlUnit找不到该元素

时间:2013-11-13 23:19:17

标签: java html facebook htmlunit

我正在尝试从页面墙中获取带有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"));

1 个答案:

答案 0 :(得分:0)

我对您的问题有一些评论。

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

如果你是webscraping,显然就是这种情况,那么你就无法控制JS,所以你只能接受它不工作或禁用JS并手动处理AJAX请求。

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

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

第三,正如我在你之前的一个问题中所提到的,这更适合通过Facebook API进行处理。

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