我想使用HtmlUnit
登录到https://www.rjs.com/member/user.html#login,但失败了,在调用登录按钮后,仍然可以返回上一页。
如果有人能在这个问题上帮助我,将不胜感激。
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.setCssErrorHandler(new SilentCssErrorHandler());
webClient.getOptions().setUseInsecureSSL(true);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(false);
webClient.getOptions().setTimeout(50000);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setRedirectEnabled(true);
webClient.getCookieManager().setCookiesEnabled(true);
HtmlPage page = webClient.getPage("https://www.rjs.com/member/user.html#login");
webClient.waitForBackgroundJavaScript(10000);
System.out.println(page.asXml());
HtmlInput heUsername = (HtmlInput)page.getHtmlElementById("login_username");
HtmlPasswordInput hePassword = (HtmlPasswordInput)page.getHtmlElementById("login_pwd");
HtmlButton heLogin = (HtmlButton)(page.getFirstByXPath("//button[@class='login-btn']"));
heUsername.setValueAttribute(<my user name>);
hePassword.setValueAttribute(<my password>);
HtmlPage page2 = heLogin.click();
webClient.waitForBackgroundJavaScript(10000);
System.out.println(page2.asXml());
webClient.close();
答案 0 :(得分:0)
没有凭据,我无法验证您的问题。只有一些一般提示
使WebClient设置尽可能简单,默认值通常很好。从我的角度来看,您只需要
webClient.getOptions().setUseInsecureSSL(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
使用type()填充输入字段
heUsername.type(<my user name>);
hePassword.type(<my password>);
如果您在登录后等待js完成,通常最好从窗口中获取页面,因为js在登录后可能已加载了另一个页面。
HtmlPage page2 = heLogin.click();
webClient.waitForBackgroundJavaScript(10000);
page2 = ((HtmlPage) page2.getEnclosingWindow().getEnclosedPage());
希望有帮助。而且一如既往,日志中也包含有用的提示。
答案 1 :(得分:0)
这似乎在这里有效(使用最新的2.36.0-SNAPSHOT)。
public static void main(String[] args) throws Exception {
String uri = "https://www.rjs.com/member/user.html#login";
try (final WebClient webClient = new WebClient(BrowserVersion.FIREFOX_60)) {
HtmlPage page = webClient.getPage(uri);
webClient.waitForBackgroundJavaScript(10000);
HtmlInput heUsername = (HtmlInput) page.getHtmlElementById("login_username");
HtmlPasswordInput hePassword = (HtmlPasswordInput) page.getHtmlElementById("login_pwd");
HtmlButton heLogin = (HtmlButton) page.getFirstByXPath("//button[@class='login-btn']");
heUsername.type(....);
hePassword.type(....);
heLogin.click();
webClient.waitForBackgroundJavaScript(10000);
page = (HtmlPage) webClient.getCurrentWindow().getEnclosedPage();
System.out.println("----------------");
System.out.println(page.asXml());
}
}