gpt4 book ai didi

java - htmlunit:发送 POST 表单并检索响应

转载 作者:行者123 更新时间:2023-12-02 00:01:11 27 4
gpt4 key购买 nike

网站:http://www.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias它有 2 个框架,

采用 POST 形式:http://www.sunat.gob.pe/cl-ti-itmrconsruc/frameCriterioBusqueda.jsp

和另一个框架来显示结果:http://www.sunat.gob.pe/cl-ti-itmrconsruc/frameResultadoBusqueda.html

在 Apache Netbeans 中进行测试向我发送错误:

--- exec-maven-plugin:1.5.0:exec (default-cli) @ htmunit ---2019 年 9 月 30 日 8:39:15 PM com.gargoylesoftware.htmlunit.In CorrectnessListenerImpl 通知广告:遇到过时的内容类型:“application/x-javascript”。2019 年 9 月 30 日 8:39:21 PM com.gargoylesoftware.htmlunit.In CorrectnessListenerImpl 通知广告:遇到过时的内容类型:“application/x-javascript”。九月 30, 2019 8:39:21 PM com.gargoylesoftware.htmlunit.javascript.DefaultJavaScriptErrorListener scriptExceptionGRAVE:JavaScript 执行期间出错=======异常开始========EcmaError: lineNumber=[0] column=[0] lineSource=[function () {] name=[TypeError] sourceName=[在 http://www.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias] 中加载 HtmlBody[] 事件消息=[类型错误:无法调用未定义的方法“goRefresh”]com.gargoylesoftware.htmlunit.ScriptException:TypeError:无法调用未定义的方法“goRefresh”

我的预付款:


public static void main(String[] args) {
// TODO code application logic here

try {
String url = "http://www.sunat.gob.pe/cl-ti-itmrconsruc/frameCriterioBusqueda.jsp";
final WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getCookieManager().setCookiesEnabled(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setThrowExceptionOnScriptError(false);

HtmlPage htmlpage = webClient.getPage(url);

//webClient.waitForBackgroundJavaScript(10000);
//CookieManager coo = webClient.getCookieManager();
//Cookie cookie = coo.getCookie("TS01c75c6f");
//System.out.println(cookie.getValue());

HtmlForm htmlForm = htmlpage.getElementByName("mainForm");
//htmlForm.setActionAttribute("jcrS00Alias");
HtmlTextInput input1 = htmlForm.getInputByName("search1");
HtmlTextInput input2 = htmlForm.getInputByName("codigo");
input1.setText("10468790497");

HtmlHiddenInput hidden = (HtmlHiddenInput)htmlForm.getInputByName("accion");
hidden.setValueAttribute("consPorRuc");

HtmlImage image = htmlpage.<HtmlImage>getFirstByXPath("//img[@src='captcha?accion=image']");
ImageReader img = image.getImageReader();
BufferedImage buf = img.read(0);
// Show image
ImageIcon icon = new ImageIcon(buf);
String codigo = JOptionPane.showInputDialog(null, icon, "Captcha image", JOptionPane.PLAIN_MESSAGE);
input2.setText(codigo);

HtmlButton boton = (HtmlButton) htmlpage.createElement("button");
boton.setAttribute("type", "submit");
htmlForm.appendChild(boton);

htmlpage = boton.click();

System.out.println(htmlpage.asXml().toString());

} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}

我期待返回成功的查询。

最佳答案

让我们从一些一般性的事情开始:

对于客户端的设置,请仅设置您真正需要的选项。默认行为就像真正的浏览器一样,不需要例如启用cookie。

有一些警告您可以忽略

Cannot call method "goRefresh" of undefined

这是因为框架中的js(在您的情况下是结果框架文档)尝试从其他框架调用函数来更新验证码。但是您没有加载整个框架集 - 因此该函数无法按预期方式访问。

要获得结果,您必须获取另一帧的内容。

这段代码似乎有效:

    // work with the whole frameset
String url = "http://www.sunat.gob.pe/cl-ti-itmrconsruc/jcrS00Alias";

try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
// do not stop in case of js errors
webClient.getOptions().setThrowExceptionOnScriptError(false);

HtmlPage frameset = webClient.getPage(url);
HtmlPage searchPage = (HtmlPage) frameset.getFrameByName("leftFrame").getEnclosedPage();

HtmlForm htmlForm = searchPage.getElementByName("mainForm");

// set search field
HtmlTextInput input1 = htmlForm.getInputByName("search1");
input1.setText("10468790497");

// process captcha
HtmlImage image = searchPage.<HtmlImage>getFirstByXPath("//img[@src='captcha?accion=image']");
ImageReader img = image.getImageReader();
BufferedImage buf = img.read(0);
ImageIcon icon = new ImageIcon(buf);
String codigo = JOptionPane.showInputDialog(null, icon, "Captcha image", JOptionPane.PLAIN_MESSAGE);
HtmlTextInput input2 = htmlForm.getInputByName("codigo");
input2.setText(codigo);

// click the button
HtmlElement boton = htmlForm.getElementsByAttribute("input", "value", "Buscar").get(0);
boton.click();

// and get the result
HtmlPage resultPage = (HtmlPage) frameset.getFrameByName("mainFrame").getEnclosedPage();
System.out.println(resultPage.asText());
}

但是您需要最新的 HtmlUnit 快照才能运行它,而不会出现 js 错误(10 年前引入了一个奇怪的错误),现已修复。

希望有帮助。

关于java - htmlunit:发送 POST 表单并检索响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58177201/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com