为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕的地10843 2021-10-21 15:45:28
我试图让网站的内容页面,即页面的右侧公寓的列表(类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 2webClient.waitForBackgroundJavaScriptStartingBefore(50000);// option 3webClient.setJavaScriptTimeout(50000);// option 4JavaScriptJobManager manager = page.getEnclosingWindow().getJobManager();while (manager.getJobCount() > 0)    Thread.sleep(1000);但没有任何效果。您能否建议如何获取页面内容?
查看完整描述

1 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

鉴于 HTMLUnit 与 JavaScript 的问题,您需要找到一种解决方法。看到你知道你想要哪个元素,你可以实现一个while循环。这可能看起来像这样:


while(!page.asText().contains(„<div id=\„exmaple-id\">“)){

        webClient.waitForBackgroundJavaScript(500);

    }

如果你害怕在这个循环中被抓住,你可以在 while 条件中添加一个计数变量。就我的经验而言,这是处理这种延迟的可靠方法。


查看完整回答
反对 回复 2021-10-21
  • 1 回答
  • 0 关注
  • 288 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信