HtmlUnit - 按钮单击问题

时间:2015-07-28 13:25:49

标签: java spring button web-scraping htmlunit

我正在使用java编写服务器,而对于部分服务器,我需要一个webscraper。为了抓住网站,我需要登录并且网络刮刀在作为主要方法运行时工作正常,但是当在服务器上运行时,按钮单击不会重定向到新页面。这是代码。

    String loginUrl="MY_URL";
    WebClient web = new WebClient();
    WebClientOptions options=web.getOptions();
    web.getCookieManager().setCookiesEnabled(true);
    options.setJavaScriptEnabled(true);
    options.setPrintContentOnFailingStatusCode(false);
    options.setCssEnabled(false);
    options.setThrowExceptionOnFailingStatusCode(false);
    options.setThrowExceptionOnScriptError(false);
    options.setRedirectEnabled(true);
    try {
        final HtmlPage firstPage = (HtmlPage)web.getPage(loginUrl);
        final HtmlForm form = firstPage.getForms().get(0);
        final HtmlTextInput userNameField = form.getInputByName("USER");
        userNameField.setValueAttribute("MY_USERNAME");
        final HtmlPasswordInput passWordField = form.getInputByName("PASSWORD");
        passWordField.setValueAttribute("MY_PASSWORD");
        HtmlButton button =(HtmlButton)firstPage.getElementById("safeLoginbtn");
        System.out.println(firstPage.getUrl().toString());
        button.click();
        System.out.println(web.getEnclosedPage().getUrl().toString());
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

在main方法中运行时,两个打印语句分别显示两个不同的页面,即登录页面和登录后面的页面。但是当在服务器上运行时,两个打印语句具有几乎相同的URL,并且两者都是登录页面的URL。为什么会发生这种情况?与在服务器上运行相比,为什么主要方法中的代码行为不同?

服务器正在由Spring框架运行,如果它与它有任何关系。

编辑: 示例:

    WebClient webClient = new WebClient();
    HtmlPage page1 = webClient.getPage("http://www.facebook.com");
    HtmlForm form = page1.getForms().get(0);
    HtmlSubmitInput button = (HtmlSubmitInput) form.getInputsByValue("Log In").get(0);
    HtmlTextInput textField = form.getInputByName("email");
    textField.setValueAttribute("email@email.com");
    HtmlPasswordInput textField2 = form.getInputByName("pass");
    textField2.setValueAttribute("MY_PASS");
    HtmlPage page2 = button.click();
    System.out.println(page2.asText());

这适用于java应用程序的主要方法,但是当通过Spring的预定注释在服务器上运行时,它不会让我登录。

1 个答案:

答案 0 :(得分:0)

可能会有重定向。也许你可以做到以下几点:

HtmlPage pageAfterLogin = button.fireEvent("onclick").getNewPage();
System.out.println(pageAfterLogin.getUrl().toString());