猿问

HTMLUnit 不使用 JavaScript 返回完全加载的页面

我试图让网站的内容页面,即页面的右侧公寓的列表(类div元素=“分类”)。在浏览器中查看页面时,很明显它使用了 JavaScript。


我正在使用 HtmlUnit for Java,尤其是waitForBackgroundJavaScript(10000)方法来等待 JavaScript 完成。但是,它仍然对我不起作用,并且我得到了与初始调用相同的 HTML w/o 元素显示公寓页面。


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

java.util.logging.Logger.getLogger("org.apache.http.client").setLevel(Level.OFF);


URL url = new URL("https://r.onliner.by/pk/#bounds%5Blb%5D%5Blat%5D=53.75074091071493&bounds%5Blb%5D%5Blong%5D=27.301025390625004&bounds%5Brt%5D%5Blat%5D=54.04527964804286&bounds%5Brt%5D%5Blong%5D=27.822875976562504");


WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60);

webClient.getOptions().setThrowExceptionOnScriptError(false);

webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);


HtmlPage page = webClient.getPage(url);

webClient.waitForBackgroundJavaScript(50000); 


System.out.println(page.asXml());


webClient.close();

启用setThrowExceptionOnScriptError 会显示 JavaScript 代码中的一些异常(我不确定它是否与问题相关,因为浏览器中没有此类问题)。


我也尝试过其他一些方法,例如


// option 2

webClient.waitForBackgroundJavaScriptStartingBefore(50000);


// option 3

webClient.setJavaScriptTimeout(50000);


// option 4

JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager();

while (manager.getJobCount() > 0)

    Thread.sleep(1000);

但没有任何效果。您能否建议如何获取页面内容?


慕的地10843
浏览 289回答 1
1回答

一只萌萌小番薯

鉴于 HTMLUnit 与 JavaScript 的问题,您需要找到一种解决方法。看到你知道你想要哪个元素,你可以实现一个while循环。这可能看起来像这样:while(!page.asText().contains(„<div id=\„exmaple-id\">“)){&nbsp; &nbsp; &nbsp; &nbsp; webClient.waitForBackgroundJavaScript(500);&nbsp; &nbsp; }如果你害怕在这个循环中被抓住,你可以在 while 条件中添加一个计数变量。就我的经验而言,这是处理这种延迟的可靠方法。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答