我正在尝试使用HtmlUnit提交表单here
具有以下代码
try (final WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
final HtmlPage page = webClient.getPage("https://nseindia.com/products/content/equities/equities/eq_security.htm");
System.out.println(page.getTitleText());
}
但是我得到这个错误
Aug 23, 2018 10:50:35 PM com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError
SEVERE: runtimeError: message=[An invalid or illegal selector was specified (selector: '#main_menu > ul > li:last' error: Invalid selector: *#main_menu > ul > li:last).] sourceName=[https://nseindia.com/common/js/jquery-1.4.4.min.js] line=[100] lineSource=[null] lineOffset=[0]
错误来自jquery-1.4.4.min.js
。因此,它可能不应该是代码问题。另外,当我尝试在Chrome上访问网页时,不会出现此错误。
我还添加了以下内容,但仍然出现相同的错误
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setJavaScriptEnabled(true);webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(10000);
有人可以帮我吗?我将htmlunit-2.32
和Java 1.8
更新:在实际错误出现之前,我还多次收到以下警告
Aug 24, 2018 11:16:55 AM com.gargoylesoftware.htmlunit.IncorrectnessListenerImpl notify
WARNING: Obsolete content type encountered: 'application/x-javascript'.`
此外,当我将网址更改为https://stackoverflow.com
时,我又遇到了运行时错误
Aug 24, 2018 11:41:53 AM com.gargoylesoftware.htmlunit.javascript.StrictErrorReporter runtimeError
SEVERE: runtimeError: message=[An invalid or illegal selector was specified (selector: '*,:x' error: Invalid selector: *:x).] sourceName=[https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js] line=[2] lineSource=[null] lineOffset=[0]
,但是代码仍然向前移动并打印页面标题。就我而言,该程序不会终止,但也不会前进。
答案 0 :(得分:0)
重新加载页面并使用chrome javascript控制台很快执行给定的无效选择器后,我能够在chrome中得到您的错误。 这使我相信以seletcor为目标的元素是由javascript创建的(如果您在页面的所有文件中搜索选择器,则实际上可以确定这一点),这就是代码导致错误的原因。 尝试添加
webClient.waitForBackgroundJavaScript(3000);
在调用getPage之后。那应该让您的代码等待3秒钟,这应该足以让js创建请求的元素。
一种更好的方法是监听onload
之类的事件,但是我不确定如何从客户端而不是页面本身来完成此操作...
答案 1 :(得分:0)
尝试将此行添加到您的代码中:
webClient.getOptions().setThrowExceptionOnScriptError(false);
它将阻止HtmlUnit
在任何JavaScript失败时引发异常。