表单提交后的重定向链接与包含表单

时间:2017-02-12 00:07:10

标签: java htmlunit

我正在尝试使用Java中的HTMLunit库登录网页https://online.firstdata.de/esp/concardis/。问题是该页面包含几个iframe内的表单。包含该表单的iframe的来源为https://online.firstdata.de/login/postlogin/UserDispatcher 。提交表单时,呈现下一页之前的重定向链接之一也是与上述相同的链接。 因此,当我从Java使用它时,这会创建一个无限循环。但是,当从浏览器发生登录时,因为原始页面的主要源是以/ concardis结尾的链接,重定向链接与此链接不同,因此没有无限循环。如何从Java模拟这种相同的行为?这是我的代码:

WebClient webClient = new WebClient(BrowserVersion.CHROME);

    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.getOptions().setRedirectEnabled(true);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setCssEnabled(false);    
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());


    try{


        HtmlPage page1 = null;
        HtmlPage page2 = null;
        HtmlPage page3 = null;
         HtmlPage page = webClient.getPage("https://online.firstdata.de/esp/concardis");




        List<FrameWindow> frames = page.getFrames();
        for (FrameWindow frame : frames) {
            if (frame.getFrameElement().getNameAttribute().equals("application")) {
                page1 = webClient.getPage(frame.getEnclosedPage().getUrl());
            }
        }

        List<FrameWindow> frames1 = page1.getFrames();
        for (FrameWindow frame : frames1) {
            if (frame.getFrameElement().getNameAttribute().equals("content")) {
                page2 = webClient.getPage(frame.getEnclosedPage().getUrl());
            }
        }

        List<FrameWindow> frames2 = page2.getFrames();
        for (FrameWindow frame : frames2) {
            if (frame.getFrameElement().getId().equals("loginFrame")) {
                page3 = webClient.getPage(frame.getFrameElement().getSrcAttribute());
            }
        }


        HtmlForm form = page3.getFormByName("loginForm");
        HtmlTextInput userName = form.getInputByName("j_username");
        HtmlPasswordInput password = form.getInputByName("j_password");

        userName.setValueAttribute("username");
        password.setValueAttribute("password");

        HtmlSubmitInput submit = form.getInputByName("Submit");

        submit.click();

2 个答案:

答案 0 :(得分:0)

抱歉,但我不确定我的问题是否正确,但......

  1. HtmlUnit尝试尽可能接近地模仿浏览器,如果您遇到差异则应该打开问题
  2. 没有任何凭据,无法重现您的案例
  3. HtmlUnit自动加载iframe的内容 - 不需要所有webClient.getPage调用 - 也许这是混乱的根源
  4. 稍微清理了一下代码

        HtmlPage page = webClient.getPage("https://online.firstdata.de/esp/concardis");
    
        HtmlPage page1 = null;
        List<FrameWindow> frames = page.getFrames();
        for (FrameWindow frame : frames) {
            if (frame.getFrameElement().getNameAttribute().equals("application")) {
                page1 = (HtmlPage) frame.getEnclosedPage();
                break;
            }
        }
    
        HtmlPage page2 = null;
        List<FrameWindow> frames1 = page1.getFrames();
        for (FrameWindow frame : frames1) {
            if (frame.getFrameElement().getNameAttribute().equals("content")) {
                page2 = (HtmlPage) frame.getEnclosedPage();
                break;
            }
        }
    
        HtmlPage page3 = null;
        List<FrameWindow> frames2 = page2.getFrames();
        for (FrameWindow frame : frames2) {
            if (frame.getFrameElement().getId().equals("loginFrame")) {
                page3 = (HtmlPage) frame.getEnclosedPage();
                break;
            }
        }
    
        HtmlForm form = page3.getFormByName("loginForm");
        HtmlTextInput userName = form.getInputByName("j_username");
        HtmlPasswordInput password = form.getInputByName("j_password");
    
        userName.type("username");
        password.type("password");
    
        HtmlSubmitInput submit = form.getInputByName("Submit");
    
        submit.click();
    

    如果仍然无效,请打开一个问题(但在这种情况下,我们需要一些测试凭据来重现您的情况)

答案 1 :(得分:0)

感谢。我认为您的解决方案有效。我之前检查过的网站服务器已关闭。我刚刚尝试过,它有效。此外,单击提交按钮后获得的响应与登录页面具有相同的URL。所以必须从帧内部解析响应。