1

背景:我有一个网页(.aspx),其中有几个下拉列表。列表值是根据先前下拉列表的选择使用 Ajax 调用填充的。选择所有下拉列表的值后,我们可以单击下载按钮,数据将根据下载的数据进行下载,我们需要执行一些其他操作。

我已经做了什么:我可以通过正确调用 ajax 来设置下拉数据,但是发送一个 post 请求是个问题。这是代码片段/伪代码。

随意使用任何工具和 java

public static void main(String[] args) throws FailingHttpStatusCodeException, IOException {
        final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);


        WebRequest request = new WebRequest(new URL(DataDownloader.MY_URL),HttpMethod.POST);

        webClient.getOptions().setThrowExceptionOnScriptError(false);
        webClient.setJavaScriptTimeout(10000);
        webClient.getOptions().setJavaScriptEnabled(true);
        webClient.setAjaxController(new NicelyResynchronizingAjaxController());
        webClient.getOptions().setTimeout(10000);

        HtmlPage page = webClient.getPage(request);     

        HtmlSelect firstDd = (HtmlSelect) page.getElementById("dd1_id");
        List<HtmlOption> firstOption = firstDd.getOptions();
        firstDd.setSelectedAttribute(firstOption.get(2), true);
        webClient.waitForBackgroundJavaScript(3000);

        HtmlPage pgAfterFirstDd = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
        HtmlSelect secondDd = (HtmlSelect) pgAfterFirstDd.getElementById("dd2_id");

        List<HtmlOption> secondOption = secondDd.getOptions();
        secondDd.setSelectedAttribute(secondOption.get(2), true);
        webClient.waitForBackgroundJavaScript(10000);
        //set the value for all other dropdowns


        HtmlPage finalpage = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();         
        HtmlForm form = finalpage.getHtmlElementById("aspnetForm");
        webClient.waitForBackgroundJavaScript(10000);


        request.setRequestBody("REQUESTBODY");
        Page redirectPage = webClient.getPage(request);

//       HtmlSubmitInput submitInput=form.getInputByName("btnSubmit");
//      submitInput.click();
        /*HtmlButton submitButton = (HtmlButton) pageAfterWard.createElement("btnSubmit");
        submitButton.setAttribute("type", "submit");
        form.appendChild(submitButton);

        HtmlPage nextPage = (HtmlPage) submitButton.click();*/
    }
4

3 回答 3

1
final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_17);

看来您使用的是旧版本,请使用最新版本。

WebRequest request = new WebRequest(new URL(DataDownloader.MY_URL),HttpMethod.POST);

使用 HtmlUnit,您通常不会处理请求。这个想法是更“像浏览器一样”工作。使用 getPage(final URL url) 之类的东西。

List<HtmlOption> firstOption = firstDd.getOptions();
firstDd.setSelectedAttribute(firstOption.get(2), true);

让你的工作更像“浏览器”

firstOption.get(2)setSelected(true);

这将为您完成所有后台工作,例如为您取消选择其他选项和事件处理。

关于提交您的想法的表格

 HtmlSubmitInput submitInput=form.getInputByName("btnSubmit");
 HtmlPage nextPage = submitInput.click();

看起来正确。也许你也必须在那之后等待。如果您仍然有问题,您必须提供您正在使用的 URL,以便我们能够重现/调试您的案例。

于 2017-05-24T17:48:38.180 回答
1

正如您在 RBRi's Answer 下的评论中提到的那样,您遇到了类型转换错误。请您提一下

  • 你得到的确切错误是什么
  • 您期望什么类型的文件/响应。

因为代码对我来说看起来不错,它应该可以完美运行..

于 2017-05-25T07:39:33.530 回答
1

为什么要隐藏错误详细信息?有什么秘密吗?如果您喜欢有用的答案,您必须提供尽可能多的信息。所以我做了一个疯狂的猜测......

submitInput.click();

将返回一个 PDF。在这种情况下,您必须执行类似的操作

Page pdfPage = submitInput.click();
WebResponse resp = pdfPage.getWebResponse();
if("application/pdf".equals(resp.getContentType())) {
    .... process the bytes
    .... resp.getContentAsStream()
}

HtmlUnit有四种页面HtmlPage/XmlPage/TextPage和UnexpectedPage。PDF 或办公文档等二进制内容作为 UnexpectedPage 处理。处理此内容取决于您。

于 2017-05-27T07:31:17.217 回答