首页 > 解决方案 > 登录成功后使用htmlunit获取网页内容

问题描述

我正在尝试使用 htmlunit 执行以下操作:

  1. 进入一个页面,然后登录。

  2. 成功登录后,获取特定页面,以便我可以使用其内容。

假设服务器位于 mysite.mydomain.com。首先让我描述一下使用实际浏览器(例如 Chrome)会发生什么。

我在地址栏上键入mysite.mydomain.com 。

我到达

mysite.mydomain.com/blahb/blahb.exe/index?SOMETHING=0&SOMETHINGELSE=1

在那里我可以填写我的登录信息,即我可以输入我的用户名和密码,然后按提交按钮。

成功登录后,我最终看到以下页面:

mysite.mydomain.com/blahb/blahinfo.exe/index(blahb.exe变成了 blahinfo.exe)

我有选择。说,菜单。单击我感兴趣的特定选项,将在主窗口框架中弹出一个按钮。我们称这个按钮为“SHOW”。

单击 SHOW,URL 保持不变,但屏幕被分成两帧。顶部和底部。TOP 框架包含我们刚刚按下的按钮 SHOW 以及刚刚出现的两个新按钮:一个用于打印内容,一个用于将内容保存为 PDF。

在底部框架是可以打印或保存的内容,这是我感兴趣的。

对页面代码的简单检查表明,我感兴趣并且在底部框架中描绘的内容来自:

mysite.mydomain.com/blahb/blahinfo.exe/somethingBody

事实上,如果我只是登录到该站点,而不是在那之后按任何菜单按钮,我只需访问:

mysite.mydomain.com/blahb/blahinfo.exe/somethingBody

将导致我在单个帧中在屏幕上获得所需的内容。

如果我登录了,我可以打开另一个标签,粘贴

mysite.mydomain.com/blahb/blahinfo.exe/somethingBody

我会得到内容。

到目前为止非常简单。

现在让我们看看当我使用 htmlunit 时会发生什么。

我可以执行以下操作:

private static HtmlPage loginAndGetPageOfInterest(WebClient webClient) throws Exception
{
    //enable whatever I want to enable for the webClient
    webClient.getOptions().setJavaScriptEnabled(true);

    //deal with cookies    
    CookieManager cookieManager = new CookieManager(); //seems we need cookies
    cookieManager = webClient.getCookieManager();
    cookieManager.setCookiesEnabled(true);

    String mainURL = "mysite.mydomain.com/blahb/blahb.exe/index?SOMETHING=0&SOMETHINGELSE=1";//want to go there

    HtmlPage currentPage = webClient.getPage(mainURL) ;

    //Fill the login info and press the button
    HtmlTextInput nameInput = currentPage.getHtmlElementById("Id");//find the username field
    nameInput.setValueAttribute("Iamtheuser"); //fill it in
    HtmlInput passInput = currentPage.getHtmlElementById("Pass"); //likewise for password
    passInput.setValueAttribute("andthisismypass");
    HtmlButton submit = (HtmlButton) currentPage.getElementsById("login_button").get(0);//find the submit button
    currentPage = submit.click();
    Thread.sleep(2000); //wait some time to ensure that we have indeed logged in.
    //if I were to print currentPage in a file NOW... ALL is well. I get exactly what I get in the browser. If I were to return the currentPage here, everything is fine.

    String urlIActuallyWant = "mysite.mydomain.com/blahb/blahinfo.exe/somethingBody";
    currentPage = webClient.getPage(urlIActuallyWant);//try to get what I actually want...
    return currentPage;
}

现在我可以这样做:

public static void main(String[] args) throws Exception
{
    WebClient webClient = new WebClient(BrowserVersion.CHROME); //Could do without saying anything about client version 
    HtmlPage currentPage = loginAndGetPageOfInterest(webClient);

    //save what we have so that we can look at it.
    String pageSource = currentPage.asXml();
    File file = new File("howInteresting.html");
    try  
    {
        Files.write(file.toPath(), pageSource.getBytes());
        Desktop.getDesktop().browse(file.toURI());
    } 
    catch (IOException e)
    { //end of the world }
 }

但是......当我尝试这个时,我得到:

服务器错误

500内部服务器错误。

您要查找的资源有问题,无法显示。

线程“主”com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException 中的异常: com.gargoylesoftware.htmlunit.WebClient.throwFailingHttpStatusCodeExceptionIfNecessary(WebClient.java ) https://mysite.mydomain.com/blahb/blahinfo.exe/somethingBody的 500 内部服务器错误:595) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:410) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:317) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient. java:469) 在 com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:450) 在 TestWTH.loginAndGetPageOfInterest(TestWTH.java:46) 在 TestWTH.main(TestWTH.java:54)

现在我知道服务器正在发回 500 Internal Server Error,我怀疑这是因为它认为我们没有登录。但为什么会这样呢?

如果我登录然后直接转到感兴趣的页面,在浏览器上可以正常工作,但在使用 htmlunit 时却不行,这让我怀疑这是 cookie 处理的问题。但是为什么cookies会有问题呢?有任何想法吗?

标签: javahtmlauthenticationcookieshtmlunit

解决方案


推荐阅读