2017-02-12 9 views
0

Java에서 HTMLunit 라이브러리를 사용하여 https://online.firstdata.de/esp/concardis/ 웹 페이지에 로그인하려고합니다. 이 페이지에는 두 개의 iframe 안에 양식이 포함되어 있습니다. 양식을 포함하는 iframe의 소스는 https://online.firstdata.de/login/postlogin/UserDispatcher 입니다. 양식이 제출되면 다음 페이지가 렌더링되기 전에 리디렉션 링크 중 하나가 위에서 언급 한 것과 동일한 링크입니다. 그래서 Java에서 사용할 때 무한 루프가 발생합니다. 그러나 원본 페이지의 기본 소스가/concardis로 끝나는 링크이기 때문에 브라우저에서 로그인이 발생하면 리디렉션 링크가이 링크와 같지 않으므로 무한 루프가 발생하지 않습니다. Java에서이 동일한 동작을 어떻게 시뮬레이트 할 수 있습니까? 여기 내 코드입니다 ....양식 제출 후 리디렉션 링크가 양식을 포함하는 것과 동일한 경우 HtmlUnit 무한 루프

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(); 

답변

0

죄송합니다,하지만 난 문제의 권리를 가지고 있지만 확실하지 않다

당신이 경우, 최대한 가깝게 브라우저를 모방하려고 HtmlUnit과
  1. 변화를 직면하는 것은 당신이
  2. HtmlUnit과는 iframe에 자동의 내용을로드 사건 재현 할 수없는 자격 증명없이 문제
  3. 를 열어야합니다 - 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(); 

당신의 코드를 청소 한 (그러나이 경우 우리는 귀하의 케이스 재현하는 몇 가지 테스트 자격 증명이 필요)

+0

안녕하세요. 회신 해 주셔서 감사합니다. 문제를 다시 간단히 설명하고 싶습니다. https://online.firstdata.de/esp/concardis/ 페이지에는 두 개의 프레임이 포함 된 프레임 세트가 있습니다. 응용 프로그램이라는 프레임 중 하나에는 다른 프레임 세트가 있습니다. 이 프레임 셋에는 "Login.do"프레임이 있습니다. 이 프레임 안에는 id가 "loginFrame"이고 src가 "https://online.firstdata.de/login/postlogin/UserDispatcher"인 iframe이 있습니다. 본문의이 iframe에는 로그인 양식이 들어 있습니다. 로그인 양식에 액세스하려면이 모든 프레임에 액세스해야합니다. 마침내 submit.click 할 때. –

+0

제출을 수행하는 페이지의 url에 https://online.firstdata.de/login/postlogin/UserDispatcher라는 URL이 있습니다. 버튼을 클릭 한 후 리다이렉트가 발생하고 리다이렉트 링크 중 하나가 https://online.firstdata.de/login/postlogin/UserDispatcher인데, 이는 infinte 루프를 만들고 자바에서는 스택 오버 플로우 오류가 발생한다. HTMLUnit은 사용자 이름과 비밀번호를 올바르게 확인할 수 있으므로 제대로 작동합니다. 그러나 로그인 양식을 제출 한 후 페이지를 리디렉션하면 양식을 제출 한 페이지와 동일한 URL을 갖게됩니다. https://sourceforge.net/p/htmlunit/bugs/367/ –

+0

과 유사한 내용입니까? 제안 된 코드를 사용해 보셨습니까? – RBRi

0

감사합니다. 나는 당신의 솔루션이 효과가 있다고 생각합니다. 전에 체크했을 때 웹 사이트의 서버가 다운되었습니다. 나는 지금 막 시도하고 작동했다. 제출 버튼을 클릭 한 후에도 얻은 응답에는 로그인 페이지와 동일한 URL이 있습니다. 따라서 응답은 프레임 내부에서 파싱되어야했습니다.