我正在尝试使用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();
答案 0 :(得分:0)
抱歉,但我不确定我的问题是否正确,但......
稍微清理了一下代码
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。所以必须从帧内部解析响应。