我正在为页面dscan.me编写刮板。它应该用内容填充表单并使用提交输入按钮提交。我在这里看不到任何问题,但是我已经尝试了有关HtmlUnit的所有知识(而且还不算太多)。触发提交事件,执行javascript并从结果中获取新页面……无济于事。
如果有更多经验的人将在这里发布工作解决方案,我将感到高兴。
这就是我在textArea中获取控件和设置数据的方式
HtmlForm form = page.getForms().get(0);
HtmlTextArea textArea = form.getTextAreaByName("scandata");
HtmlSubmitInput button = form.getInputByValue("Submit");
textArea.setText(paste);
我确定我有正确的控件,并且textArea被填充,但这只是在getNewPage()调用中以nullpointer异常终止
ScriptResult scriptResult = button.fireEvent(Event.TYPE_SUBMIT);
WebClientProvider.getSharedClient().waitForBackgroundJavaScript(10000);
HtmlPage res = (HtmlPage) scriptResult.getNewPage();
这为我提供了带有控件的默认页面作为结果页面...而不是已处理内容的页面
String js_set = "$(\".inputbox\").val(\""+ paste.replaceAll("\n", "\\n").replaceAll("\t", "\\t") +"\");\n";
String js_submit = "$(\".submitbutton\").click();";
ScriptResult result = page.executeJavaScript(js_submit);
WebClientProvider.getSharedClient().waitForBackgroundJavaScript(10000);
HtmlPage res = (HtmlPage) scriptResult.getNewPage();
您可以将以下example数据粘贴到dscan.me来查看工作流程。如果您有想法或找到解决方案或解决方法,我将为您感到高兴。谢谢!
最佳答案
有时JS需要一些时间来执行,因此您必须等待执行,最好是重试一段时间,直到页面未更新(使用任何条件)为止,此处是代码示例
HtmlForm form = page.getForms().get(0);
HtmlTextArea textArea = form.getTextAreaByName("scandata");
HtmlSubmitInput button = form.getInputByValue("Submit");
HtmlPage res = button.click();
int input_length = page.getByXPath("//input").size();
int tries = 5;
while (tries > 0 && input_length < 12) { //you can change number of tries and condition according to your need
tries--;
synchronized (page) {
page.wait(2000); //wait
}
input_length = page.getByXPath("//input").size(); //input length is example of condtion
}