HTMLUnit в Java - Как перейти к страницам GridView

Я пытаюсь создать приложение, используя Java, который будет читать информацию с веб-страницы. Чтобы загрузить информацию из элементов, которые я хочу, я использовал jsoup (отличный инструмент!), Но я хочу загрузить следующую страницу GridView, используемого на веб-странице. Страница является страницей.aspx, а ссылка на 2-й странице выглядит так:

 <a href="javascript:__doPostBack('GridView1','Page$2')" style="color:White;">2</a>

Ниже используется функция javascript:

    //<![CDATA[
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>

В настоящее время я пытаюсь сделать это с помощью HTMLUnit, но, похоже, не работает. Ниже приведен код, который я использую:

 final WebClient webClient = new WebClient(BrowserVersion.CHROME);
            HtmlPage page = webClient.getPage("http://www.webpage.com/Main.aspx");          
            HtmlAnchor anchor = null;
            List<HtmlAnchor> anchors = page.getAnchors();
            for (int j = 0; j < anchors.size(); j++)
            {
                anchor = anchors.get(j);
                String sAnchor = anchor.asText();               
                String sAnchorxml = anchor.asXml();         
                if (sAnchor.equals("2"))
                {
                    HtmlPage page2 = anchor.click();
                    doc = Jsoup.parse(page2.asXml());
                    .....

Когда я читаю страницу, используя тот же код, что и 1-ю страницу, я получаю следующую ошибку:

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at test.advacus.com.MainProgram.main(MainProgram.java:148)

Я предполагаю, что моя ошибка в 'Jsoup.parse()' линия. Просто чтобы уточнить, что когда вы нажимаете на следующую страницу, URL-адрес не меняется, только информация в GridView, поэтому я не могу разобрать, используя новый URL-адрес.

Любая дополнительная помощь или любой предложенный инструмент вместо HTMLUnit, который будет лучше взаимодействовать с jsoup, действительно поможет! Заранее спасибо!

Отредактировано для дополнительной информации: выглядит как click() это не работает... Я изменил код, и тело newPage выглядит так, как будто оно содержит ту же информацию, что и 1-я страница:

final WebClient webClient = new WebClient(BrowserVersion.CHROME);       
HtmlPage page = webClient.getPage("http://www.qatarsale.com/EnMain.aspx");                  
HtmlAnchor anchor = page.getAnchorByText("2");              
HtmlPage newPage = anchor.click();      
HtmlElement el = newPage.getBody();
System.out.println(el.asText());

1 ответ

Решение

Осмотр якорей - как вы уже указали - doPostBack вызывается, поэтому гораздо проще вызвать вызов javascript вместо того, чтобы сначала захватить якоря и вызвать щелчок по нему.

Пример кода

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF);
final WebClient webClient = new WebClient(BrowserVersion.CHROME);

webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
webClient.getOptions().setTimeout(10000);

try {
    HtmlPage htmlPage = webClient.getPage("http://qatarsale.com/EnMain.aspx");

    Document doc = Jsoup.parse(htmlPage.asXml());

    System.out.println(doc.select("[id$=Label10]").text());

    ScriptResult result = htmlPage.executeJavaScript("__doPostBack('GridView1','Page$2')");
    htmlPage = (HtmlPage)result.getNewPage();

    Thread.sleep(3000); // delay needed for lazy loading, there might be something cleaner

    doc = Jsoup.parse(((HtmlPage)htmlPage).asXml());

    System.out.println(doc.select("[id$=Label10]").text());

} catch (Exception e) {
    e.printStackTrace();
} finally {
    webClient.close();
}

Выход

Toyota Porsche Mercedes-Benz Cadillac Jeep Porsche Porsche Nissan Mitsubishi BMW Porsche Ford Mitsubishi Toyota Nissan Land Rover Nissan Mercedes-Benz Nissan Nissan Toyota Toyota Porsche Mitsubishi Mitsubishi Nissan Nissan Mercedes-Benz Nissan Jeep Mercedes-Benz Lexus BMW Lexus
BMW Lexus Toyota Toyota Lexus Nissan Mercedes-Benz Mercedes-Benz Ferrari Dodge BMW Mercedes-Benz Aston Martin Mitsubishi Suzuki Maserati Porsche Maserati Land Rover Chevrolet Land Rover GMC Toyota Porsche Lexus Land Rover GMC Mercedes-Benz Toyota Lexus Toyota Lexus Toyota Nissan
Другие вопросы по тегам