我正在尝试从页面墙中获取带有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"));
答案 0 :(得分:0)
我对您的问题有一些评论。
首先,您已禁用HtmlUnit的日志记录。因此,如果您有任何JavaScript问题,那么您将不会看到它。如果您实际收到JavaScript错误,则JavaScript代码将无法完全执行。如果您尝试获取的元素是从服务器(可能使用AJAX)动态获取的,则JavaScript错误(如果有)可能导致该元素未被获取。
如果你是webscraping,显然就是这种情况,那么你就无法控制JS,所以你只能接受它不工作或禁用JS并手动处理AJAX请求。
当然,您会看到该页面在真实浏览器上完美运行,但考虑到HtmlUnit使用的JavaScript引擎与真实浏览器不同。
其次,包含单词engine
的两行绝对不需要。
第三,正如我在你之前的一个问题中所提到的,这更适合通过Facebook API进行处理。
最后,您可能会发现其他答案很有用: JavaScript not being properly executed in HtmlUnit